TypeError:“实体”类型的对象不是JSON可序列化的IBM Cloud自然语言理解

时间:2017-11-16 17:28:08

标签: python ibm-cloud ibm-watson watson-nlu

import json
from watson_developer_cloud import NaturalLanguageUnderstandingV1
import watson_developer_cloud.natural_language_understanding.features.v1 \
as Features

natural_language_understanding = NaturalLanguageUnderstandingV1(
username="username",
password="password",
version="2017-02-27")

response = natural_language_understanding.analyze(
text="IBM is an American multinational technology company headquartered \
in Armonk, New York, United States, with operations in over 170 \
countries.",
features=[
Features.Entities(
  emotion=True,
  sentiment=True,
  limit=2
),
Features.Keywords(
  emotion=True,
  sentiment=True,
  limit=2
)
 ]
 )

print(json.dumps(response, indent=2))

我是IBM watson API的新手......我正在尝试这个由他们提供的示例代码我遇到了这个错误

  

TypeError:“实体”类型的对象不是JSON可序列化的

3 个答案:

答案 0 :(得分:2)

我通过转储response.result而不仅仅是response来解决此问题。

API guide错误地说要使用:print(json.dumps(response, indent=2))

查看docstring in the source code时,我发现DetailedResponse类型包含“结果,标头和HTTP状态代码”。

我认为API文档中的示例需要更新,以免误导人们。

答案 1 :(得分:1)

全部取决于您在text参数中插入的内容。你使用相同的文字吗?

我使用了API参考中的示例,并为此答案使用了相同的短语...但是,JSON只知道如何处理Unicode字符串,而不是字节序列。要么转换为Unicode (json.dumps(response.decode("utf-8"), indent=2)),要么转换为一个整数数组(json.dumps(list(response)))。您也可以尝试print(json.dumps(list(response.values())))

因此,这是使用Python的NLU服务的一步一步。

IBM Cloud IBM Bluemix的新名称

  • 创建一个account(现在,您可以在没有信用卡的情况下创建并使用WITE和其他服务的LITE计划!)
  • 目录 - >沃森 - >自然语言理解服务 - >创建 - >服务凭证

在PC中,安装完Python后,尝试在CMD /终端中运行命令:

pip install --upgrade watson-developer-cloud

使用API reference提供的相同代码:

import json
from watson_developer_cloud import NaturalLanguageUnderstandingV1
import watson_developer_cloud.natural_language_understanding.features.v1 \
  as Features

natural_language_understanding = NaturalLanguageUnderstandingV1(
  username="username from the NLU -> Service Credentials",
  password="passoword from the NLU -> Service Credentials",
  version="2017-02-27")

response = natural_language_understanding.analyze(
  text="IBM is an American multinational technology company headquartered \
    in Armonk, New York, United States, with operations in over 170 \
    countries.",
  features=[
    Features.Entities(
      emotion=True,
      sentiment=True,
      limit=2
    ),
    Features.Keywords(
      emotion=True,
      sentiment=True,
      limit=2
    )
  ]
)

print(json.dumps(response, indent=2))

我在CMD中运行命令python NLUAnalyze.py时的返回是:

{
  "usage": {
    "text_units": 1,
    "text_characters": 148,
    "features": 2
  },
  "language": "en",
  "keywords": [
    {
      "text": "American multinational technology",
      "sentiment": {
        "score": 0.0,
        "label": "neutral"
      },
      "relevance": 0.993518,
      "emotion": {
        "sadness": 0.085259,
        "joy": 0.026169,
        "fear": 0.02454,
        "disgust": 0.088711,
        "anger": 0.033078
      }
    },
    {
      "text": "New York",
      "sentiment": {
        "score": 0.0,
        "label": "neutral"
      },
      "relevance": 0.613816,
      "emotion": {
        "sadness": 0.166741,
        "joy": 0.228903,
        "fear": 0.057987,
        "disgust": 0.050965,
        "anger": 0.054653
      }
    }
  ],
  "entities": [
    {
      "type": "Company",
      "text": "IBM",
      "sentiment": {
        "score": 0.0,
        "label": "neutral"
      },
      "relevance": 0.33,
      "emotion": {
        "sadness": 0.085259,
        "joy": 0.026169,
        "fear": 0.02454,
        "disgust": 0.088711,
        "anger": 0.033078
      },
      "disambiguation": {
        "subtype": [
          "SoftwareLicense",
          "OperatingSystemDeveloper",
          "ProcessorManufacturer",
          "SoftwareDeveloper",
          "CompanyFounder",
          "ProgrammingLanguageDesigner",
          "ProgrammingLanguageDeveloper"
        ],
        "name": "IBM",
        "dbpedia_resource": "http://dbpedia.org/resource/IBM"
      },
      "count": 1
    }
  ]
}

答案 2 :(得分:1)

获得IBM开发人员的解决方案 here is the link

只需替换

features=[
   Features.Entities(
          emotion=True,
          sentiment=True,
           limit=2
    ),
   Features.Keywords(
           emotion=True,
           sentiment=True,
           limit=2
    )
]

with:

features=Features(entities=EntitiesOptions(
                      emotion=True, sentiment=True,limit=2), 
               keywords=KeywordsOptions(
                      emotion=True, sentiment=True,limit=2
                                ))

这是由于v 1 python sdk中所做的更改 Here is the link showing the changes made in v 1 python sdk