智能聊天机器人小黄鸡及其制作方法

2013-06-07 18:01:29来源:新浪博客作者:沐儿

讲前先预热一下,如果有还不熟悉小黄鸡的亲~欢迎大家戳这里http://mysimi.sinaapp.com/ 自制小黄鸡一枚,欢迎测试。。暂且叫他小黄鸡2号~1号在后面哈

讲前先预热一下,如果有还不熟悉小黄鸡的亲~欢迎大家戳这里http://mysimi.sinaapp.com/ 自制小黄鸡一枚,欢迎测试。。暂且叫他小黄鸡2号~1号在后面哈

大家好,我是沐儿,今天很荣幸担任主讲,与大家一起讨论智能聊天机器人小黄鸡~讲得不好请见谅,提问请轻虐~嘻嘻

今天的讲座主要分为三个部分,分别是:1. 什么是小黄鸡 2.小黄鸡的基本原理 3.如何自制小黄鸡。

Part 1 什么是小黄鸡

很多人认识小黄鸡是从人人网开始的,只要@小黄鸡,它就会跑出来跟你聊天。这就是一个典型的人工智能的聊天机器人。

实际上,人人网小黄鸡是华科一位08级的同学,通过人人网接口,调用韩国聊天机器人SimSimi的API,自动回复提问者。

也就是下图: 

\
 

SimSimi最早风靡于移动平台。至于它的具体原理以及实现方法我们将在后两部分介绍。也就是说,人人网小黄鸡的原型,就是智能聊天机器人SimSimi。那么什么是聊天机器人呢?

简单地说,就是基于人工智能原理(Artificial Intelligence,以下简称AI),通过对聊天文本进行分析后给出应答的一类程序。世界上最早的聊天机器人诞生于20世纪80年代,这款机器人名为“阿尔贝特”,用BASIC语言编写而成。而由于中文对“词”划分的模糊及歧义繁多等等原因,中文聊天机器人发展得相对较慢,目前有赢思的小i,爱博的小A,腾讯也有。

Part   2 小黄鸡的基本原理

AI聊天机器人小黄鸡的工作可以被分成两个部分:训练+匹配。(其实很多AI的东西都可以被这么划分,比如人脸识别,语音识别等等)

2.1 训练

Simsimi中的“教学”,就是训练的过程,目的在于构建或是丰富词库。

流程描述如下:
S1:用户通过教学界面向系统提出一个话题与相应应答;
S2:系统对该话题进行分词,判断该话题在系统知识库中应存放的位置;
S3:在系统知识库中添加该话题及相应应答。

可以看到,这里涉及到两个问题:给出一个话题,系统是如何分词的?词库要如何设计才能又快又准地应答? 

2.1.1分词方法

有人认为我教小黄鸡“埃菲尔铁塔上45度角仰望星空”回答是“呵呵”,那下次它再看到“埃菲尔铁塔上45度角仰望星空”整句话的时候才会有相应回答。但实际上,下次只要它看到“埃菲尔铁塔”就会“呵呵”了好嘛。

这是因为聊天机器人的存储并不以句子为单位(那样太费时费空间),而是以词。于是,分词,几乎成为聊天机器人的核心。

英文分词好说,人家用空格什么的就搞定了,但中文不一样,对于一句话,人们可以用自己的认识区分词语,而机器人要怎么做,就是中文分词算法的研究范畴了。

中文分词技术俨然是一个重要的研究方向,隶属于自然语言处理。现有的分词算法可以分为三大类:基于字符串匹配的分词方法、基于统计的分词方法和基于理解的分词方法。

用户在聊天时的一个显著特点是所提出的话题一般都是比较短小的,而不是长篇大论,不具有段落篇章结构,绝大多数就是少数几句话。基于统计的分词方法适用于有段落、篇章结构以及上下文关系的文段。基于理解的分词方法目前并不成熟,且时间复杂度高,速度慢。于是,只有基于字符串匹配的分词是比较适合的。

基于字符串匹配的分词方法,又叫做机械分词方法。按照扫描方向的不同,机械分词法可以分为正向匹配和逆向匹配。(e.g. 字符串“北京华烟云”,正向匹配为《北京,华烟云》,逆向匹配为《北,京华烟云》)逆向匹配的切分正确率要高于正向匹配法,为了便于发现歧义切分,有时候将两者结合起来形成双向匹配法。按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配,也就是长词优先和短词优先。按照匹配不成功时重新切取的策略,机械分词法可以分为增字法和减字法。
基于词典的“双向最大匹配”法是目前中文信息处理中最简单有效的方法,有这样的统计:汉语文本中90%左右的句子,其与双向最大匹配的结果相吻合,而且是正确的分词结果。

当正、反向最大匹配算法得出来的切分结果不一样时,就必须对其进行歧义处理,在此不再赘述。

2.1.2词库设计

由于中文词的特点:1.中文词是一个开放集,词数在增长;2.以不同字开头的词的数目变化很大,多的达到数百个,少的也有可能只有一个或者没有;3.词的长度变化也很大,有单字词,也有由六、七个字成词的。

这就要求在设计词典时,除了考虑访问效率外,还得充分考虑存储利用率。

请看这种数据结构,就能很好地平衡时间与空间。


\
 

首字Hash表通过一次哈希运算就可以直接定位汉字在表中的位置。一个单元包括三项内容:C:存储首字;F标志位:存储以C为首字的最长词条的长度;P:指向词表索引表。

解释一下哈希:散列表 Hash table,也叫哈希表,顾名思义就是把数据都打散了,再按一定规律存起来,加快访问速度。是根据关键码值Key而直接进行访问的数据结构。

举个栗子:我想将[0,100)做成一个哈希表,选取“模10”作为散列函数,以数组作为存储单元,则得到A[10][10]的数组,A[0]里依次存着0,10,20…90;A[1]里存着1,11,21…91。依次类推。

现在举一个训练小黄鸡的例子:我教小黄鸡说“大白天的做什么美梦啊?”回答是“哦哈哈哈不用你管”。

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

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

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

S4:完成训练。

赞助商链接: