很多人认为,构建自己的聊天机器人(或助手)并不复杂。各种聊天机器人平台正在使用分类模型来识别用户意图。显然,在现有平台上构建聊天机器人时,会得到强有力的提升。为什么不自己使用类似的模型,构建一个独属于你的聊天机器人呢?构建时我们可能力遇到以下挑战:
1、对用户输入进行分类以识别意图(使用机器学习可以解决,利用带有TensorFlow后端的Keras)
2、保持背景。这部分的工作主要是编程,没有机器学习的相关内容。我们使用的是Node.js后端逻辑来跟踪对话上下文(在上下文中,通常不需要对用户意图进行分类-用户输入被视为chatbot问题的答案)
使用了Python库列表实现的程序功能,Keras深度学习用于构建分类模型。Keras在TensorFlow后端上运行训练。Lancaster词干库用于不同的单词形式:
要学习的Chatbot意图和模式在普通的JSON文件中定义,没有必要使用庞大的词汇量,我们的目标是为特定域构建聊天机器人。也可以用小词汇创建分类模型,它将能够识别为训练提供的一组模式。
在我们开始分类模型训练之前,需要先建立词汇量,处理模式以构建词汇表。每个单词都用于生成通用词根,这样做将有助于覆盖更多用户输入组合:
这是词汇创作的输出,有9个类和82个词汇单词:
训练不会基于单词的词汇运行,因为单词对机器没有意义。我们需要将单词翻译成包含0/1的数组的单词。数组长度等于词汇量大小,当来自当前模式的单词位于给定位置时,将设置1:
训练数据X(模式转换为数组[0,1,0,1,...,0])Y(意图转换为数组[1,0,0,...,0],会有单个1用于意图数组)。该模型使用基于三层的Keras构建。实验结果表明,三层提供了良好的结果(但这一切都取决于训练数据)。分类输出将是多类数组,这将有助于识别编码的意图。使用softmax激活生成多类分类输出(结果返回0/1的数组:[1,0,o,...,0]此集标识编码的意图):
使用SGD优化器编译Keras模型:
拟合模型-执行训练并构建分类模型,在批量大小为5的200次迭代中执行训练:
该模型已建成,现在可以定义两个辅助函数,函数有助于将用户句子翻译成数组0/1
的单词:
看看这个例子,将句子翻译成一个单词:
当函数从chatbot词汇表中的句子中找到一个单词时,它将1设置为数组中的相应位置。该数组将被发送以由模型分类从而识别它所属的意图:
将训练好的模型保存到pickle文件中是一个很不错的做法,以便能够重用它来通过Flask REST API进行发布:
在通过Flask REST API发布模型之前,总是可以运行额外的测试,使用model.predict函数对用户输入进行分类,并根据计算的概率,返回意图(可以返回多个意图):
句子分类的例子:
classy_local('Fetch blood result for patient')
意图正确计算:
要通过REST端点发布相同的功能,可以将其包装到Flask API中:
已经解释了如何实现分类部分。在帖子开头引用的GitHub repo中,您将找到如何维护上下文的完整示例。上下文由用JavaScript编写并在Node.js后端运行的逻辑维护。必须在意图列表中定义上下文流,一旦意图被分类并且后端逻辑找到上下文的开始 - 我们进入循环并询问相关问题。高级上下文处理的全部内容取决于后端实现(这超出了现阶段机器学习的范围)。
Chatbot用户界面:
长按二维码 ▲
订阅「架构师小秘圈」公众号
如有启发,帮我点个在看,谢谢↓