今天和大家一起来手撕一个自动问答系统,其实也就是类似我们常说的聊天机器人
初识自动问答系统
关键点
- 句意理解
系统接收到一句话,需要先通过语法分析,语义分析等来理解该句子,这样才能更好的给出回答 - 文本信息摘取
系统需要有自己的语料库、知识库或者相关内容,并从中抽取出相应的回答。 - 知识推理
这个是更高一层的要求,系统应该可以通过上下文,或者接收到的句子的语义,通过知识推理的手段获取到知识库中不存在的答案。
可用技术栈
基于以上几点,可用基于现有的一些算法来训练自己的模型,当然也可用通过开源的框架来搭建,下面我们就先来实践下基于开源框架的实现。
基于 ChatterBot 实现
ChatterBot 是一个功能强大的,基于 Python 的聊天机器人框架,其 GitHub 地址为:https://github.com/gunthercox/ChatterBot/tree/master
官方文档为:https://chatterbot.readthedocs.io,有兴趣的小伙伴可以自行研究。这里我们给出简单的实战过程。
1. 获取语料
中文聊天语料这一块,我选择了网上大神整理的资料,选取其中一部分,小黄鸡语料
https://github.com/codemayq/chinese_chatbot_corpus
2. 使用 Google Colab 训练
Google Colab 是个好东西,我们一定要充分的利用起来。(还不熟悉的可以查看我以前写的一篇文章)
- 上传处理好的小黄鸡语料到 Colab 上
- 在 Colab 上安装 ChatterBot
!pip install chatterbot !pip install chatterbot-corpus
- 创建一个 Chat Bot
from chatterbot import ChatBot from chatterbot.trainers import ListTrainer chatbot = ChatBot("my chat") trainer = ListTrainer(chatbot)
- 载入语料
with open('xiaohuangji.tsv', encoding='utf-8') as f: data = f.read().replace('\t', '\n') print(data[:100])
- 训练
trainer.train(data)
最后,等待训练完成之后,我们再把生成的 db.sqlite3 文件下载到本地。
- 部署成服务
在自己的云主机中,或者自己的本地电脑上安装 ChatterBot,如果安装失败,可以选择使用 anaconda 来安装。
先简单的做个实验,看看聊天效果怎么样
from chatterbot import ChatBot bt = ChatBot( 'my-chat', database_uri='sqlite:///db.sqlite3' ) print('Type something to begin...') while True: try: user_input = input() bot_response = bot.get_response(user_input) print(bot_response) # Press ctrl-c or ctrl-d on the keyboard to exit except (KeyboardInterrupt, EOFError, SystemExit): break
来看下聊天效果:
个人感觉,效果还行吧,关键是 ChatterBot 是能够从每次的聊天中自动学习,也就是聊天记录越多,这个机器人也就越“精”,是不是很惊喜!
部署成 API
使用轻量级的 flask 来开发 API,简单的代码如下:
from flask import Flask, render_template, request, jsonify from chatterbot import ChatBot app = Flask(__name__) bot = ChatBot( 'my-chat', database_uri='sqlite:///db.sqlite3' ) @app.route("/") def home(): return render_template("index.html") @app.route("/get") def get_bot_response(): userText = request.args.get('msg') return str(bot.get_response(userText)) @app.route("/api/chat/<text>") def get_bot_api(text): res = str(bot.get_response(text)) return jsonify(res), 200 if __name__ == "__main__": app.run(host='0.0.0.0', port=8889)
最后看下效果,
页面版:
页面版风格借鉴了 ChatterBot 官方的代码,有兴趣的同学也可以借鉴下 Django 的实现。
API 版:
好了,今天的分享就到这里喽~
我们下次再尝试下自己手写一个基于 Seq2Seq 算法的聊天机器人!