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可序列化的
答案 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的新名称)
在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