机器人笔记2

今天下午在debug的过程中发现了,标签不支持中文的问题,各种搜索无果后。。。
果断又阅读了源代码。
虽然问题找起来很费事,但通过阅读源代码,对整个工程项目又有了更清晰的了解。

我用的是非常流行的chatterbean机器人,项目非常庞大,结构也较复杂,核心的识别代码用了多态,使得代码跟踪略显困难,下面我们就简要介绍一下各个类的功能:

AliceBot是核心的机器人类,也是我们使用的接口类,其中的respond方法是我们的核心方法,每次调用都能获取对传入字符串的回答。

AliceBotMother可以配置各文件的路径,建议自己构建。

Context是上下文类,储存着重要的上下文参数,包括加载时传入的配置表,分隔符表,容错替换表等
除此以外还包括着所有set时的变量,都以predicate.为开头命名着。

Graphmaster是整个解析器最核心的类,它会加载整个aiml文档,以此生成一个匹配树,然后按照顺序,将你的语句拆分后,扔到匹配树中进行匹配。

Match就是匹配用的具体类

.aiml包下的都是和aiml语法解析相关的类

AIMLHandler是给SAX解析器用的核心类
AIMLParser是解析器接口类

AIMLElement是所有aiml元素下的基类,其中有多态的方法process,通过递归的调用该方法,将对每一个元素的解析转移到他们对应的类下面。
于是可以看到大量的和aiml语法中同标签名的类,这些类大都是派生自AIMLElement、或其派生类TemplateElement

.parser包下的都是各个解析器类,里面有AliceBot的解析器接口类AliceBotParser
还包含有几个对应文件的解析器:
ContextParser
TransformationsParser
以及一些和aiml解析器一样功能的handler

script是一个脚本解析器类,没有什么代码,只有一个接口和其实现,调用的就是bsh的解析器,实现其脚本引擎的功能。

.text都是文本处理相关的类,包括句子正规化,句子拆分,词拆分等
首先要提的就是这个Transformations类,这个类里面有一个fitting正则表达式,它会过滤掉所有的中文字符,所以要改成这样:

private final Pattern fitting = Pattern.compile("[^A-Z0-9\u4E00-\u9FA5]+");

这就提供了中文的支持,中文单词就不会被句子正规化时过滤掉了

另外一个就是Sentence类,这个类是处理句子的划分,单词划分的类,
但其中original方法中也有一个正则表达式,要改成这样:

value = value.replaceAll("^[^A-Za-z0-9\u4E00-\u9FA5]+|[^A-Za-z0-9\u4E00-\u9FA5]+$", " ");

否则标签都不会支持中文,将这里修改好,我们的Alice机器人就能支持中文了。

.util类正如其名字,是一些小工具类,还包括一个在文件夹下搜索文件的Searcher类

介绍到这里,就对机器人有了一个整体的认识了,修改成中文机器人的方法还没完,

也许还应该对其增加个分词器,不过这也不是最必要的,因为如果这个时候,aiml语法中的词都是分开的,输入时的词都是分开的,这已经可以识别了。

恩,中文机器人还不算太复杂吧,源代码我就上传到github上了,因为我用的是讯飞做语音识别,所以讯飞语音的id应该改,可以自己注册一个号,反正也是免费的,因为我的机器人并未上线审核,所以id是有每天500次的限制啊,而且还有奇怪的和自娱自乐的对话。。。

github链接

如果你感兴趣,完全可以在上面很轻松的开发出属于自己的android机器人,而且完全不输于小黄鸡啊,小y啊,你要认真的往里填写语料,填写各种场景对话的逻辑,你的机器人也会变得非常有趣。

posted @ 2014-04-08 08:18  西风逍遥游  阅读(362)  评论(0编辑  收藏  举报