摘自网络:

        最近在自个的公众号加了图灵机器人的智能聊天功能。发句中文句子给公众号,公众号则会自动回复一句话,甚为有趣。

        除了图灵机器人,其实还有“小黄鸡”的,不过“小黄鸡”找不着,只能作罢,取能用得上的。

        不过它的实现原理是怎样的呢?

        问了度娘,学习到其核心部分为:训练+匹配

一、训练

        流程如下:

    S1:用户通过教学界面向系统提出一个话题和它的相应应答;
    S2:系统对该话题进行分词,选择关键字,判断该话题在系统知识库中应存放的位置;
    S3:在系统知识库中存储添加该话题关键字及相应应答。

        就是说,智能聊天机器人的应答库,是对某些分词的回复。在它的存储里,不是以句子为单位的,而是以词。训练它一个句子,它会分词,然后存储到对应的位置。这是智能聊天机器人的核心。目前分词的方法有:基于字符串匹配的分词方法、基于统计的分词方法和基于理解的分词方法。记得有个古代笑话:下雨天留客天天留我不留。古时候是没标点的嘛,主人的原意是:下雨天,留客天,天留我不留!客人通过自己的理解:下雨天留客,天天留我不?留!于是自认为本想回去的,结果主人给了这句话,明显是想再留我多几天啊,于是不走了。

        同样的句子,不同人竟然完全理解相反。这在汉文其实还算很常见。于是我们发给一句话给机器人,它会正向反向双向扫描,可匹配为长词匹配和短词匹配等,还按照匹配不成功时重新切取词语。

二、然后是词库设计。如下图:

        智能聊天机器人词库设计.jpg

        首字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:完成训练。

三、匹配


        匹配可以描述成如下流程:S1:用户通过聊天界面向系统提出一个话题;S2:系统对该话题进行分词处理;S3:在系统知识库中寻找与该话题匹配的话语回复用户。 基于词典的分词算法分为词典加载、预处理、最大匹配、歧义消解几个阶段。

        具体流程如下:S1:预处理阶段,按照特殊字符(英文字母、数字、标点符号等)将待分析文本进行断句,将待切分的文本切分为只有中文短句子,这些句子是下一步分词处理的基本单位;(举个栗子:输入“asdfadf东北师范大学哈哈哈dfadflakfl(*^__^*) 嘻嘻……”,simi只会对其中的中文“东北师范大学哈哈哈嘻嘻”做出响应;输入“(*^__^*)”时,输出“I have no response.”)S2:对断句出来的句子进行双向最大匹配(双向匹配,长词优先)分词,分词后的结果作为S3的输入;(举个栗子:输入“东京古巴比伦”,正向与反向切词结果均为《东京,古巴比伦》,长词优先,所以simi只对“古巴比伦”做出响应;输入“古巴比伦埃菲尔铁塔”,正向与反向切词结果均为《古巴比伦,埃菲尔铁塔》,此时Simi对“埃菲尔铁塔”做出响应)S3:对上一步分词得到的结果进行比较,判断是否存在歧义,如果存在歧义,就进行一定的歧义消解;S4:重复S2、S3,直到处理完步骤一中断句所切分出的所有句子单元。

算法流程如图所示:

智能聊天机器人训练词语过程.jpg


例子:我问小黄鸡:“埃菲尔铁塔上45度角仰望星空”。

S1:双向最大匹配分词:正向反向均为“埃菲尔铁塔上,45度角,仰望星空”,没有歧义。长词优先,系统选择了“埃菲尔铁塔上”作为关键词;S2:系统在知识库中用刚才说的哈希函数f(埃菲尔铁塔上),找到比如[埃,11,P] 的表项,顺着指针找到6字词的索引,顺着索引找到6字词表,遍历词表,找到<埃菲尔铁塔上,…>结构体;S3:系统随机选择该结构体Ans域中的一个回答(也有可能是根据频率高低来选择)。比如“两年之后等着你”。S4:输出回答,匹配结束。