https://github.com/qhduan/Seq2Seq_Chatbot_QA
使用TensorFlow实现的Sequence to Sequence的聊天机器人模型
https://github.com/qhduan/Seq2Seq_Chatbot_QA
Last synced: 23 days ago
JSON representation
使用TensorFlow实现的Sequence to Sequence的聊天机器人模型
- Host: GitHub
- URL: https://github.com/qhduan/Seq2Seq_Chatbot_QA
- Owner: qhduan
- Archived: true
- Created: 2016-10-10T15:04:20.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2018-06-21T03:06:02.000Z (almost 7 years ago)
- Last Synced: 2024-10-31T00:40:10.475Z (6 months ago)
- Language: Python
- Size: 90.5 MB
- Stars: 793
- Watchers: 49
- Forks: 274
- Open Issues: 21
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 放在前头的“废话”
这个repo诞生比较早,那个时候tensorflow还没到1.0版本,
所以这个模型当时用的tf.contrib.seq2seq库,现在已经是tf.contrib.legacy_seq2seq了,
我想大家明白**legacy**的意思。这个repo的本身目的是学习与实现seq2seq的相关内容,
并不是一个完整的software,所以它除了学习和别人参考来说,就有各种各样的问题。有一些同学问我的一些问题,反而是一些常见的python编码问题,
还有一些是有些童鞋想在windows上调试整个模型,
这个我真的没用windows弄过,
鉴于这个repo的性质并不是一个完整软件,我也没有想过要做的太完美,很抱歉。在我看来,bot,特指会与人产生互动的bot,是人机协作(互动)的一部分。
而关于自然语言的bot,又是它的一个子集。而chatbot本身,又是这种bot的一种子集。以大家熟知的个人助理为例(siri,cortana,echo),
它包含了如dialogue system,各种qa system,当然也包含了chatbot。
而单看chatbot的实现,截止到今天,主要可实际落地的还是retrieval based的chatbot。不过seq2seq模型,作为一个关于deeplearning的前沿,依然不断地奋斗在NLG,QA,chatbot等领域。
关于seq2seq的实现有很多,我后来觉得这个repo实际上有点对不起大家的stars,
但是这个repo本身因为那个legacy_seq2seq的问题,确实也没什么好“更新”的了,因为更新就是重写。***一部分是为了自己学习吧,我就重写了另一个repo***(我是不是很表脸)
https://github.com/qhduan/just_another_seq2seq
这个repo主要是:
- 增加了使用上的各种测试例子(翻译,NER,chatbot-adversial)
- 各种中文注释与README(如果注释行数也算钱的话,这个里面注释可能比代码值钱)
- 各种简单的测试用例,代码发布经过pylint检查简单的来说如果有同学只是想抄个大作业的话,这个repo更有效……
我认为现在研究关于语言交互的bot有三个主要方面,
一方面人在主攻对话系统,我觉得微软的paper比较多,例如这篇 Xiujun Li, End-to-End Task-Completion Neural Dialogue Systems, 2017另一拨人主要在做QA,或者QA相关的集成,这部分亚马逊相关的比较多,alexa prize相关的很多文章
都有这样的感觉,
例如这篇 Huiting Liu, RubyStar: A Non-Task-Oriented Mixture Model Dialog System, 2017还有一拨人主要在做chatbot之类的,例如本repo和上面我提到我的repo相关的,例如这篇 Jiwei Li, Adversarial Learning for Neural Dialogue Generation, 2017
(诶?怎么感觉都是华裔?)
上面那三篇都是17年下半年的,现在才18年2月,其实每个方向现在都很前沿。
因为,本身一个QA的子课题,就已经是比较前沿的了,
把所有这些整合大系统的技术,应该主要握在大佬手里,这里重点指国外大佬手里,
国内我看不出哪个大佬有,大概都比较内敛,当然也是因为这方面研究***并不是很有用***。(单说能看到的国内的,很可能有错:图灵是一个数据不少的retrieval模型;
一个ai(世纪佳缘的)还有阿里的ruyi是一个简化后的dialogue system模型,
他们是“中国版”的api.ai)如果要对bot即相关技术有粗略了解的,推荐看看斯坦福正在写的这本
Speech and Language Processing 3rd
地址[这里](http://web.stanford.edu/~jurafsky/slp3/)
看第28~30章# 基于TensorFlow实现的闲聊机器人
GitHub上实际上有些实现,不过最出名的那个是torch实现的,DeepQA这个项目到是实现的不错,不过是针对英文的。
这个是用TensorFlow实现的sequence to sequence生成模型,代码参考的TensorFlow官方的
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/models/rnn/translate
这个项目,还有就是DeepQA
https://github.com/Conchylicultor/DeepQA
语料文件是db/dgk_shooter_min.conv,来自于 https://github.com/rustch3n/dgk_lost_conv
参考论文:
Sequence to Sequence Learning with Neural Networks
A Neural Conversational Model
# 依赖
python3 是的这份代码应该不兼容python2吧
numpy 科学运算
sklearn 科学运算
tqdm 进度条
tensorflow 深度学习
大概也就依赖这些,如果只是测试,装一个cpu版本的TensorFlow就行了,也很快。
如果要训练还是要用CUDA,否则肯定超级慢超级慢~~
# 本包的使用说明
本包大体上是用上面提到的官方的translate的demo改的,官方那个是英文到法文的翻译模型
下面的步骤看似很复杂……其实很简单
## 第一步
输入:首先从[这里](https://github.com/rustch3n/dgk_lost_conv)下载一份dgk_shooter_min.conv.zip
输出:然后解压出来dgk_shooter_min.conv文件
## 第二步
在***项目录下***执行decode_conv.py脚本
输入:python3 decode_conv.py
输出:会生成一个sqlite3格式的数据库文件在db/conversation.db
## 第三步
在***项目录下***执行data_utils.py脚本
输入:python3 data_utils.py
输出:会生成一个bucket_dbs目录,里面包含了多个sqlite3格式的数据库,这是将数据按照大小分到不同的buckets里面
例如问题ask的长度小于等于5,并且,输出答案answer长度小于15,就会被放到bucket_5_15_db里面
## 第四步 训练
下面的参数仅仅为了测试,训练次数不多,不会训练出一个好的模型
size: 每层LSTM神经元数量
num_layers: 层数
num_epoch: 训练多少轮(回合)
num_per_epoch: 每轮(回合)训练多少样本
具体参数含义可以参考train.py
输入:
```
./train_model.sh
```上面这个脚本内容相当于运行:
```
python3 s2s.py \
--size 1024 \
--num_layers 2 \
--num_epoch 5 \
--batch_size 64 \
--num_per_epoch 500000 \
--model_dir ./model/model1
```输出:在 model/model1 目录会输出模型文件,上面的参数大概会生成700MB的模型
如果是GPU训练,尤其用的是<=4GB显存的显卡,很可能OOM(Out Of Memory),
这个时候就只能调小size,num_layers和batch_size## 第五步 测试
下面的测试参数应该和上面的训练参数一样,只是最后加了--test true 进入测试模式
输入:
```
./train_model.sh test
```上面这个脚本命令相当于运行:
```
python3 s2s.py \
--size 1024 \
--num_layers 2 \
--num_epoch 5 \
--batch_size 64 \
--num_per_epoch 500000 \
--model_dir ./model/model1 \
--test true
```输出:在命令行输入问题,机器人就会回答哦!但是上面这个模型会回答的不是很好……当然可能怎么训练都不是很好,不要太期待~~
# 项目文件
db/chinese.txt 小学生必须掌握的2500个汉字
db/gb2312_level1.txt GB2312编码内的一级字库
db/gb2312_level2.txt GB2312编码内的二级字库
*上面几个汉字文件主要是生成字典用的,我知道一般的办法可能是跑一遍数据库,然后生成词频(字频)之类的,然后自动生成一个词典,不过我就是不想那么做……总觉得那么做感觉不纯洁~~*
db/dictionary.json 字典
# 测试结果
**不同的参数和数据集,结果都可能变化很大,仅供参考**
**下面训练结果是用train_model.sh的参数训练的**
> 你好
你好> 你好呀
你好> 你是谁
我是说,我们都是朋友> 你从哪里来
我不知道> 你到哪里去
你不是说你不是我的> 你喜欢我吗?
我喜欢你> 你吃了吗?
我还没吃饭呢> 你喜欢喝酒吗?
我不知道> 你讨厌我吗?
我不想让你失去我的家人> 你喜欢电影吗?
我喜欢> 陪我聊天吧
好啊> 千山万水总是情
你不是说你不是我的错> 你说话没有逻辑啊
没有> 一枝红杏出墙来
你知道的# 其他
很多论文进行 bleu 测试,这个本来是测试翻译模型的,其实对于对话没什么太大意义
不过如果想要,可以加 bleu 参数进行测试,例如
```
./train_model.sh bleu 1000
```具体可以参考 s2s.py 里面的 test_bleu 函数
最后,这个跟现在的机器人平台,和他们所用的技术其实没啥关系,
如果对于机器人(平台)感兴趣,可以看看[这里](https://github.com/qhduan/ConversationalRobotDesign/blob/master/%E5%90%84%E7%A7%8D%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%B9%B3%E5%8F%B0%E8%B0%83%E7%A0%94.md)更多问题欢迎与我交流