ALICE源代码分析
前言
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源代码分析的更多相关文章
- android-plugmgr源代码分析
android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...
- Twitter Storm源代码分析之ZooKeeper中的目录结构
徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...
- 转:SDL2源代码分析
1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中 ...
- 转:RTMPDump源代码分析
0: 主要函数调用分析 rtmpdump 是一个用来处理 RTMP 流媒体的开源工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps://. ...
- 转:ffdshow 源代码分析
ffdshow神奇的功能:视频播放时显示运动矢量和QP FFDShow可以称得上是全能的解码.编码器.最初FFDShow只是mpeg视频解码器,不过现在他能做到的远不止于此.它能够解码的视频格式已经远 ...
- UiAutomator源代码分析之UiAutomatorBridge框架
上一篇文章<UIAutomator源代码分析之启动和执行>我们描写叙述了uitautomator从命令行执行到载入測试用例执行測试的整个流程.过程中我们也描写叙述了UiAutomatorB ...
- MyBatis架构设计及源代码分析系列(一):MyBatis架构
如果不太熟悉MyBatis使用的请先参见MyBatis官方文档,这对理解其架构设计和源码分析有很大好处. 一.概述 MyBatis并不是一个完整的ORM框架,其官方首页是这么介绍自己 The MyBa ...
- hostapd源代码分析(三):管理帧的收发和处理
hostapd源代码分析(三):管理帧的收发和处理 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004379 这篇文章我来讲解一下h ...
- hostapd源代码分析(二):hostapd的工作机制
[转]hostapd源代码分析(二):hostapd的工作机制 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004433 在我的上一 ...
随机推荐
- [转]Redis 数据类型
本文转自:http://www.runoob.com/redis/redis-data-types.html Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),s ...
- WCF-绑定模型(二)
二.绑定元素 每一个类型的绑定最重要的就是绑定元素了,每个绑定的功能特性都由绑定元素决定.BasicHttpBinding由用于编码的TextMessageEncodingBindingElement ...
- C# 请求Https
/// <summary> /// Get请求 /// </summary> /// <param name="Url"></param& ...
- qq iOS环境配置及调用
1.下载官方iOS sdk:地址:相关文档 2. 将iOS SDK中的TencentOpenAPI.framework和TencentOpenApi_IOS_Bundle.bundle文件拷贝到应用开 ...
- 二、cent OS安装配置tomcat
下载tomcat的tar包http://tomcat.apache.org/download-80.cgi 确保安装前已经安装JDKjava -version如果没有安装可以参考上一篇文章:http: ...
- 事件处理程序DOM0,DOM2,IE的区别总结
一.事件流 顺序 备注 事件冒泡 目标对象~document对象 事件捕获 document对象~目标对象 老版本浏览器不支持 DOM事件流 document对象~目标对象~document对 ...
- EntityFramework(1)
EntityFramework核心是EDM实体数据模型,该模型由三部分组成. (1) 概念模型,由概念架构定义语言文件(.csdl)来定义. (2) 映射,由映射规范语言文件(.msl)定义. (3) ...
- 转 VS Code 快捷键大全,没有更全
VS Code折腾记 - (2) 快捷键大全,没有更全 前言 VSCode的快捷键继承了一些IDE风格,有VS的身影,也有Emacs的身影..简言之,内置快捷键玩熟了,效率提高不是一点两点. VsCo ...
- C语言——链式存储实现栈的基本运算算法
Lkstack.h // 链栈的定义 typedef struct node { int data; struct node *next; }LkStk; main.c #include <st ...
- Java web中的web-xml中标签定义之jsp-config
<jsp-config> 包括<taglib> 和<jsp-property-group> 两个子元素. 其中<taglib>元素在JSP 1.2时就已 ...