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.