前言

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. redis 绑定任意ip

    vi /etc/redis.conf 修改bind语句为 bind 0.0.0.0

  2. DataSet常用简单方法

    Clear移除表中所有行来清除任何数据的DataSet Clone赋值该DataSet的结构但不复制数据 Copy赋值DataSet的结构和数据 Dispose释放DataSet对象 Equals确定 ...

  3. vs2015中的数据库架构对比工具(New Schema Comparison)

    大家都知道VS里的功能多到你根本没用过,今天来说说这个New Schema Comparison,他能做的事情就是在vs中对比我们两个数据库的架构.结构,并且能够更新过去或者生成脚本. Step.1( ...

  4. Docker学习之Centos7下安装

    Docker学习之Centos7下安装 centos7 64下直接使用yum安装docker环境,步骤如下: 卸载旧版本docker sudo yum remove docker docker-com ...

  5. 小程序插入html代码

    转自:https://blog.csdn.net/BetterGG/article/details/81027291 一.首先,html 分 2 种情况: 1.我在做详情页开发的时候发现获取到的数据是 ...

  6. sublime text3 JS语法检测插件

    首先ctrl+shift+P用包管理器安装sublimeLinter和sublimeLinter-jshint 前往node官网下载nodejs并安装 安装完node后打开命令行输入npm insta ...

  7. java核心技术-多线程基础

    进程.线程 ​ 进程(Process) 是程序的运行实例.例如,一个运行的 Eclipse 就是一个进程.进程是程序向操作系统申请资源(如内存空间和文件句柄)的基本单位.线程(Thread)是进程中可 ...

  8. Vue组件通讯

    Vue最常用的组件通讯有三种:父->子组件通讯.子->父组件通讯,兄弟组件通讯.(template用的pug模板语法) 1.父->子组件通讯 父->子组件通讯,是通过props ...

  9. web前端面试题(持续更新)

    此文是我本人在面试的时候遇到的问题和一些同学遇到的问题加资料上面的问题的总结.(将会持续更新,因为未有满意工作) 面试时有几点需要注意: 1.面试题目:根据你的等级和职位的变化,入门级到大神级,广度和 ...

  10. HTML中的Head标签学习

    在页面加载完成的时候,标签head里的内容,是不会在页面中显示出来的.它包含了像页面的<title>(标题) ,CSS(如果你想用CSS来美化页面内容),图标和其他的元数据(比如 作者,关 ...