首页 > 代码库 > ALICE源码分析

ALICE源码分析

前言

ALICE(爱丽丝)其实是“人工语言计算机实体”的英文缩写。它曾经在往年(2000年、2001年和2004年)的勒布纳人工智能奖角逐中三次获胜。并在其他年度中也获过骄人的成绩。它是一个开源软件,可以在http://www.alicebot.org/downloads/programs.html下载到多种语言的实现。

这里以java版本为例讲解一下ALICE的聊天原理和代码实现部分。以下提到的实现都是指java版本。

原理

         ALICE聊天的原理还是比较简单,它有一个对话库。当用户问一个问题后,ALICE通过在对话库中查找相同问题的答案作为回答。Java版本支持通配符匹配问题,可以大大减少问答资料库的规模。

         原理很简单,但是如果问答资料库足够丰富的话,还是能让人有些惊艳的感觉。

问答资料库管理

         问答库使用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 = http://www.mamicode.com/new StringBuilder();

    for(TemplateElement i : children)

     value.append(i.process(match));

   return value.toString();

}

后记

         ALICE聊天机器的原理和代码实现相对比较简单,而加载足够的问答资料库后还是有不少趣味的,不过离真正的人工智能还差很远很远。最近身边有很多小朋友在学说话,他们一开始都是在重复学习单词,经过N边的重复后学会了妈妈,爸爸等等名词后,然后又学习其他动词,然后把这些词组合起来说。我想这整个过程正是一个人工智能应该走的路。命名实体识别/映射,规则学习和应用,甚至是推理。真正学会了规则自学习和推理的聊天机器人才是真正意义上的人工智能机器人吧。