最后一个聊天机器人受到了很多关注,阅读量破万(不到20行代码,用Python做了一个智能聊天机器人),A通过简单的代码就可以实现简单的聊天机器人。今天小编就带领大家利用自然语言处理技术和聊天机器人的结合,制作一个自动作诗的聊天机器人。1.原理介绍首先,要让机器自动写诗,就需要借助自然语言处理的手段,让机器学会理解“诗”,进而做出我们需要的诗。如何让机器“读懂”这首诗?我们在深度学习中使用了长短期记忆网络(LSTM)。有点晕,别着急,后面我们会用白话来解释。LSTM是循环神经网络(RNN)的变体。RNN可以很好地解决自然语言处理任务,但对于长依赖句表现不佳。例如:在上面的例子中,使用“was”还是“Were”取决于前面的单复数形式,但是由于“was”和“dog”之间的距离太远,RNN无法很好地解决这个问题。为了解决上述问题,引入了LSTM。为了更直观的说明,我在这里介绍一个不恰当的例子:比如我们在看电影,我们可以通过镜头的切换来了解故事的进展。而且随着故事的发展,我们会知道某些主角的性格、年龄、喜好等,这些不会随着镜头的切换立刻遗忘,这些都是长期记忆,当故事发生的时候在一个特定的场景中,比如下面这张喜气洋洋的图片:通过我们对这个动画的长时记忆,我们知道这是喜气洋洋的思维,而在这个镜头中,我们利用了“喜悦”的长时记忆思维动作”记忆,在这个镜头下需要用到的长期记忆称为“工作记忆”。2.大白话解释LSTM那么LSTM是如何工作的呢?1).首先,让LSTM学会遗忘。例如,当一个镜头结束时,LSTM应该忘记镜头的位置、时间或所有信息。但是如果恰好一个演员收到了饭盒,那么LSTM应该记住这个人已经收到过饭盒了。这和我们看电影的时候是一样的。我们会选择忘记一些记忆,保留我们需要的记忆。所以LSTM应该能够知道在有新的镜头输入时要记住什么和忘记什么。2).二是增加留存机制。当LSTM输入新的镜头信息时,LSTM应该学习什么样的信息值得使用和保存。然后根据前两者,当输入一个新的镜头时,LSTM会忘记那些不需要的长期记忆,然后学习输入的镜头中哪些是值得使用的,并将这些保存在长期记忆中。3).***有必要立即知道长时记忆的哪些点要被使用。比如我们在电影里看到一个人在写东西,那么我们可能会调用年龄的长时记忆(小学生可能在做作业,而大人可能会再写文案),但年龄信息可能不是与当前场景相关。4).所以LSTM只学习它需要注意的部分,而不是一次性使用所有的记忆。因此,LSTM可以很好地解决上述问题。下图是对LSTM非常形象的展示:3.实战机器人下面是实战环节。虽然LSTM效果很好,但是还是需要对数据进行预处理。LSTM需要把每一节经文处理成一样的长度,需要把汉字转成数字形式。那么如何预处理呢,主要分为3步:读入数据,我们搜集了很多诗歌数据,统计每个词出现的次数,将出现的次数作为每个汉字的id.在生成批量数据时,我们需要将每一节的长度统一为相同的长度。因此,对于不够长的句子,我们会用“*”来填充。所以在显示***效果时,可能会在诗句中出现“*”字样。数据预处理的部分代码如下图所示:上述代码主要完成以下步骤:1).首先读入数据,将大于100的句子长度缩短,删除100个字符后的部分。2).然后在每句的首尾加上'^'和'$'作为句子的符号。句长小于MIN_LENGTH的,直接删掉3).***统计处理后的诗的词数,统计每个词出现的次数,将出现的次数作为每个汉字的id.对于数据预处理部分的代码,我做了注释,方便大家理解,对我们理解数据处理和python语句有很大的帮助。对于模型训练,需要保证电脑中已经配置好tensorflow和numpy库。当模型训练完成后,我们就可以直接调用模型嵌入到我们的聊天机器人程序中,实现我们的聊天机器人(聊天机器人的介绍可以参考文末历史文章)。以下是部分代码展示:4.效果展示说了这么多,我们来看一些训练好的机器人写诗的效果。图A是造诗机器人的效果,机器人输出“请输入藏头诗提示:”,当我们输入藏头诗提示时,机器人就会造出符合我们要求的藏头诗。图B显示了“*”字符的存在。当然,由于中华文化博大精深,也受到训练数据的限制。当我们的藏杂音提示中有没有出现在训练数据中的字符时,机器人就会提示该字符不在字典中。图C中红色标出的部分,会处理异常情况,提示不在字典中!
