一个LSTM单元让聊天机器人学会甄嬛体
这两天在网上看到一篇教程,名为《自己动手做聊天机器人——一个LSTM单元让聊天机器人学会甄嬛体》www.shareditor.com/blogshow/ (感谢原作者的倾囊相授),挺感兴趣的。于是跟着它从头到尾做了一遍。在这里记录一些自己的学习经过,欢迎有相同兴趣的小伙伴一起讨论、学习、进步。
完成这个过程,你需要:
1.下载《甄嬛传》txt文档(或者你想让聊天机器人学会其他风格,可以下载自己感兴趣的文本,上网搜一搜有很多的)。
2.提前安装好各种需要用到的Python工具包(实际过程中遇到什么需要什么再安装也是可以的,我使用的是Anaconda,安装各种包都很快速,而且它自带了很多平时要用到的包,建议大家使用它)。
3.遇到任何bug都不泄气,努力找到原因,并修正它的决心。
具备以上,我们可以开始了:
一、分词
分词是整个过程的第一步。我们下载好的文档是通过标点符号,将句子与句子之间进行分割的。而词语和词语之间没有分隔开。分词的目的就是为了将词语分割开(例如:我今天去上学——我 今天 去 上学)。分词的方法挺多的,大家可以选择自己熟悉的、用过的方法。我使用的是jieba分词。以下是分词前后对比图:
jieba分词的代码上网找一下有很多,而且都很简单。注意:在进行分词之前,要将原始的txt文档转码成utf-8编码,然后将文档中的回车符替换成空行。
二、生成词向量
生成词向量使用的是word2vec方法,word2vec代码在网上也有很多。这个方法将.txt文件作为输入,输出一个.model.bin文件,这个.model.bin文件就是词向量文件了。
三、训练模型
接下来将我们手中的数据进行训练:
导入各种包:
从.model.bin文件中加载词向量:
加载分词后的文本并存到一个序列里:
求距离某向量最近的词(通过计算词之间的余弦相似度):
训练(使用一个LSTM单元):
注:如果你想让机器人自动吐出甄嬛体,将最后几行中的“#”去掉就可以了。
四、运行结果
可以看到,经过500个epoch,程序以80%的余弦相似度预测出了下一个字。