一、   为什么Alice不支持中文
因为Alice的question都会被bitoflife.chatterbean.text.Transformations类中的fit函数过滤,而过滤的表达式就是:

private finalPattern fitting = Pattern.compile("[^A-Z0-9]+");

只会保留英文字符和数字字符。顺带说一句,因为Alice会将question全部转为大写,所以上面的表达式中没有a-z区间。

为了让中文不被过滤掉,就将上面的过滤式中添加中文字符。

privatefinal Pattern fitting = Pattern.compile("[^A-Z0-9\u4e00-\u9FA5]+")

二、   Alice支持中文的原理
先解释一下,Alice对英文支持的原理:

简而言之:在语料库中,找出匹配的用户question的pattern,再返回pattern对应的template内容作为answer。

详细点就是:Alice初始化时,将AIML文件中的<pattern>标签的内容根据空格切分,组成一个Graphmaster对象;用户的question也根据空格切分,根据匹配算法在Graphmaster对象中找到匹配的pattern标签,再返回该pattern对应的template内容。

Graphmaster参考:http://www.alicebot.org/documentation/matching.html

Alice支持英文中的关键一点就是:英文输入有空格,而中文输入没有空格,Alice就不会切分中文字符,只会把整个中文语句当做英文中一个单词。

所以支持中文的关键一点就是:为中文语句加空格。

马上想到了中文分词器,我用的是IK分词器.接下来问题就转化为:怎么为中文语句加空格?在什么地方加空格?

有两个地方要处理:

² 读取AIML文件中的pattern标签时,需要加空格。

² 读取用户question时,要加空格。

三、   代码实践
IK分词器封装函数
         这是就不多说了,csdn博客多得是IK分词器用法。

public static StringIKAnalysis(String str) {

if(str.getBytes().length == str.length()) {
//如果不包含中文,就直接返回。
return str;
}else {
//由于IK分词器,不支持特殊字符,所以将 * 改为中文字符“这是星号”,中文分词以后再将“这是星号”修正为为 *
//同理将 _改为中文字符串“这是下划线”,中文分词以后再将“这是下划线”修正为 _
str= str.replaceAll("\\*","这是星号").replaceAll("_","这是下划线");
}

StringBuffersb =new StringBuffer();
try {
byte[] bt =str.getBytes();
InputStreamip =new ByteArrayInputStream(bt);
Readerread =new InputStreamReader(ip);
//设置为智能分词
IKSegmenteriks =new IKSegmenter(read,true);
Lexemet;
while ((t =iks.next()) !=null) {
//在每个分词元之后添加空格
sb.append(t.getLexemeText()+" ");
}
//sb.delete(sb.length() - 1, sb.length());
}catch (IOException e) {
//TODOAuto-generated catch block
}

returnsb.toString().replaceAll("这是星号","*").replaceAll("这是下划线","_");
}

读取AIML文件的pattern标签时加空格
         AIML的读取解析工作由bitoflife.chatterbean.aiml.AIMLHandler类完成的。

修改pushTextNode函数,根据参数来判断是否调用中文分词器。

/**
*将一个节点的文本信息压入栈中,并根据参数决定是否调用中文分词器。
*@param isToSegment 标识是否调用中文分词器
*/
privatevoidpushTextNode(Boolean isToSegment) {
Stringpushed =text.toString();
text.delete(0,text.length());
if (ignoreWhitespace)
pushed= pushed.replaceAll("^[\\s\n]+|[\\s\n]{2,}|\n","");

if (!"".equals(pushed.trim())){
if(!isToSegment) {
stack.push(newText(pushed));
}else {
pushed= pushed.toUpperCase();
stack.push(newText(cn.edu.scut.cs.IKAnalyzer.ChineseSegmenter.IKAnalysis(pushed)));
}
}
}
在startElement和endElement函数中为pattern和that标签内的中文字符添加空格。将pushTextNode()函数的调用语句改为:

pushTextNode(qname.toLowerCase().equals("pattern")

||qname.toLowerCase().equals("that"));

顺带说一句that标签也可能需要中文分词的。

读取用户question时加空格
         这个很简单,在public void normalization(Sentencesentence)函数中第二行添加调用中文分词函数:

input =cn.edu.scut.cs.IKAnalyzer.ChineseSegmenter.IKAnalysis(input);
---------------------
作者:zhang-hui
来源:CSDN
原文:https://blog.csdn.net/zhang_hui_cs/article/details/22686951
版权声明:本文为博主原创文章,转载请附上博文链接!

alicebot的更多相关文章

  1. Artificial intelligence(AI)

    ORM: https://github.com/sunkaixuan/SqlSugar 微软DEMO: https://github.com/Microsoft/BotBuilder 注册KEY:ht ...

  2. 用 AIML 开发人工智能聊天机器人

    借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人.AIML 指的是 Artificial Intelligence Markup Language (人工智能标记语言),它不过是 ...

  3. 用PyAIML开发简单的对话机器人

    AIML files are a subset of Extensible Mark-up Language (XML) that can store different text patterns ...

  4. PHP人工智能库

    PHP虽然不是人工智能语言,但做人工智能理论上没问题,下面本人整理了一些PHP人工智能库.1.NLPTools(http://php-nlp-tools.com/)NLPTools是一个PHP自然语言 ...

  5. ALICE源代码分析

    前言 ALICE(爱丽丝)事实上是"人工语言计算机实体"的英文缩写. 它以前在往年(2000年.2001年和2004年)的勒布纳人工智能奖角逐中三次获胜.并在其它年度中也获过骄人的 ...

  6. PHP常用人工智能库

    1.NLPTools(http://php-nlp-tools.com/)NLPTools是一个PHP自然语言处理库.能进行文本分级,聚类等操作.2.Prediction Builder(https: ...

  7. 十个Chatbot框架介绍

    十个Chatbot框架介绍 原创 2016年12月13日 16:01:23 4616 Chatbot列表 1.  Artificial Intelligence Markup Language    ...

  8. http://www.freeopensourcesoftware.org

    Applications http://www.freeopensourcesoftware.org/index.php?title=Applications   Main Page > Thi ...

随机推荐

  1. generator的本质是将异步的管理剥离

    generator的本质是将异步的管理剥离

  2. C# vb .NET生成QR二维码

    二维码比条形码具有更多优势,有些场合使用二维码比较多,比如支付.通过将某些数据生成二维码,就可以实现一码走天下.那么如何在C#,.Net平台代码里生成二维码呢?答案是使用SharpBarcode! S ...

  3. 安装Redis(Windows版)

    1,GitHub下载地址:https://github.com/MicrosoftArchive/redis/tags 2,进行安装(一直下一步即可) 注:我这里安装的地址是 D:Redis 3,在电 ...

  4. css sprite responsive实现探究

    在做web app前端设计时,为了减少http的请求,提高系统响应时间,有一个非常常见的优化措施是:将所有用到的静态的图片通过合并形成一个sprite.png,并且配合background-posit ...

  5. python3之二年级上数学练习题生成

    二年级上数学练习题生成 作为一个家长不容易啊 1 #coding:utf-8 2 import random 3 #小学二年级上数学练习(100以内加减乘) 4 #生成的题数 5 count = 50 ...

  6. JPA笔记4 ManyToMany

    package many_to_many; import java.util.HashSet; import java.util.Set; import javax.persistence.Entit ...

  7. golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的

    golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的 1:执行脚本setGoPath.sh#!/bin/bashif [[ $GOPATH =~ .*$ ...

  8. Linux中用postfix搭建邮件服务器实战详解

    Linux中用postfix搭建邮件服务器实战详解 postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件.Postfix试图更快.更容易管理.更安全,同时 ...

  9. 基于Proxy的小程序状态管理

    摘要: 小程序状态管理. 作者:wwayne 原文:基于Proxy的小程序状态管理 Fundebug经授权转载,版权归原作者所有. 微信小程序的市场在进一步的扩大,而背后的技术社区仍在摸索着最好的实践 ...

  10. 关于使用Hadoop MR的Eclipse插件开发时遇到Permission denied问题的解决办法【转】

    搭建了一个Hadoop的环境,Hadoop集群环境部署在几个Linux服务器上,现在想使用windows上的Java客户端来操作集群中的HDFS文件,但是在客户端运行时出现了如下的认证错误,被折磨了几 ...