现在很多卖货公司都使用聊天机器人充当客服人员,许多科技巨头也纷纷推出各自的聊天助手,如苹果Siri、Google Now、Amazon Alexa、微软小冰等等。前不久有一个视频比较了Google Now和Siri哪个更智能,貌似Google Now更智能。

本帖使用TensorFlow制作一个简单的聊天机器人。这个聊天机器人使用中文对话数据集进行训练(使用什么数据集训练决定了对话类型)。使用的模型为RNN(seq2seq),和前文的《RNN生成古诗词》《RNN生成音乐》类似。

相关博文:

数据集

我使用现成的影视对白数据集,跪谢作者分享数据。

下载数据集:

 
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
 
:
# 恢复前一次训练
)
:
)
)
:
)
 
:
)
# 退出
:
)
 
]
:
)
)
)
)
]
:
]
 
)
)

 

测试

TensorFlow练习13: 制作一个简单的聊天机器人

额,好差劲。

上面的实现并没有用到任何自然语言的特性(分词、语法等等),只是单纯的使用数据强行提高它的“智商”。

后续练习:中文语音识别、文本转语音

 

http://blog.topspeedsnail.com/archives/10735

 

使用谷歌开源的TensorFlow进行一系列的训练实践 https://www.urlteam.org

使用谷歌开源的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://www.urlteam.org/2017/09/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AC%94%E8%AE%B0%E4%BA%8C%EF%BC%9Atensorflow%E5%B0%8F%E7%99%BD%E5%AE%9E%E8%B7%B5/

 https://github.com/luyishisi/tensorflow

 

相关文章: