聊天机器人总结

用word2vec,seq2seq,lstm做聊天机器人

本文参考:
自己动手做聊天机器人
情感分析代码解析
jieba分词
logging日志模块学习
logging模块学习
python的namedoc属性
Python两个内置函数locals和globals
join()和os.path.join()函数
Python字符串前面加u,r,b的含义
codecs模块(与编码相关)
word2vec对维基百科数据进行处理

为什么不用tensorflow自带的seq2seq模型呢?

tensorflow自带的seq2seq模型是基于one-hot的词嵌入,每个词用一个数字代替不足以表示词与词之间的关系,word2vec通过多维向量来做词嵌入,能过表示出词之间的关系,比如:篮球-科比&足球-梅西。基于seq2seq的思想,利用多维词向量来实现模型,会有更高的准确性和表达效果。

seq2seq模型原理

参考《Sequence to Sequence Learning with Neural Networks》这篇论文,核心思想如下:
聊天机器人总结_第1张图片
ABC是输入语句,WXYZ是输入语句,EOC是标识一句话结束,图中的训练单元是lstm,lstm的特点是能够根据输入的多个字确定后面的多个字。
上面的模型中编码器和解码器共用一个lstm层,也就是共享参数,牛人们把他们分开像下图中一样:
聊天机器人总结_第2张图片
其中绿色的是编码器,黄色的解码器,橙色的箭头传递的是lstm的记忆信息,编码器唯一传给解码器的就是这个状态信息
我们看到解码器每一时序的输入都是前一时序的输出,从整体上来看就是我通过不同时序输入“how are u”,模型就能一个一个字的输出“w i am fine”,这里w是一个特殊的标识,它既是编码器最后的输出,同时也是解码器的一个触发信号
那么我们训练的时候输入的X,Y应该是什么呢?
x = “how are u”,Y = ”w i am fine”?
这是不行的,因为再解码器还没有训练出靠谱的参数之前,我们无法保证第一个时序的输出就是”i“,那么传递给第二个时序的输入就不一定是”i”,同样后面时序的输入也不对,就无法训练出想要的模型
所以我们应该这样做:直接把解码器中每一个时序的输入强制改为“w i am fine”,也就是把这部分从我们训练样本的输入x中传过来,而Y依然是预测输出的“w i am fine”,这样训练出来的模型就是我们设计的编码器解码器模型了
在使用训练好的模型做预测的时候,我们改变处理方式:在解码时以前一时序的输出为输入做预测,这样就能输出我们希望输出的“w i am fine”
基于以上的原理,下面开始实践。

语料准备工作

下载维基百科数据

繁转简

jieba分词走一波

gensim word2vec模块直接转

测试词向量效果

#

聊天机器人总结_第3张图片

你可能感兴趣的:(聊天机器人总结)