因为本猿自入行以来都有在开发和维护语音识别这类的产品。只不过是基于像科大讯飞,云知声这类语音引擎,所以对语言识别这块比较好奇,因为好奇,所以也很无奈……之前有尝试过正则式匹配,结果你懂的。
去年年底偶尔看到了AIML(全名为Artificial Intelligence Markup Language(人工智能标记语言)),然后翻了两篇入门博客,感觉这是个好东西。然后,下载了别人的例子来运行,这回让我难受了,源码什么都没修改,运行结果尽然和人家博客写的不一致,而且还老挂。又耗了一个星期去查找资料,发现相关博客基本都是基于AliceBot做的Demo,也都有强调Alice不支持中文需要自己修改,而且Alice官网好像也没有了。当然Iveely Liu也写了一个aiml解析,结合Iveely搜索引擎做了个智能问答机器人(http://www.cnblogs.com/liufanping/p/5879822.html),几个工程代码量比较大,对搜索引擎技术又比较陌生;于是,我找了AIML2.0文档,决定尝试自己去写一个AIML解析器。
年前花了半个月的时间,终于把AIML基本的标签解析弄得差不多了。下面简单介绍一些AIML 2.0。
通配符:
AIML1.0提供了*和_,表示“出现一次或者多次”(以下我简称它们为“1+统配符”)
AIML2.0新添加了^和#,表示“出现零次或者多次”(以下我简称它们为“0+统配符”)
它们的优先级关系:# -> _ -> ^ -> *;
<aiml>标签
AIML文件的根标签,包含aiml文件的内容;
集合SET <set>:
AIML2.0在匹配模型中提供了集合元素匹配
<category>
category表示AIML的基本知识单元
<topic>标签
表示基本知识库单元的主题分类
<pattern>标签
描述知识单元匹配模型
<that>标签
描述上一次匹配的知识单元的匹配模型
<template>标签
描述AIML知识单元的响应,最简答的就是直接返回纯文字,但大多数情况以文字与标签结合形式出现。
<random>标签
描述随机响应
<condition>标签
描述条件响应
<li>标签
描述单条响应
<loop>标签
用于处理<li>标签循环响应
<star>标签
用于提取<pattern>中通配符和集合元素的匹配内容
<thatstar>
用于提取<that>中通配符和集合元素的匹配内容
<topicstar>
用于提取<topic>中通配符和集合元素的匹配内容
<set>和<get>标签
这里的<set>标签包含在<template>中,用于设置变量的值,<get>用于获取某些变量的值
<srai>标识
内容会作为输入继续匹配
<sr/>标签
<sr/> = <srai><star /></srai>
好了,先简单的介绍这些简答的标签;下面我们来看看AIML知识库的几个例子:
最简单的问候语知识单元:
<category>
<pattern>你好</pattern>
<template>你好!</template>
</category>
当输入“你好”时,机器人回应:“你好!”
随机响应:
<category>
<pattern>你有钱吗?</pattern>
<template>
<random>
<li>谈钱伤感情好吗!</li>
<li>作为一个码农,我真心是穷!</li>
<