TypeError: Object of type 'Entities' is not JSON serializable IBM Cloud natural language understanding

TypeError: Object of type 'Entities' is not JSON serializable IBM Cloud natural language understanding

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: Object of type 'Entities' is not JSON serializable

一切都取决于您在文本参数中插入的内容。你们使用相同的文字吗?

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

因此,这是将 NLU 服务与 Python 一起使用的分步说明。

IBM CloudIBM Bluemix 的新名称)

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

在你的电脑上,安装Python后,尝试运行CMD/Terminal中的命令:

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时的return是:

{
  "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
    }
  ]
}

从 IBM developer works 获得解决方案 here is the link

只是替换

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

与 :

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

我通过转储 response.result 而不是 response.

解决了这个问题

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

查看 docstring in the source code 时,我发现 DetailedResponse 类型包含 'result, headers and HTTP status code'。

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