As I mentioned in my previous post, Watson Assistant has a system entity called @sys-name, which allows you to capture a persons name. One issue with this is that it is not available for every language.
In the original post I mention using entity extraction. You can still do this, but the cloud functions feature makes this so much easier.
The instructions for doing this are very well documented, so I intentionally skip over bits. Please use this as a reference.
First I created a Cloud function Action with the following code:
import sys
from watson_developer_cloud import NaturalLanguageUnderstandingV1
from watson_developer_cloud.natural_language_understanding_v1 import Features, EntitiesOptions, KeywordsOptions
nlu = NaturalLanguageUnderstandingV1(
version='2017-02-27',
url='https://gateway-fra.watsonplatform.net/natural-language-understanding/api',
username='USERNAME',
password='PASSWORD')
def main(dict):
rsp = nlu.analyze(text=dict['input'], features=Features(entities=EntitiesOptions()))
username = ''
company = ''
for entity in rsp['entities']:
if entity['type'] == 'Person':
username = entity['text']
elif entity['type'] == 'Company':
company = entity['text']
response = {
'name': username,
'company': company
}
return response
On the parameters page I set up two parameters “input” and “language“. The language tag is to allow to use different languages where @sys-person may not exist.
On the end point page, you need to copy the API key and break into name:password as per the instructions link. Keep a note of it.
Now in Watson Assistant create a node that triggers and the following json code. Replace username/password with one from cloud function. Alternatively use the proper credentials formatting.
{
"context": {
"mycreds": {
"user": "USERNAME",
"password": "PASSWORD"
},
"nlu_response": ""
},
"output": {
"text": {
"values": [],
"selection_policy": "sequential"
}
},
"actions": [
{
"name": "simon_test_area/nlu_lookup",
"type": "server",
"parameters": {
"input": "<? input.text ?>",
"language": "en"
},
"credentials": "$mycreds",
"result_variable": "$nlu_response"
}
]
}
This will execute the cloud function and return the name and company (if they exist). Have this node skip to a child node which will execute the response. For my sample I have:
Name: $nlu_response.name<br>Company: $nlu_response.company
This is what you get back.

Very simple and very powerful. Combine this with Watson Knowledge Studio and you can build intelligence for your domain.