AIML知识库数据匹配原理解析

  • 目录:
    • 前言:
    • 1、AIML系统工作流程
    • 2、AIML的核心推理机制
    • 3、推理举例
    • 4、匹配规则及实践中遇到的一些问题的解释
    • 总结:

目录:

前言:

参考:《Alice机理分析与应用研究》
关于AIML库这里就不介绍了,详细的介绍及简单的使用请参考我的上一篇博客:https://blog.csdn.net/qq_16633405/article/details/80228697
这里主要介绍下AIML知识库内部数据匹配的机制,以便我们能更好的使用AIML库。废话少说,直接进入正题了。

1、AIML系统工作流程

AIML系统工作流程如图1所示。
第一步:系统初始化
AIML系统在启动时,首先根据配置文件进行系统的初始化操作,把需要替换的词串(如把 it’s替换为it is)、自身的相关信息(如名字、性别等)、人称转换信息以及此前的对话情景变量读入系统,并把AIML文件内容(即知识库)以树的结构形式加载到内存当中,形成内存知识树,这样当系统在响应用户输入的问句时,可直接在内存树中进行推理,提高了响应速度。加载完毕之后,等待用户输入问句。
第二步:接收用户输入,进行问句规范化处理
当AIML解析器接收到一行用户的输入后,首先把输入的文字分成单独的句子,进行问句规范化处理,分析当前句子中是否包含需要替换的字符串,如果有,则替换之。例如把问句中出现的“you’ve”替换为“you have”,“I’m”替换为“I am”等等。问句规范化处理完以后,以规范问句到内存知识树中查询推理答案。
第三步:问句查询推理
这一过程是AIML的核心部分,将规范化处理后的问句与内存知识树中的模式进行匹配,寻找最佳匹配结果,找到之后,读出该匹配模式对应的模板信息,进行下一步处理。
第四步:模板处理
也就是答案的后处理,模板中可能包含一些特殊标记需要处理,如读出机器人名字标记所代表的实际名称,还原星号部分所代表的内容,如果包含跳转标记,还需要在内存知识树中以跳转部分的内容做进一步的推理。 模板处理完后返回用户结果,等待用户输入新问句。
这里写图片描述

2、AIML的核心推理机制

AIML的核心推理部分称为 Graphmaster,它由一系列称为Nodemapper的节点集组成。每一个Nodemapper都有若干个从该节点出来的分支,这些分支可能是一个单词,也可能是一个通配符。
根据用户的输入查找对应模式的过程就是AIML的推理过程,假设用户输入的问句以单词X开头,那么首先拿X与Graphmaster中第一级节点的内容逐个比较,整个推理过程可以分为三步:
1、当前节点是否包含统配符“_”?如果有,则搜索以当前节点为根节点的子树,以X后面剩余部分组成的子句在该子树中继续该过程,如果没有相匹配的节点,则转 2);
2、当前节点是否包含X?如果是,则搜索以当前节点为根节点的子树,以X后面剩余部分组成的子句在该子树中继续该过程,如果未发现相匹配节点,则转 3;
3、当前节点是否包含“!”?如果是,则搜索以当前节 点为根节点的子树,以X后面剩余部分组成的子句在该子树中继续该匹配过程。如果没有发现匹配节点,回溯到节点的父节点,把X重新加到子句子的首部,继续该匹配过程。
当进行匹配的句子到达句尾,并且匹配的最后一个节点包含模板内容时,则表明已经找到了相匹配的模式,此时,终止搜索匹配过程,返回该节点,取出模板内容,在必要信息处 理完毕后把结果返回用户。由该算法可以看出,如果内存知识树中第一级节点含有关键字“*”,并且该节点含有模板信息,则对任何输入的问句,都能得到一个结果。

3、推理举例

下面举一个简单的例子来说明AIML的实际推理过程。 假设知识库中有以下三个category:
这里写图片描述

针对这三个category,给出它的内存知识树如上图所示。为简明起见,图中节点只写出了它所包含的内容,滤掉了其它信息。假设用户输入的问句是“do you love your boy”

根据上图和前面所讲的匹配规则,匹配串为“do you love your boy”,首先将问句的第一个单词“do”与第一级节点(节点(1)和节点(5))进行匹配,首先应该匹配节点(1),它仅有一个子节点(2),与问句下一个单词“you;”匹配不成功,问句回退后“you;”与下划线匹配成功,则继续匹配“love”,成功,匹配“your”成功,当再匹配“boy”时,当前节点(4)既不是“_”,也不是“boy”和“*”,匹配不成功,这样对节点(1)而言,第一步匹配下划线失败。继而执行匹配过程的第二步,匹配相同单词“do”,成功,匹配“you”成功,匹配“love”,与节点(H)成功,再匹配下一个单词“your”时,根据优先级,匹配下划线不成功,匹配原单词“your”成功,再匹配最后一个单词“boy”时,三个步骤都不成功,此时回溯到节点(H)。再以原单词“your”与节点(8)中的星号匹配,成功,继续匹配最后一个单词“boy”与节点(I)中的星号匹配,成功,继续匹配最后一个单词“boy”,与节点(9)匹配成功,问句结束,整个匹配过程完毕,叶子节点(9)为最后搜索匹配结果,其中也含有模板信息,表明找到对应了模式,在进行模板信息处理后,即可把结果返回给用户。

4、匹配规则及实践中遇到的一些问题的解释

首先是拿知识库中的数据和提问的问句进行匹配的,先根据问句来确定知识库中匹配的首节点,之后从对应的匹配数据出发,看匹配的首节点的剩余部分是否和问句的剩余部分匹配,如果成功则直接返回匹配结果,如果失败则进行另一个分支的匹配工作(内部匹配的一个优先级即_>单词>*)
例子:

M:*充值*金额*
T:充值金额及次数限制?
匹配的时候,先将T中的“充”字拿出来和M中的“*”号进行匹配,之后再将T中的“值”字与M中的“充”字进行匹配,
不匹配,则将T中的“值”字匹配到M中的“*”中,即此时的“*”代表”充值“二个字,然后再将T中的“金”字与M中“充”字进行匹配,
失败,再将T中的“金”字放到M中的“*”中...直到最后发现T中所有的汉字都无法匹配M中的“充”字,则说明当前这条路失败,
即进行第二条路,即M的初始“*”不代表任何字,则T中的“充”和M中的“充”匹配,值和值匹配,之后再参考前一条路的操作步骤,
先把*当做匹配的有对应的汉字,然后接着匹配T中的剩余的汉字,看是能与M完成匹配,若不能则返回“*”处,
即*是另一种情况即不代表任何汉字,接着进行匹配。。。
(对于汉语来说,内部是将一句话中的每个汉字都拆出来进行处理的)

问题一:使用AIML库时遇到返回AIML库源码中一段字符串输出的原因的解释:
例1:

问题:
提前还款违约金?

匹配项:

A:*提前*还款*违约*
B:*提前*还款*(匹配的是这个)

返回的语句是:对不起,无法回答您的问题。请您换种正式的方式提问(这个返回的字符串可以在源码中自定义更改)

出现这种情况的原因是:当你使用AIML库中srai标签时出现了多匹配问题,srai标签工作原理是当符合你定义的匹配规则时,他会再去搜索对应的问题,这时候出现了多匹配的问题即一个问题有多个匹配选择,程序不知道怎么选,所以就爆出上面源码中的一句话(srai详细的使用及原理请参考我的上篇文章:https://blog.csdn.net/qq_16633405/article/details/80228697)。
PS:所以在使用的时候个人不建议为了省事,去使用Srai标签,因为使用这个标签后具相当于再次进行了一次检索匹配的过程,并且在这个过程中匹配的规则会发生一些变化,下面的例子会解释那些地方发生了变化。
对于星号的匹配有如下的规则:

在最后一个“*”处的规则是先假设B中的“*”有内容,若匹配失败才进入B中的“*”无内容的条件再次进行匹配。

问题二:AIML库下中文的匹配规则
在说明使用srai标签后的检索匹配与初始检索匹配机制的一些不同点之前有必要举个例子把AIML库下中文的匹配规则说明白。
例2:
匹配项:

*贷款审批*时效*
*审批*多久*
*贷款*放款* 

输入的问题:贷款审批后多久放款?
输入后,答案有冲突
这种情况下,我想让“贷款审批后多久放款?”这句话匹配*贷款*放款*的答案 ,就需要将*贷款审批*时效*转化为*审批*时效*,这样在输入的时候,会先匹配“贷款”两个字即先匹配*贷款*放款*这个模式,若匹配不成功才会去匹配另一个*审批*多久*(即单词的优先级高于星号,有单词先匹配单词)。
系统内部操作时也是将汉字一个个拆分,匹配的时候也是一个一个字的去匹配。内部运行效果如下如所示:
这里写图片描述

问题三:使用srai标签后的检索匹配与初始检索匹配机制的一些不同点
例3:
如下所示:
当我输入“贷款有哪些品种?”时,就会发生匹配多项的问题输出系统自定义的输出语句即:对不起,无法回答您的问题。请您换种正式的方式提问(我自定义的)。

    <category><pattern>*贷款*种*</pattern><template>贷款有哪些品种?房供贷、红本贷、流水贷(公积金、代发工资)、公务员贷、保单贷。</template></category><category><pattern>*贷款*有*</pattern><template><srai>贷款有哪些品种?</srai></template></category>

但是当上面的匹配项改为这样时,系统就不会发生匹配多项的问题,也就不会返回相应的输出语句。

    <category><pattern>*贷款*种*</pattern><template>贷款有哪些品种?房供贷、红本贷、流水贷(公积金、代发工资)、公务员贷、保单贷。</template></category><category><pattern>*贷款*有*</pattern><template>贷款有哪些品种?房供贷、红本贷、流水贷(公积金、代发工资)、公务员贷、保单贷。</template></category>

原因:使用srai标签的搜索匹配机制和初始的搜索匹配机制不一样的地方。使用sari标签的时候也许也许内部源码的运行机制也许是在初始搜素匹配机制的基础之上又添加了一些额外的限制,所以才导致有这样的问题(但是个人感觉这个问题完全可以解决,大体的步骤就是在执行srai标签时将初始匹配的那套流程代码再执行一遍不就OK了,也许中间还牵涉到一些其他的难点吧。。这里就不考虑这些了)

总结:

一直想找关于AIML内部数据加载机制的知识,但是可参考的资料真的少之又少,无奈只能把之前找到的资料和自己的实践相结合总结出来这样一篇文章,希望能对大家有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】模拟面试技术面试题答

一、 python语法 1. 请说一下你对迭代器和生成器的区别&#xff1f; 2. 什么是线程安全&#xff1f; 3. 你所遵循的代码规范是什么&#xff1f;请举例说明其要求&#xff1f; 4. Python中怎么简单的实现列表去重&#xff1f; 5. python 中 yield 的用法…

ROS机器人程序设计(原书第2版)2.3 理解ROS开源社区级

2.3 理解ROS开源社区级 ROS开源社区级的概念主要是ROS资源&#xff0c;其能够通过独立的网络社区分享软件和知识。这些资源包括&#xff1a; 发行版&#xff08;Distribution&#xff09; ROS发行版是可以独立安装、带有版本号的一系列综合功能包。ROS发行版像Linux发行版一样…

Win7 U盘安装Ubuntu16.04 双系统

Win7系统下安装Ubuntu系统&#xff0c;主要分为三步&#xff1a; 第1步&#xff1a;制作U盘启动盘 第2步&#xff1a;安装Ubuntu系统 第3步&#xff1a;创建启动系统引导 第1步&#xff1a;制作U盘启动盘 1.下载Ubuntu16.04安装镜像&#xff0c;官网地址&#xff1a;http://www…

Word2VecDoc2Vec总结

转自&#xff1a;http://www.cnblogs.com/maybe2030/p/5427148.html 目录&#xff1a;1、词向量2、Distributed representation词向量表示3、word2vec算法思想4、doc2vec算法思想5、Doc2Vec主要参数详解总结&#xff1a; 目录&#xff1a; 1、词向量 自然语言理解的问题要转…

ubantu安装pycharm破解+Linux基础简介

一、课程简介 linux服务器配置及常用命令 Ubuntu centos 开发软件配置及服务环境的搭建 软件的安装和配置 mysql数据库使用、monDB使用、redius的使用 git的使用 html/css 课程学习方式 表达训练 学习方法&#xff1a; linux学习基本上都是命令和配置 命令要多敲多记 …

《游戏视频主播手册》——2.2 哪些人适合做游戏主播

本节书摘来自异步社区《游戏视频主播手册》一书中的第2章&#xff0c;第2.2节&#xff0c;作者 王岩&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.2 哪些人适合做游戏主播 据不完全统计&#xff0c;目前国内有超过26000名活跃的游戏主播。所谓“活跃的…

Doc2Vec实践

目录:前言&#xff1a;第一步&#xff1a;首先我们需要拿到对应的数据&#xff0c;相关的代码如下&#xff1a;第二步&#xff1a;拿到对应的数据后&#xff0c;就开始训练数据生成对应的model&#xff0c;对应的代码如下&#xff1a;第三步&#xff1a;得到生成的model后&…

Linux常用命令全网最全

一、linux文件系统结构 sudo apt-get install treetree --help #查看帮助tree -L 1 #显示文件目录 rootubuntu16 /# tree -L 1 . #系统根目录&#xff0c;有且只有一个根目录 ├── bin #存放常见的命令 ├── boot #系统启动文件和核心文件都在这个目录…

《开源思索集》一Source Code + X

本节书摘来异步社区《开源思索集》一书中的第1章&#xff0c;作者&#xff1a; 庄表伟 责编&#xff1a; 杨海玲, 更多章节内容可以访问云栖社区“异步社区”公众号查看。 Source Code X 开源思索集最近&#xff0c;有一位来自学术界朋友&#xff0c;找到了我们这个开源的圈子…

机器学习中目标函数、损失函数以及正则项的通俗解释

目录&#xff1a;前言&#xff1a;1、什么是目标函数&#xff1f;2、损失函数3、正则化总结&#xff1a; 目录&#xff1a; 前言&#xff1a; 今天看到一篇很精简的文章来说明目标函数、损失函数以及正则项是什么。以下是文章正文。 转自&#xff1a;https://xiaozhuanlan.…

Linux中的 硬链接ln和软连接ln -s

文件都有文件名与数据&#xff0c;这在 Linux 上被分成两个部分&#xff1a;用户数据 (user data) 与元数据 (metadata)。用户数据&#xff0c;即文件数据块 (data block)&#xff0c;数据块是记录文件真实内容的地方&#xff1b;而元数据则是文件的附加属性&#xff0c;如文件…

干货分享!DevExpressv16.2最新版演示示例等你来收!(上)

2019独角兽企业重金招聘Python工程师标准>>> 为解决大家找资源难的问题&#xff0c;EVGET联合DevExpress控件中文网盘点热门的DevExpress资讯、Demo示例、版本升级及下载&#xff0c;以及各种教程推荐等。更多下载及资讯也可以在DevExpress控件中文网中找到&#xf…

一文看懂哈夫曼树与哈夫曼编码

转自&#xff1a;http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html 在一般的数据结构的书中&#xff0c;树的那章后面&#xff0c;著者一般都会介绍一下哈夫曼(HUFFMAN)树和哈夫曼编码。哈夫曼编码是哈夫曼树的一个应用。哈夫曼编码应用广泛&#xff0c;如JPEG中…

解决:未能将管道连接到虚拟机: 所有的管道范例都在使用中。

虚拟机无端出现: VMware Workstation 无法连接到虚拟机。请确保您有权限运行该程序、访问改程序使用的所有目录以及访问所有临时文件目录。未能将管道连接到虚拟机: 所有的管道范例都在使用中。 原因&#xff1a;Ubuntu开机慢到开不开&#xff0c;我就在任务管理器强制结束了…

tcpdf开发文档(中文翻译版)

2017年5月3日15:06:15 这个是英文翻译版&#xff0c;我看过作者的文档其实不太友善或者不方便阅读&#xff0c;不如wiki方便 后面补充一些&#xff0c;结构性文档翻译 这是一部官方网站文档&#xff0c;剩余大部分都是开发的时候和网络总结来的 项目官网&#xff1a;https://t…

CCF推荐各种国际学术会议和期刊目录

这是中国计算机学会推荐国际学术会议和期刊目录2015年版本的内容&#xff0c; 主要罗列了国际上计算机相关的各个方向的顶级学术会议和期刊目录&#xff08;包含A、B、C三个等级&#xff09;。 包含的方向有&#xff1a; 计算机体系结构/并行与分布计算/存储系统计算机网络网络…

Linux基本操作【作业】

&#xfeff;1.如何使用命令立即重启linux操作系统&#xff1f; sudo reboot 2.如何查看/etc下的所有文件&#xff0c;并以列表格式显示&#xff0c;并且显示隐藏文件 cd /etc | ls -la 3.一次性创建 text/1/2/3/4 cd tmp mkdir -p text/1/2/3/4 &#xff08;1&#xff…

开发日志_Jan.8.2017

这两天继续着手开发碰撞部分。 主要工作是写碰撞类和运动线程类。碰撞主要在于算法&#xff0c;运动线程只要管理好就行了。 之前碰撞测试中&#xff08;即还未添加完整碰撞算法时&#xff09;遇到各种bug&#xff0c;疑似机器人和小球的定位点不明所造成的。昨天研究了下QT下的…

Nginx【学习笔记】

Nginx 1. nginx可以做什么&#xff1f; 可针对静态资源高速高并发访问及缓存。 可使用反向代理加速&#xff0c;并且可进行数据缓存。 具有简单负载均衡、节点健康检查和容错功能。 支持远程FastCGI服务的缓存加速。 支持FastCGI、Uwsgi、SCGI、Memcached Servers的加速和…

第四次作业类测试代码+036+吴心怡

一、类图 二、代码 package application; public class Commission { /* * hp&#xff1a;耳机 80元 mpc&#xff1a;手机壳 10元 cpsp&#xff1a;手机贴膜 8元 */ public float calculate(String line) { int hp 0, mpc 0, cpsp 0; String[] input null; float money 0;…