前言

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边的反复后学会了妈妈。爸爸等等名词后,然后又学习其它动词,然后把这些词组合起来说。

我想这整个过程正是一个人工智能应该走的路。命名实体识别/映射,规则学习和应用,甚至是推理。真正学会了规则自学习和推理的聊天机器人才是真正意义上的人工智能机器人吧。

ALICE源代码分析的更多相关文章

  1. android-plugmgr源代码分析

    android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...

  2. Twitter Storm源代码分析之ZooKeeper中的目录结构

    徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...

  3. 转:SDL2源代码分析

    1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中 ...

  4. 转:RTMPDump源代码分析

    0: 主要函数调用分析 rtmpdump 是一个用来处理 RTMP 流媒体的开源工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps://. ...

  5. 转:ffdshow 源代码分析

    ffdshow神奇的功能:视频播放时显示运动矢量和QP FFDShow可以称得上是全能的解码.编码器.最初FFDShow只是mpeg视频解码器,不过现在他能做到的远不止于此.它能够解码的视频格式已经远 ...

  6. UiAutomator源代码分析之UiAutomatorBridge框架

    上一篇文章<UIAutomator源代码分析之启动和执行>我们描写叙述了uitautomator从命令行执行到载入測试用例执行測试的整个流程.过程中我们也描写叙述了UiAutomatorB ...

  7. MyBatis架构设计及源代码分析系列(一):MyBatis架构

    如果不太熟悉MyBatis使用的请先参见MyBatis官方文档,这对理解其架构设计和源码分析有很大好处. 一.概述 MyBatis并不是一个完整的ORM框架,其官方首页是这么介绍自己 The MyBa ...

  8. hostapd源代码分析(三):管理帧的收发和处理

    hostapd源代码分析(三):管理帧的收发和处理 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004379 这篇文章我来讲解一下h ...

  9. hostapd源代码分析(二):hostapd的工作机制

    [转]hostapd源代码分析(二):hostapd的工作机制 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004433 在我的上一 ...

随机推荐

  1. MySQL学习基础

    MySQL是被Sun公司收购了,所以也有热咖啡图标,不过MySQL的作者后来又做了一个MariaDB,小海豚图标,也很好用. MySQL学习: <MySQL网络数据库设计与开发>(电子工业 ...

  2. input type =text,按回车键自动提交

    1.当form表单中只有一个<input type="text" name='name' />时按回车键将会自动将表单提交 <form id='form1' ac ...

  3. Java基础教程(3)--回顾HelloWorld

      在上一篇文章中,我们已经编写了第一个Java程序--HelloWorld,并且对它进行了编译和运行.虽然这个例子很短小,但是它具有一个完整的Java程序所应该具有的结构.在这篇文章中,我将会对这个 ...

  4. Mac下使用sublime Text打开隐藏目录

    我们用 sublime Text 打开时,默认是看到非隐藏的目录和文件,如下图: 这时候在这个节目,按下 command +shift + 句号 快捷键,会自动切换 隐藏状态的, 这时候就可以切换成下 ...

  5. fuzhou 1692 Key problem ***

    Problem 1692 Key problem Accept: 103    Submit: 553 Time Limit: 1000 mSec    Memory Limit : 32768 KB ...

  6. SpringMVC_关于<url-pattern>

    一.配置   在没有特殊要求的情况下,SpringMVC的中央调度器DispatcherServlet的<url-oattern/>常使用后缀匹配的方式,如写*do. 二.不能写为/* 这 ...

  7. mybatis-generator 动态生成实体对象、dao 以及相关的xml映射文件

    .新建maven空项目 2.修改pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <proje ...

  8. System.out.println与System.err.println的区别

    public class Test2 { static { System.out.println("1"); } { System.out.println("2" ...

  9. ajax异步上传图片三种方案

    转自:http://www.jb51.net/article/51180.htm 注:自己尝试了前两种,都可用: 目前常用的异步文件上传功能有几种,比较多见的如使用iframe框架形式,ajax功能效 ...

  10. react打包开发文件的步骤(上传给线上环境)

    cd进入ReleaseProject目录,然后运行npm start,系统会自动在public目录下面完成打包工作,然后我再把  public文件下压缩位public.rar上传即可:(public文 ...