小黄鸡的基本原理:
分为两个部分:训练+匹配
训练
Simsimi的“教学”,就是训练的过程,目的在于构建或者丰富词库。
流程如下:
S1:用户通过教学界面向系统提出一个话题与相应应答。
S2:系统对该话题进行分词,判断该话题在系统知识库中应存放的位置;
S3:在系统知识库中添加该话题及相应应答。
1.1分词方法
聊天机器人的存储并不以句子为单位(那样太费时费空间),而是以词。于是,分词,几乎成为聊天机器人的核心。
词库设计
由于中文词的特点:
1.中文词是一个开放集,词数在增长;
2.以不同字开头的词的数目变化很大,多的达到数百个,少的也可能只有一个或没有;
3.词的长度变化也很大,有单个词,也有六、七个字成词的。这就要求在设计词典时,除了考虑访问效率之外,还得充分考虑存储利用率。
首字哈希通过一次哈希运算就可以直接定位汉字在表中的位置。一个单元包括三项内容;
C:存储首字
F:标志位,存储以C为首字的最长词条的长度
P:指向词表索引表
解释一下哈希:散列表 Hash table,也叫哈希表,顾名思义就是把数据都打散了,再按一定规律存起来,加快访问速度。是根据关键码值key而直接进行访问的数据结构。
举个例子:我想讲[0,100]做成一个哈希表,选取“模10”作为散列函数,以数组作为存储单元,则得到A[10][10]的数组,A[0]里一次存着0,10,20,30,…,90;A[1]里存着1,11,21,…,91.以此类推。
现在举一个训练小黄鸡的例子:
“大白天的做什么美梦啊?”
回答:”哦哈哈哈不用你管”。
S1:应用双向最大匹配算法分词,
“大白天,的,做什么,美梦,啊”
长词优先选择,“大白天”和“做什么”
S2:以“大白天”为例,假设hash函数f(),并设f(大白天)指向首字hash表项[大,11,P]。于是由该表项指向“3字索引”,再指向对应“词表”。
S3:将结构体<大白天,…>插入队尾。体中有一个Ans域,域中某一指针指向“哦哈哈哈不用你管”
S4:完成训练