现在很多卖货公司都使用聊天机器人充当客服人员,许多科技巨头也纷纷推出各自的聊天助手,如苹果Siri、Google Now、Amazon Alexa、微软小冰等等。前不久有一个视频比较了Google Now和Siri哪个更智能,貌似Google Now更智能。
本帖使用TensorFlow制作一个简单的聊天机器人。这个聊天机器人使用中文对话数据集进行训练(使用什么数据集训练决定了对话类型)。使用的模型为RNN(seq2seq),和前文的《RNN生成古诗词》《RNN生成音乐》类似。
相关博文:
- 使用深度学习打造智能聊天机器人
- 脑洞大开:基于美剧字幕的聊天语料库建设方案
- 中文对白语料
- https://www.tensorflow.org/versions/r0.12/tutorials/seq2seq/index.html
- https://github.com/tflearn/tflearn/blob/master/examples/nlp/lstm_generator_shakespeare.py
数据集
我使用现成的影视对白数据集,跪谢作者分享数据。
下载数据集:
|
1
2
3
|
.zip
# 解压
.zip
|
数据预处理:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
os
random
'dgk_shooter_min.conv'
:
)
)
# 数据集格式
E
M 畹/华/吾/侄/
M 你/接/到/这/封/信/的/时/候/
M 不/知/道/大/伯/还/在/不/在/人/世/了/
E
M 咱/们/梅/家/从/你/爷/爷/起/
M 就/一/直/小/心/翼/翼/地/唱/戏/
M 侍/奉/宫/廷/侍/奉/百/姓/
M 从/来/不/曾/遭/此/大/祸/
M 太/后/的/万/寿/节/谁/敢/不/穿/红/
M 就/你/胆/儿/大/
M 唉/这/我/舅/母/出/殡/
M 我/不/敢/穿/红/啊/
M 唉/呦/唉/呦/爷/
M 您/打/得/好/我/该/打/
M 就/因/为/没/穿/红/让/人/赏/咱/一/纸/枷/锁/
M 爷/您/别/给/我/戴/这/纸/枷/锁/呀/
E
M 您/多/打/我/几/下/不/就/得/了/吗/
M 走/
M 这/是/哪/一/出/啊/…/ / /这/是/
M 撕/破/一/点/就/弄/死/你/
M 唉/
M 记/着/唱/戏/的/再/红/
M 还/是/让/人/瞧/不/起/
M 大/伯/不/想/让/你/挨/了/打/
M 还/得/跟/人/家/说/打/得/好/
M 大/伯/不/想/让/你/再/戴/上/那/纸/枷/锁/
M 畹/华/开/开/门/哪/
E
...
# 我首先使用文本编辑器sublime把dgk_shooter_min.conv文件编码转为UTF-8,一下子省了不少麻烦
# 对话集合
:
# 一次完整对话
:
)
:
continue
:
:
)
]
:
)
print(convs[:3]) # 个人感觉对白数据集有点不给力啊
[ ['畹华吾侄', '你接到这封信的时候', '不知道大伯还在不在人世了'],
['咱们梅家从你爷爷起', '就一直小心翼翼地唱戏', '侍奉宫廷侍奉百姓', '从来不曾遭此大祸', '太后的万寿节谁敢不穿红', '就你胆儿大', '唉这我舅母出殡', '我不敢穿红啊', '唉呦唉呦爷', '您打得好我该打', '就因为没穿红让人赏咱一纸枷锁', '爷您别给我戴这纸枷锁呀'],
['您多打我几下不就得了吗', '走', '这是哪一出啊 ', '撕破一点就弄死你', '唉', '记着唱戏的再红', '还是让人瞧不起', '大伯不想让你挨了打', '还得跟人家说打得好', '大伯不想让你再戴上那纸枷锁', '畹华开开门哪'], ....]
# 把对话分成问与答
# 问
# 答
:
:
continue
# 奇数对话数, 转为偶数对话
]
:
:
)
:
)
print(len(ask), len(response))
print(ask[:3])
print(response[:3])
['畹华吾侄', '咱们梅家从你爷爷起', '侍奉宫廷侍奉百姓']
['你接到这封信的时候', '就一直小心翼翼地唱戏', '从来不曾遭此大祸']
:
# 创建文件
# 问
# 答
# 问
# 答
# 选择20000数据作为测试数据
)
:
:
)
)
:
)
)
:
)
)
)
)
)
)
# 生成的*.enc文件保存了问题
# 生成的*.dec文件保存了回答
|
创建词汇表,然后把对话转为向量形式,参看练习1和7:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
# 前一步生成的问答文件路径
'train.enc'
'train.dec'
'test.enc'
'test.dec'
)
# 特殊标记,用来填充标记对话
# 对话结束
# 标记未出现在词汇表中的字符
]
0
1
2
3
# 参看tensorflow.models.rnn.translate.data_utils
5000
# 生成词汇表文件
:
}
:
0
:
1
]
:
:
1
:
1
)
# 取前5000个常用汉字, 应该差不多够用了(额, 好多无用字符, 最好整理一下. 我就不整理了)
:
]
)
:
:
)
)
)
'train_encode_vocabulary'
'train_decode_vocabulary'
)
# 把对话字符串转为向量形式
:
]
:
)
]
)
#{'硕': 3142, 'v': 577, 'I': 4789, '\ue796': 4515, '拖': 1333, '疤': 2201 ...}
)
:
:
]
:
)
)
)
)
)
)
)
|
生成的train_encode.vec和train_decode.vec用于训练,对应的词汇表是train_encode_vocabulary和train_decode_vocabulary。
训练
需要很长时间训练,这还是小数据集,如果用百GB级的数据,没10天半个月也训练不完。
使用的模型:seq2seq_model.py。
代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
# 0.12
seq2seq_model
os
np
math
0
1
2
3
'train_encode.vec'
'train_decode.vec'
'test_encode.vec'
'test_decode.vec'
# 词汇表大小5000
5000
5000
]
# 每层大小
# 层数
64
# 读取*dencode.vec和*decode.vec数据(数据还不算太多, 一次读人到内存)
:
]
:
:
)
0
:
1
]
]
)
:
:
)
break
)
data_set
,
,
)
)
# 防止 out of memory
:
# 恢复前一次训练
)
:
)
)
:
)
)
)
]
)
]
0.0
0
]
# 一直训练,每过一段时间保存一次模型
:
)
)
)
)
500
1
)
:
)
# 如果模型没有得到提升,减小learning rate
:
)
)
# 保存模型
)
0.0
# 使用测试数据评估模型
:
:
continue
)
)
)
)
|
聊天机器人
使用训练好的模型:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
# 0.12
seq2seq_model
os
np
0
1
2
3
'train_encode_vocabulary'
'train_decode_vocabulary'
:
]
:
)
]
)
tmp_vocab
)
)
# 词汇表大小5000
5000
5000
]
# 每层大小
# 层数
1
,
,
)
1
:
# 恢复前一次训练
)
:
)
)
:
)
:
)
# 退出
:
)
]
:
)
)
)
)
]
:
]
)
)
|
测试
额,好差劲。
上面的实现并没有用到任何自然语言的特性(分词、语法等等),只是单纯的使用数据强行提高它的“智商”。
后续练习:中文语音识别、文本转语音
http://blog.topspeedsnail.com/archives/10735
使用谷歌开源的TensorFlow进行一系列的训练实践
2017.9.10 重启项目
项目列表
前三篇主要学习自熊猫的博客:http://blog.topspeedsnail.com/
1:Cnn_Captcha
用卷积神经网络识别复杂字符验证码
用4层Cnn网络,识别破解python自生成的复杂扭曲验证码,
项目实践说明:https://zhuanlan.zhihu.com/p/25779608
2:Forecast
用CNN根据名字判断性别
3.Rnn_Create_Poetry
用RNN生成古诗词
4.Object_Detection,目标检测
本项目是使用tensorflow的Object Detection API,进行目标检测。
完成的是数据预处理脚本,如何用自己的数据生成可以训练的record文件。
https://github.com/luyishisi/tensorflow