前言

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. Menustrip控件和ContextMenustrip控件

    Menustrip 控件是由System.Windows.Forms.Menustrip类提供,取代了以前的MainMenu控件,是应用程序菜单结构的容器,在建立菜单时,要给Menustrip控件添加 ...

  2. js 千分位符号 正则方法

    function toThousands(num) {    return (num || 0).toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,');}

  3. Jenkins2.138配置slave节点时,启动方法只有两个选项

    Jenkins2.138配置slave节点时,启动方法只有两个选项,并没有通过javaweb代理启动这个选项 解决办法 全局安全配置->代理->选择随机选取

  4. webpack打包踩坑之TypeError: Cannot read property 'bindings' of null

    file loader介绍:https://www.webpackjs.com/loaders/file-loader/ babel loader介绍:https://webpack.js.org/l ...

  5. BZOJ1266 [AHOI2006]上学路线

    Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可: ...

  6. jQuery中判断input的disabled属性

    <input type="text" id="ipt1" disabled> <input type="text" id= ...

  7. C# 读取excel用户列表过滤一个月内未收到外部邮件已离职的员工

    1.通过aspose.cells读取excel中的数据并添加到list中 //存储从excel中读取出来的数据 List<UserInfo> lst_userinfo = new List ...

  8. Aspose.Pdf v8.4.1 发布

    .NET v8.4.1: 修复的错误及漏洞: PDF到JPEG时,内容从最终JPEG文件中丢失. 书签缩放识别错误.  Java v4.2: 新特性: 搜索分离超过两行的文本. 修复的异常: PDF到 ...

  9. Servlet:从入门到实战学习(2)---Servlet生命周期

    一个Servlet的完整的生命周期(从创建到毁灭)包括:init()方法,service()方法,doGet()方法,doPost()方法,destroy()方法 init()方法用于 Servlet ...

  10. sql 2000 无法连接远程数据库 sqlserver不存在或访问被拒绝、不能打开到主机的连接,在端口1433:连接失败等 解决方案

    问题: sql 2000 无法连接远程数据库 sqlserver不存在或访问被拒绝 telnet 127.0.0.1 1433     提示:不能打开到主机的连接,在端口1433:连接失败 解决方案: ...