ALICE(爱丽丝)事实上是“人工语言计算机实体”的英文缩写。
它以前在往年(2000年、2001年和2004年)的勒布纳人工智能奖角逐中三次获胜。并在其它年度中也获过骄人的成绩。它是一个开源软件,能够在http://www.alicebot.org/downloads/programs.html下载到多种语言的实现。
这里以java版本号为例解说一下ALICE的聊天原理和代码实现部分。
下面提到的实现都是指java版本号。
???????? ALICE聊天的原理还是比較简单,它有一个对话库。
当用户问一个问题后。ALICE通过在对话库中查找同样问题的答案作为回答。Java版本号支持通配符匹配问题,能够大大降低问答资料库的规模。
???????? 原理非常easy,可是假设问答资料库足够丰富的话。还是能让人有些惊艳的感觉。
???????? 问答库使用AIML语言来存储。AIML是一种相似HTML的标记语言,xml格式。
例如以下就是AIML语言中的一对问题和答案:
<category>
???<pattern>WHO ARE YOU</pattern>
<template>Iam Alice, nice to meet you!</template>
</category>
当用户输入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{<pattern>: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中存在一个*匹配串。全部匹配不到的问题都会被该模式响应:
<category>
??? <pattern>*</pattern>
??? <template>I am sorry, my answers arelimited -- you must provide the right questions.</template>
</category>
当中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边的反复后学会了妈妈。爸爸等等名词后,然后又学习其它动词,然后把这些词组合起来说。
我想这整个过程正是一个人工智能应该走的路。命名实体识别/映射,规则学习和应用,甚至是推理。真正学会了规则自学习和推理的聊天机器人才是真正意义上的人工智能机器人吧。
原文:https://www.cnblogs.com/mqxnongmin/p/10692798.html