前言

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

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

转载于:https://www.cnblogs.com/mqxnongmin/p/10692798.html

ALICE源代码分析相关推荐

  1. Android系统默认Home应用程序(Launcher)的启动过程源代码分析

    在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应 ...

  2. 《LINUX3.0内核源代码分析》第一章:内存寻址

    https://blog.csdn.net/ekenlinbing/article/details/7613334 摘要:本章主要介绍了LINUX3.0内存寻址方面的内容,重点对follow_page ...

  3. Scrapy源代码分析-经常使用的爬虫类-CrawlSpider(三)

    CrawlSpider classscrapy.contrib.spiders.CrawlSpider 爬取一般站点经常使用的spider.其定义了一些规则(rule)来提供跟进link的方便的机制. ...

  4. Android 中View的绘制机制源代码分析 三

    到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编 ...

  5. Android应用程序进程启动过程的源代码分析(1)

    Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持Binder进程间通信机制:这两个特点都是在进程的初始化过程中实 ...

  6. AFNetworking 源代码分析

    关于其他 AFNetworking 源代码分析的其他文章: AFNetworking 概述(一) AFNetworking 的核心 AFURLSessionManager(二) 处理请求和响应 AFU ...

  7. Hadoop源代码分析 - MapReduce(转载)

    1. Hadoop源代码分析(MapReduce概论) http://caibinbupt.javaeye.com/blog/336467

  8. RTMPdump(libRTMP) 源代码分析 3: AMF编码

    2019独角兽企业重金招聘Python工程师标准>>> 注:此前写了一些列的分析RTMPdump(libRTMP)源代码的文章,在此列一个列表: RTMPdump 源代码分析 1: ...

  9. Android系统默认Home应用程序(Launcher)的启动过程源代码分析(3)

    Step 13.  ActivityStack.startActivityLocked 这个函数定义在frameworks/base/services/java/com/android/server/ ...

最新文章

  1. select, epoll的个人总结
  2. android从放弃到精通 第九天 勿忘初心
  3. python就业方向及工资-Python的就业的方向和前景
  4. POJ 2976 Dropping tests【二分 最大化平均值】
  5. AJAX代码示例(不使用AJAX控件)
  6. swift调用支付宝
  7. flash和html5
  8. js点击取消按钮关闭当前弹框_UI设计中“取消按钮”的分析详解
  9. Go程序:变量声明、赋值与输出
  10. SQL Sever 数据完整性
  11. vue延迟渲染组件_做一个可复用的 echarts-vue 组件(延迟动画加载)
  12. Java核心技术卷1基础知识课程-专题视频课程
  13. fastDFS 无法获取服务端连接资源:找不到可用的tracker
  14. 一款简约好看的html5音乐播放器,一款好看又简洁的HTML5音乐播放器skPlayer
  15. 关闭华硕笔记本触摸屏
  16. 生信文献学习(part1)--PRECISE: a ... approach to transfer predictors of drug response from pre-clinical ...
  17. 【课程作业】学术英语写作:文献阅读报告2
  18. BPDU Timers
  19. 【VS】VS Code安装、配置、使用(windows10 64)
  20. 蓝绿部署、滚动部署、灰度部署、金丝雀部署

热门文章

  1. 嵌入式开发之davinci--- 8168 电源调试总结
  2. Adobe的学者约翰—沃洛克博士
  3. cvpr2018论文阅读
  4. 【正一专栏】瓜迪奥拉就是一座无可匹及的丰碑
  5. Java实现数据序列化工具Avro的例子
  6. Ubuntu 12.10下配置Web服务器详细教程
  7. ForkJoinPool---ForkJoinTask
  8. hibernate同时插入两条相同数据(偶尔)原因调查
  9. Java 技术篇-使用poi开源jar包实现读取excel实例演示,poi-3.17.jar获取
  10. Navicat 数据库连接工具连接oracle数据库提示cannot create oci handles问题解决方法