小C的第一宇宙
wangc
Mar 15, 2018
阅读本文需要 6 分钟(按字数)

概述

上次试验完生成式的聊天机器人之后,接下来试一下检索式的,使用的是关注度较高的聊天机器人项目chatterbot进行构建。

  • 目标:qq聊天机器人(检索式;短对话;开放话题)
  • 语料:和女友的对话集(为了提供反应速度,只挑取1000句对话作为语料)
  • 技术:chatterbot库 MongoDB

Chatterbot简介

ChatterBot是一种基于机器学习的对话对话引擎,在Python中构建,它可以根据已知对话的集合生成响应。ChatterBot的语言独立设计使其能够接受任何语言的训练。

优点

  1. 训练语料可存放在多种介质上
  2. 训练结果可存放在多种介质上
  3. 应答匹配算法支持多种应答匹配算法:相似度匹配、数学估值算法等
  4. 可训练支持任何语言的聊天机器人

缺点

  1. 性能较低:收到聊天请求时,其需要遍历所有语料以找到相似度最高的语句,并提取对应的应答语句。因此,训练语料过多时(超过1万条),应答时延可能已无法让人接受。
  2. 场景有限:其只能应用到一些情况简单、场景单一的环境。由于性能较低,因此,无法使用过多的语料对ChatterBot进行训练,这也必然限制了应用场景。

数据处理

因为Chatterbot需要遍历检索整个语料集找到答案,大量的数据会使响应速度非常慢,这里仅选取1000句对话作为语料。

选取的过程先用程序做一般性的筛选(如剔除长句,没有文字句子的问答),因为数据量并不大,接着手动筛选1000句作为语料。(直接保存为列表变量corpus)

得到的数据集索然很少,但因为通过了人工的挑选,数据集质量是很高的,问答关系也很清楚。

模型构建与训练

模型构建与训练的代码非常简单,只用三个函数。参数设置中使用MongoDB作为存储适配器,提高训练效率,其他参照项目示例。

from chatterbot import ChatBot

# Create a new ChatBot instance
bot = ChatBot(
    'Terminal',
    storage_adapter='chatterbot.storage.MongoDatabaseAdapter',
    logic_adapters=[
        'chatterbot.logic.BestMatch'
    ],
    filters=[
        'chatterbot.filters.RepetitiveResponseFilter'
    ],
    input_adapter='chatterbot.input.TerminalAdapter',
    output_adapter='chatterbot.output.TerminalAdapter',
    database='chatterbot-database'
)
chatbot.set_trainer(ChatterBotCorpusTrainer)

chatbot.train(corpus)

最终结果展示

理想的方式是聊天机器人可以获取qq消息,输出的对话可以从qq对话框发出,不过qq对话框是很难获取接口的,这里我手动把消息一条条输入机器人,把机器人的回复在发出到qq上。

while True:  
    print("AI么小:", chatbot.get_response(input("> ")))  

image

image

这是十几句对话,效果还是不错的。本身想看看女朋友什么时候才会发现异常,后来她几秒钟连发了5个qq表情,我便放弃了(手速跟不上),告知其真相。预计如果进行顺利的话,这个检索式的机器人连着对话二十句也没有问题,已经很满意了。

总结

qq聊天机器人就先告一段落了,再往后进行的话,对于Chatterbot构建的聊天机器人应该要提高相应速度,并且数据集也得几万才行。这就比较麻烦了,比如缩短搜索和相似度匹配的时间:可以一开始对语料进行更深度的处理,比如分词;然后优化查找的算法等等。

  • 关于生成式与检索式:就这两次试验来说,检索式的聊天机器人比生成式的机器人效果要好很多,也更容易实现。但对比检索式的机器人,生成式机器人的回答是训练的语料中没有的,完全由机器人学习大量问答,并且将这些问答拆分成字词最终揉合在一起,创造出新的句子,这在一定程度上才是智能的表现。

  • 目前来说:目前来说检索式聊天机器人才是主流(比如qq小冰)。检索式连天机器人使用一组预先定义的“回答集”和某种启发方式,根据上下文和输入,在“回答集”中找到合适的答案。更复杂的启发方式,比如使用机器学习分类器,可以对输入的语句进行理解,可以把意思相近的句子做出相同的理解。

  • 未来展望:生成式聊天机器人才是智能聊天机器人的未来,一个真正智能的生成式聊天机器人应该不仅仅是套路性的回答,还应该会对你的问题提出一些建设性的意见,进行一些有意义的交流。不过路还很远,因为语言作为思维的载体本身就是人类文明最复杂的东西之一,如果真是单单使用大量的数据训练就可以得到的话,那还得了。把历史上所有的科学书籍让机器人学习训练,难道机器人就能预测出下一个革命性的科学发现吗?不过谁知道呢,希望近10年可以看到真正像人一样的聊天机器人。