一、ChatterBot工作原理
Chatbot Engine的技术框架采用了开源项目ChatterBot (https://github.com/gunthercox/ChatterBot)。
ChatterBot是一个python库,利用它可以轻松的创建对话软件。
一个未经训练的ChatterBot实例开始不知道如何沟通,每次用户输入一个语句,ChatterBot就会保存这个语句以及它对应的问句。随着它接受更多的输入,它可以回应的语句数量会增加,每个输入和回应的对应关系准确性也会提高。程序通过搜索与输入语句最相似匹配的语句,来选择最相似的回应,然后基于人们对机器人回应语句的频次,返回最可能的回应。
下图展示了ChatterBot的工作流图:
总体上分为3个层次,输入层,逻辑处理层,输出层。各层都可以扩展自定义的模式。
· 输入层
从一些来源获得输入(如:终端控制台,API接口,语音识别输入等),然后将其转换成ChatterBot可以理解的格式。 目前支持VariableInputTypeAdapter,TerminalAdapter,HipChat等输入适配器。 可以定义自己的输入适配器,通过继承InputAdapter基类,重写process_input方法并返回指定对象Statement就可以实现。
逻辑处理层
逻辑处理层包含了一些逻辑适配器,ChatterBot通过这些逻辑选择一个给定输入语句的回应。 目前支持ClosestMatchAdapter,ClosestMeaningAdapter,ApproximateSentenceMatchAdapter,TimeLogicAdapter,MathematicalEvaluation等逻辑适配器。 ClosestMatchAdapter采用Levenshtein Distance来计算文本相似度。 ClosestMeaningAdapter基于由两个句子形成的字矩阵中每个单词的同义词集的接近程度。 TimeLogicAdapter用来回答关于当前时间的问句。 MathematicalEvaluation用来回答一些数学计算问题。 可以同时使用多个逻辑适配器来处理,机器人将返回最高计算置信度值的回应;如果多个适配器返回相同的置信度,那么选择适配器列表中第一个适配器。 同样,也可以定义自己的逻辑适配器,通过继承LogicAdapter基类,重写相关方法返回指定的值就可以实现。
输出层
返回输入语句的回应,支持多种输出源,如OutputFormatAdapter,TerminalAdapter,HipChat,Mailgun。 可以定义自己的输出适配器,通过继承OutputAdapter基类,重写process_response方法并返回指定对象Statement就可以实现。
以上3层分别对应了Chatterbot的3种适配器类型,输入适配器、逻辑适配器和输出适配器,另外,还有一种类型是存储适配器,存储适配器用来存储所有的对话及问答关系,以供逻辑适配器使用。
存储适配器也是可扩展的,目前支持JsonFileStorageAdapter,MongoDatabaseAdapter,TwitterAdapter,同样也可以自定义存储适配器。
二、ChatterBot使用
ChatterBot可以下载源码编译安装,也可以直接使用pip工具安装。
本例使用pip安装,如下
pip install chatterbot
下面通过一个简单例子说明如何使用:
from chatterbot import ChatBot
# 创建ChatBot实例
bot = ChatBot("Terminal",##bot名字
storage_adapter="chatterbot.adapters.storage.JsonFileStorageAdapter",##使用json文件存储数据