我的需求需要尽量跳过rasa的实体识别,用其它预训练模型进行命名实体识别,因为rasa只能挑选指定的几个模型进行实体识别,最好用的也就是Bert,rasa也兼容了,但还是少些自由度的。
一、源代码形式修改RASA表单的词槽和槽值
基本思路是,外部模型抽取到结果后放入rasa的表单,去填词槽slots,因此需要篡改源代码,直接说重点,表单核心在:
rasa.core.processor.py文件下的parse_data变量
可用通过操控parse_data的内部值来操控表单
位置如下:
这个函数的作用可以看rasa官方文档:
每一轮对话如果想获取用户的输入原句,以便输入外部模型,第二个红框可以实现
if下面的语句不会触发,self.http_interpreter一直是None值,只会触发else下面的语句,因此我们可以通过
print("33333333333333333333" + str(parse_data))
在运行rasa shell进行对话时,就可以看见parse_data作用了,记录了实体,意图,执行度,基本是全部的表单核心信息了。
如,要替换地址(address)槽中的的实体代码如下:
执行效果如下,可以看见,用户原句的item为苹果手机,address是北京市朝阳区大胡同街道,在parse_data的对应位置是红线画出的位置,在机器人回复时,它们被成功替换掉了,(item是我在actions中替换的不必在意,因为在这里同样的代码改一改也能替换item槽)
二、源代码形式修改意图intent
一般表单前都会接一个意图
要强行修改意图,或是对rasa识别后的意图做一些修改可以使用下面的方式,代码重点在_parse_message_with_graph函数中(还是在processor.py):
如注释一样,核心内容(用户意图,词槽和词槽值)在results["run_RegexMessageHandler"][0].data,可以在下图看到意图在"intent"中,因此替换方式为
results["run_RegexMessageHandler"][0].data["intent"]["name"] = "想要替换的意图名"
注意!!此处替换会直接导致后续的action触发的不同
三、补充:如何在命令行运行的情况下进行debug rasa程序?
需要确定你的环境中的rasa位置,确定你的项目位置
开始新建debug
按照上图进行配置后,点击保存,在点击debug即可,相当于在命令行执行了rasa shell
如果需要 rasa shell --debug 或 rasa run --cors "*"
将shell 替换为 shell --debug 或 run --cors "*" 即可