Pulkit Kedia
Pulkit Kedia

Reputation: 83

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))

I am new to IBM watson API .....i was trying this sample code provided by them by I was getting this error

TypeError: Object of type 'Entities' is not JSON serializable

Upvotes: 1

Views: 2716

Answers (3)

Joshua Klahn
Joshua Klahn

Reputation: 31

I fixed this issues by dumping response.result instead of just response.

The API guide wrongly says to use: print(json.dumps(response, indent=2))

When reviewing the docstring in the source code I found the DetailedResponsetype contains 'result, headers and HTTP status code'.

I think the example in the API documentation needs to be updated so it doesn't mislead people.

Upvotes: 3

Sayuri Mizuguchi
Sayuri Mizuguchi

Reputation: 5330

All depends on what you insert in your text parameter. Do you use the same text?

I used the example from the API reference with the same phrase for this answer... but, JSON knows only how to handle Unicode strings, not byte sequences. Either transform into Unicode (json.dumps(response.decode("utf-8"), indent=2)), or if is one integer array (json.dumps(list(response))). You also can try print(json.dumps(list(response.values()))).

So, this is one step-by-step for using the NLU service with Python.

IBM Cloud (New name for IBM Bluemix)

  • Create one account (Now, you can create without a credit card and use the LITE plan for Watson and other Services!)
  • Catalog -> Watson -> Natural Language Understanding service -> Create -> Service Credentials

In your PC, after installed Python, try to run the command in the CMD/Terminal:

pip install --upgrade watson-developer-cloud

Using the same code provided from the 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))

And the return when I run the command python NLUAnalyze.py in CMD is:

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

Upvotes: 1

Pulkit Kedia
Pulkit Kedia

Reputation: 83

Got the solution from the IBM developer works here is the link

just replace

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
                                ))

this is due to the changes done in v 1 python sdk Here is the link showing the changes made in v 1 python sdk

Upvotes: 1

Related Questions