从零开始造一个“智障”聊天机器人

本文介绍了如何从零开始构建一个简单的聊天机器人。首先讲解了自然语言处理(NLP)和神经网络的基础知识,接着介绍了使用Tensorflow实现的seq2seq模型。语料准备包括从Github下载的对话数据,通过代码进行整理。训练过程中,使用Perplexity作为评估指标,并展示了初步的对话效果。虽然机器人还存在不足,但整个流程已能展现基本的问答功能。

要造一个聊天机器人,首先你需要了解一些相关概念——自然语言处理(NLP),它是一门融语言学、计算机科学、数学于一体的科学,研究让电脑“懂”人类语言的方法。当然,它也包含很多分支:文本朗读、语音识别、句法分析、自然语言生成、人机对话、信息检索、信息抽取、文字校对、文本分类、自动文摘、机器翻译、文字蕴含等等等。 

看到这里的朋友,千万别被这些吓跑。既然本文叫《从零开始造一个“智障”聊天机器人》那么各位看官老爷不懂这些也没有关系!跟着我的脚步一步一步做吧。

 


 

0x1 基本概念

这里涉及到的原理基础,没兴趣的看官老爷略过即可,不影响后续代码实现。

01|神经网络

人工智能的底层是”神经网络“,许多复杂的应用(比如模式识别、自动控制)和高级模型(比如深度学习)都基于它。学习人工智能,一定是从它开始。 

那么问题来了,什么是神经网络呢?简单来说,神经网络就是模拟人脑神经元网络,从而让计算机懂得”思考“。具体概念在这里不再赘述,网络上有很多简单易懂的解释。 

本文使用的的是循环神经网络(RNN),我们来看一个最简单的基本循环神经网络: 

从零开始造一个“智障”聊天机器人

虽然图像看起来很抽象,但是实际很好理解。x、o、s是一个向量,x代表输入层的值,o代表输出层的值,s是隐藏层的值(这里其实有很多节点);U、V是权重矩阵,U代表输入层到隐藏层的权重矩阵,而V则代表隐藏层到输出层的权重矩阵。那么W是什么呢?其实循环神经网络的隐藏层的值s不仅仅由x、U决定,还会由上一次隐藏层的值s,而W就是上一次到隐藏层到这一次的权重矩阵,将其展开就是这样:

 

从零开始造一个“智障”聊天机器人

这样逻辑就清晰很多了,这便是一个简单的循环神经网络。而我们的智障,不对是“智能聊天机器人”便是使用循环神经网络,基于自然语言的词法分析、句法分析不断的训练语料,并把语义分析都融入进来做的补充和改进。

 

02|深度学习框架

适合RNN的深度学习框架有很多,本文的聊天机器人基于Google开源的Tensorflow,从GayhubGithub的starts数便可以看出,Tensorflow是一个极其火爆的深度学习框架,并且可以轻松地在cpu / gpu 上进行分布式计算,下面罗列了一些目前主流深度学习框架的特性,大家可以凭兴趣选择框架进行研究:

从零开始造一个“智障”聊天机器人

 

03|seq2seq模型

顾名思义,seq2seq 模型就像一个翻译模型,输入是一个序列(比如一个英文句子),输出也是一个序列(比如该英文句子所对应的法文翻译)。这种结构最重要的地方在于输入序列和输出序列的长度是可变的。 

举个例子: 

在对话机器中:输入(hello) -> 输出 (你好)。 

输入是1个英文单词,输出为2个汉字。我们提(输入)一个问题,机器会自动生成(输出)回答。这里的输入和输出显然是长度没有确定的序列(sequences)

我们再举一个长一点的例子: 

我教小黄鸡说“大白天的做什么美梦啊?”回答是“哦哈哈哈不用你管”。 

Step1应用双向最大匹配算法分词:双向分词结果,正向《大白天,的,做什么,美梦,啊》;反向《大白天,的,做什么,美梦,啊》。正向反向都是一样的,所以不需要处理歧义问题。长词优先选择,“大白天”和“做什么”。 

Step2:以“大白天”举例,假设hash函数为f(),并设f(大白天)指向首字hash表项[大,11,P]。于是由该表项指向“3字索引”,再指向对应“词表”。 

Step3将结构体<大白天,…>插入队尾。体中有一个Ans域,域中某一指针指向“哦哈哈哈不用你管”。 

这便是seq2seq的基本原理,原理和技术我们都有了,下一步就是将它实现出来!

 


0x2 语料准备

了解完一些前置基础,我们话不多说,直接进入造智能聊天机器人的阶段。首先我们需要准备相关训练的语料。

01|语料整理

本次训练的语料库是从Github上下载的(Github用于对话系统的中英文语料:https://github.com/candlewill/Dialog_Corpus)。我们下载其中的xiaohuangji50w_fenciA.conv(小黄鸡语料)进行我们的训练。 

当我们下载完后打开发现,它这个语料库是这样的: 

从零开始造一个“智障”聊天机器人

虽然这里面的文字、对话我们都能看懂,但是这些E、M、/都是些什么鬼?其实从图来看很容易理解,M即代表这句话,而E则代表一段对话的开始与结束。 

我们拿到这些语料后,用代码将其按照问/答分为两类”Question.txt”、”Answer.txt”:

1import re
2import sys
3def prepare(num_dialogs=50000):
4    with open(“xhj.conv”) as fopen:
5       &nb

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值