1.基于seq2seq的中文聊天机器人(一)
2.基于seq2seq的中文聊天机器人(二)
3.基于seq2seq的中文聊天机器人(三)
聊天机器人的研究可以追溯到上个世纪五十年代,阿兰图灵提出了一个图灵测试来回答“机器能思考吗”的问题,随后掀起了人工智能研究的热潮。聊天机器人可应用于多个人机交互场景,比如问答系统、谈判、电子商务、辅导等。最近,随着移动终端数量的急剧增加,它也可以用于手机终端的虚拟助理,如Apple的Siri、微软的Cortana、Facebook的Messenger,Google助手等,让用户更容易地从终端上获取信息和服务。
当前主流的聊天机器人的设计目标主要集中在四个方面:
(1) 闲聊,即回答问候、情感和娱乐等信息;
(2) 指令执行,帮助用户完成特定的任务,包括酒店及餐厅预订、机票查询、旅行向导、网络搜索等;
(3) 问答,满足用户对知识和信息获取的需求;
(4) 推荐,通过分析用户兴趣和会话历史,推荐个性化内容。
我们做的是一款基于Seq2Seq的单轮对话中文聊天机器人。
3.1语料库
语料通常指在统计自然语言处理中实际上不可能观测到大规模的语言实例。所以人们简单地用文本作为替代,并把文本中的上下文关系作为现实世界中语言的上下文关系的替代品。语料库一词在语言学上意指大量的文本,通常经过整理,具有既定格式与标记。其具备三个显著的特点:
语料库中存放的是在语言的实际使用中真实出现过的语言材料。
语料库以电子计算机为载体承载语言知识的基础资源,但不等于语言知识。
真实语料需要经过加工(分析和处理),才能成为有用的资源。
语料库的内容和质量决定了模型最后可以达到的天花板,语料集的清洗也是非常重要的,直接决定了模型的效果,甚至会影响模型的收敛,答非所问,语法错误等,因此语料的选择处理非常重要。
我们这是一个对话机器人项目,所以选择的语料主要是一些QA对,开放数据也很多可以下载,存放的格式是第一行为问题,第二行为回答,第三行又是问题,第四行为回答,以此类推。考虑语料数量和质量,我们选择小黄鸡50w分词语料库。
3.2语料预处理
返回过滤后的字符串,使用pickle保存成序列文件。
在对语料完成预处理后,在使用前还需要进行判断是否是一个好的语料,比如是否是属于汉字和数字。
除此之外,还要判断QA对的长度是否符合min_q_len,max_q_len,min_a_len,max_a_len的设置,防止过长或过短短对话。
3.3 Word2index
(1)词表和索引生成
做完语料预处理之后,接下来需要考虑如何把分词之后的字和词语表示成计算机能够计算的类型。显然,如果要计算我们至少需要把中文分词的字符串转换成数字,确切的说应该是数学中的向量。所以我们需要将每个词进行数字化,这里选择建立索引的方式。以词表为基础建立索引库,根据用户提问中的关键词迅速找到包含特定关键词的段落。
用0到n的值来表示整个词汇,每个值表示一个单词,这里用VOCAB_SIZE来定义。还有问题的最大最小长度,回答的最大最小长度。除此之外还要定义UNK、SOS、EOS和PAD符号,分别表示未知单词,比如你超过 VOCAB_SIZE范围的则认为未知单词,GO表示decoder开始的符号,EOS表示回答结束的符号,而PAD用于填充,因为所有QA对放到同个seq2seq模型中输入和输出都必须是相同的,于是就需要将较短长度的问题或回答用PAD进行填充。
还要得到整个语料库所有单词的频率统计,还要根据频率大小统计出排名前n个频率的单词作为整个词汇,也就是前面对应的VOCAB_SIZE。另外我们还需要根据索引值得到单词的索引,还有根据单词得到对应索引值的索引。_fit_word_函数相关代码如图所示:
(2)索引过程
信息检索技术的基础是对原始文档预处理后,将基本元素的位置信息记录在索引表中。通常以词表为基础建立索引库。信息索引就是创建文档的特征记录,通常以倒排表的方式建立。对文档进行预处理并建立信息索引是由系统预处理模块事先进行的。
用户提问时,将依据系统抽取的关键词从索引表中找出满足条件的所有段落取交集返回。由于索引结构常驻内存,因而检索速度快,而且一旦定位到段落,就可以作进一步的语义分析和处理。
信息索引建立完后,检索的过程就是对相关段落按权重大小排序后依次输出,段落权重的计算方法为:
首先,由词性为问题处理模块输出的关键词(包括其扩展)设置权重;
其次,根据类似工DF的定义为各关键词分配权重;
最后,依据权重的大小对检索出来的段落进行排序,依次送给答案抽取模块。
3.4 生成batch的训练数据
随机取出一个batch_size的预训练语料;
对语料中的问句和答句中的词转化为索引;
对不一样长的问句和答句进行pad填充;
将每个对话索引转化为数组返回,返回格式如图所示。next_batch函数具体代码如下所示: