今天下午在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]+$", " ");
否则
.util类正如其名字,是一些小工具类,还包括一个在文件夹下搜索文件的Searcher类
介绍到这里,就对机器人有了一个整体的认识了,修改成中文机器人的方法还没完,
也许还应该对其增加个分词器,不过这也不是最必要的,因为如果这个时候,aiml语法中的词都是分开的,输入时的词都是分开的,这已经可以识别了。
恩,中文机器人还不算太复杂吧,源代码我就上传到github上了,因为我用的是讯飞做语音识别,所以讯飞语音的id应该改,可以自己注册一个号,反正也是免费的,因为我的机器人并未上线审核,所以id是有每天500次的限制啊,而且还有奇怪的和自娱自乐的对话。。。
如果你感兴趣,完全可以在上面很轻松的开发出属于自己的android机器人,而且完全不输于小黄鸡啊,小y啊,你要认真的往里填写语料,填写各种场景对话的逻辑,你的机器人也会变得非常有趣。
原文:http://www.cnblogs.com/sunxfancy/p/3651201.html