【问题标题】:AtrributeError: Dict has no object class_nameAtrributeError: Dict 没有对象 class_name
【发布时间】:2017-10-05 13:52:20
【问题描述】:

我试图解析一个网站,对其进行标记并将不同的句子存储在一个数组中,所以这变成了一个字符串数组。我需要访问从 json 返回的类。例如,我必须上课:讨厌和讨厌。如果班级是仇恨并且该班级的信心> 0.50,那么做点什么。但是我无法访问这些课程。

words = text.split(".")
c=0
for i in words:

  if not words[c]:
      words[c] = "this was empty before." 
  classes = natural_language_classifier.classify('90e7b4x199-nlc-36073',words[c])
  result = json.dumps(classes, indent=2)
  if (classes.class_name == 'hate' and classes.confidence > 0.50):
    print(json.dumps(classes, indent=2)) 
  c=c+1

我得到的错误是:

Traceback (most recent call last):                        
File "parse.py", line 45, in <module>                        
if (classes.class_name == 'hate' and classes.confidence > 0.50) 
AttributeError: 'dict' object has no attribute 'class_name'

已编辑:我得到的json是这样的:

{
  "classifier_id": "10D41B-nlc-1",
  "url": "https://gateway.watsonplatform.net/natural-language-classifier    /api/v1/classifiers/10D41B-nlc-1/classify?text=How%20hot%20wil/10D41B-nlc-1",
  "text": "How hot will it be today?",
  "top_class": "nhate",
  "classes": [
    {
      "class_name": "nhate",
      "confidence": 0.9998201258549781
    },
    {
      "class_name": "hate",
      "confidence": 0.00017987414502176904
    }
  ]
}

已编辑

print(classes) 给我:

    {u'url': u'https://gateway.watsonplatform.net/natural-language-classifier/api/v1
    /classifiers/90e7b4x199-nlc-36073', 
    u'text': u' A Partnership With Abu Shaklak Printing House', 
    u'classes': 
    [{u'class_name': u'nhate.', u'confidence': 0.9398546
    187612434}, {u'class_name': u'hate.', u'confidence':   0.0449277873541271}, {u'cla
    ss_name': u'Feels good man', u'confidence': 0.015217593884629425}],     u'classifier
    _id': u'90e7b4x199-nlc-36073', u'top_class': u'nhate.'}

【问题讨论】:

  • 这意味着 dict 类没有任何名为 class_name 的键。尝试打印(类)并查看确切名称
  • 既然错误说是dict对象;您应该尝试像classes[class_name] 一样访问它
  • @Exprator 在 json 中有一个名为“class_name”的键。
  • ok 然后使用 dict['key_name']
  • @stovfl print(classes['classes']) 给出以下结果:[{u'class_name': u'nhate.', u'confidence': 0.9525668254559034}, {u'class_name': u'hate.', u'confidence': 0.0389566476309232}, {u'class_name': u'Feels good man' u'confidence': 0.008476526913173313}]

标签: python nlp ibm-cloud classification ibm-watson


【解决方案1】:

你也许可以这样做:

import json

# For demonstration purposes, use the data from the question rather than calling the api:

# data = natural_language_classifier.classify('90e7b4x199-nlc-36073',words[c])

data = json.loads("""{
  "classifier_id": "10D41B-nlc-1",
  "url": "https://gateway.watsonplatform.net/natural-language-classifier    /api/v1/classifiers/10D41B-nlc-1/classify?text=How%20hot%20wil/10D41B-nlc-1",
  "text": "How hot will it be today?",
  "top_class": "nhate",
  "classes": [
    {
      "class_name": "nhate",
      "confidence": 0.9998201258549781
    },
    {
      "class_name": "hate",
      "confidence": 0.00017987414502176904
    }
  ]
}""")

def hate_gt(data, confidence):
  if 'classes' in data:
    for cls in data['classes']:
      if cls['class_name'] == 'hate' and cls['confidence'] > confidence:
          return True
  return False

print(hate_gt(data, 0.00001))  # True
print(hate_gt(data, 0.5))      # False

在这里试试:https://repl.it/Hl9b/1

我不确定这个 API 合约是什么样的,所以我不想做出任何假设,即“仇恨”将始终是数组中的第二项。

还请注意,我将 classes 变量名称更改为 data,因为 classes['classes'] 令人困惑。

【讨论】:

    【解决方案2】:

    改成

    json_result = natural_language_classifier.classify('90e7b4x199-nlc-36073',words[c])
    classes =  json_result['classes']
    if (classes[1]['class_name'] == "hate" ...
    

    【讨论】:

      猜你喜欢
      • 2017-03-30
      • 2012-01-12
      • 2021-03-08
      • 2017-05-12
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      相关资源
      最近更新 更多