前言
ALICE(爱丽丝) 事实上是 "人工语言计算机实体" 的英文缩写.
它以前在往年 (2000 年, 2001 年和 2004 年) 的勒布纳人工智能奖角逐中三次获胜. 并在其它年度中也获过骄人的成绩. 它是一个开源软件, 能够在 http://www.alicebot.org/downloads/programs.html 下载到多种语言的实现.
这里以 java 版本号为例解说一下 ALICE 的聊天原理和代码实现部分.
下面提到的实现都是指 java 版本号.
原理
???????? ALICE 聊天的原理还是比較简单, 它有一个对话库.
当用户问一个问题后. ALICE 通过在对话库中查找同样问题的答案作为回答. Java 版本号支持通配符匹配问题, 能够大大降低问答资料库的规模.
???????? 原理非常 easy, 可是假设问答资料库足够丰富的话. 还是能让人有些惊艳的感觉.
问答资料库管理
???????? 问答库使用 AIML 语言来存储. AIML 是一种相似 HTML 的标记语言, xml 格式.
例如以下就是 AIML 语言中的一对问题和答案:
- ???
- WHO ARE YOU
- Iam Alice, nice to meet you!
当用户输入 WHO ARE YOU 时, Alice 就会回答 I am Alice, nice to meet you! 就是这么简单.
???????? ALICE 启动时会把对话资料库载入到内存中, 实现源代码为 Graphmaster(GM).GM 事实上就是一颗 Trie 树, 仅仅只是节点是一个单词. ALICE 把问题 (Topic,That) 分成单词列表, 然后按 Trie 树的方式存入内存中, 当查询时, 依照 Trie 树的方式查询, 假设找到匹配的问题, 那么拿出相应的答案. 返回给用户.
以 WHO ARE YOU 为例, 在内存中方式应该例如以下:
- ???????? GM:(WHO)
- ?????????????????? \
- ???????? GM:(ARE)
- ?????? ? ? ? ? ? ? ? \
- ???????? GM:(YOU) -->Category{
- :WHO ARE YOU;<template>:I am Alice, nice to meetyou!
- }
当然在实现中还支持一些特殊标记方法. 如 <set> 设置上下文.<srai> 调用 Srai 类来处理一些特殊标记的转换等.
启动
???????? ALICE 的主程序为 bitoflife.chatterbean.ChatterBean, 它接受 1~2 个參数, 第一个參数是配置文件 Bots/properties.xml 的路径, 假设有第二个參数且是'gui'则启动 GUI 界面. 否则启动 Console 界面.
???ChatterBean 构造函数中会载入 Context,Splitter, 并载入问答资料库. 最后把问答资料库的引用传给 AliceBot.
回答问题
???????? 详细实现为 AliceBot.respond()
- private void respond(Sentence sentence,Sentence that, Sentence topic, Response response){
- ???if (sentence.length()> 0)
- ??? {
- ?????Match match = new Match(this, sentence, that, topic); // 构建匹配串
- ?????Category category = graphmaster.match(match); // 资料库中查找匹配串, 匹配的方法
- ???????????????????????????????????????????? // 支持通配符的 trie 查找算法
- ?????response.append(category.process(match)); // 匹配串进行回答处理
- ???
- }
- }
因为 ALICE 中存在一个 * 匹配串. 全部匹配不到的问题都会被该模式响应:
- ???
- *
- ???
- I am sorry, my answers arelimited -- you must provide the right questions.
当中 Category.process 是一个依照 AIML 语言进行解析的操作. AIML 语言中设置了一些默认的操作, 值得借鉴, 如 GET,SET,SRAI 等等, 通过反射. 把这些标记转换实际的 java 类, 然后调用这些类的 process 方法.
这些 AIML 元素都继承自 TemplateElement. 是一种 Composite+Template 设计模式.
- public String process(Match match){
- ???StringBuilder value = new StringBuilder();
- ??? for(TemplateElement i : children)
- ?????value.append(i.process(match));
- ???return value.toString();
- }
后记
???????? ALICE 聊天机器的原理和代码实现相对照较简单. 而载入足够的问答资料库后还是有不少趣味的, 只是离真正的人工智能还差非常远非常远. 近期身边有非常多小朋友在学说话, 他们一開始都是在反复学习单词, 经过 N 边的反复后学会了妈妈. 爸爸等等名词后, 然后又学习其它动词, 然后把这些词组合起来说.
我想这整个过程正是一个人工智能应该走的路. 命名实体识别 / 映射, 规则学习和应用, 甚至是推理. 真正学会了规则自学习和推理的聊天机器人才是真正意义上的人工智能机器人吧.
来源: http://www.bubuko.com/infodetail-3019961.html