我正在创建一个有趣的聊天机器人,想实现一些收集用户姓名的功能,但前提是他必须说一些类似于 "我的名字是..." 或接近于此;给出名字的意图会来自用户,机器人不会要求用户说出名字,也许只会建议用户说出名字。我想,有点像在谷歌助手中。所以,它可以在用户想要的任何时候给出。我的想法是
第一 创建一个意图,用不同的方式让用户告诉机器人他的名字(就像上面的例子)。
第二 使用插槽,如果检测到意图,就把它保存为一个变量。到目前为止,我已经成功了。
第三次 是我被卡住的部分,因为这只是一个想法,我不知道该怎么做。在将整个文本保存为一个变量之前,我想删除意图中包含的部分(我的名字是),并只将其余部分保存在变量中。所以,比如说,用户说 "我叫XXX";该命令将删除 "我的名字是" 部分,只保存 "XXX" 在 名字 意图。
我不知道这样做是否可行,因为我不懂编码。我之前用过一些特殊的语法,比如把其他变量的第一个字母大写,但我真的不知道如何使用JSON编辑器。
我的想法可行吗?我不知道如何删除意图对应的部分,只保存剩余部分作为意图。不知道会是什么命令,也不知道我会写在哪里。如果你有想法可以提出其他建议。最后,我是用葡萄牙语创建的技能,所以无法访问@sys-person实体。感谢阅读。
我使用葡萄牙语技能,面临同样的问题。我看到两个解决方案,虽然他们并不完美。
使用意图。
当识别出意图时,机器人会再次询问名字,告诉用户他应该只说他的名字,比如不说 "我的名字是",然后将整个输入存储在一个上下文变量上,使用... ..:
<? input.text ?>
如果要在槽内嵌入这样的逻辑,你可能需要使用digressions。
但是,这对用户来说很无聊。
使用实体。
实体的识别会带着它们在输入文本中的起始和结束位置,但不会带着意图。有了这一点,就可以对输入进行切割,切割实体。
<? input.text.substring(entities.name.location[1], input.text.length()) ?>
实体可以是 "我的名字是", "人们叫我", "我叫", "我受洗", "我受洗".
所以,"你好,我的名字是Gustavo",会在 "我的名字是 "结尾后被剪掉,结果是 "Gustavo"。前面的附加输入会被忽略,但是名字后面的附加输入就会出现问题。另外,你需要定义更多的 "我的名字是 "这样的实体,可能是所有的可能性,而不是使用意图,因为即使是模糊匹配,实体识别也不会考虑到同义词和类似意义的词。
https:/cloud.ibm.comdocsassistant?topic=assistant-dialog-methods#dialog-methods-strings-substring。