alicebot
一、 为什么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的更多相关文章
- Artificial intelligence(AI)
ORM: https://github.com/sunkaixuan/SqlSugar 微软DEMO: https://github.com/Microsoft/BotBuilder 注册KEY:ht ...
- 用 AIML 开发人工智能聊天机器人
借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人.AIML 指的是 Artificial Intelligence Markup Language (人工智能标记语言),它不过是 ...
- 用PyAIML开发简单的对话机器人
AIML files are a subset of Extensible Mark-up Language (XML) that can store different text patterns ...
- PHP人工智能库
PHP虽然不是人工智能语言,但做人工智能理论上没问题,下面本人整理了一些PHP人工智能库.1.NLPTools(http://php-nlp-tools.com/)NLPTools是一个PHP自然语言 ...
- ALICE源代码分析
前言 ALICE(爱丽丝)事实上是"人工语言计算机实体"的英文缩写. 它以前在往年(2000年.2001年和2004年)的勒布纳人工智能奖角逐中三次获胜.并在其它年度中也获过骄人的 ...
- PHP常用人工智能库
1.NLPTools(http://php-nlp-tools.com/)NLPTools是一个PHP自然语言处理库.能进行文本分级,聚类等操作.2.Prediction Builder(https: ...
- 十个Chatbot框架介绍
十个Chatbot框架介绍 原创 2016年12月13日 16:01:23 4616 Chatbot列表 1. Artificial Intelligence Markup Language ...
- http://www.freeopensourcesoftware.org
Applications http://www.freeopensourcesoftware.org/index.php?title=Applications Main Page > Thi ...
随机推荐
- C# - VS2019WinFrm桌面应用程序FtpClient实现
前言 本篇主要记录:VS2019 WinFrm桌面应用程序实现简单的FtpClient,包含Ftp文件查看.上传和下载等功能. 准备工作 搭建WinFrm前台界面 添加必要的控件,这里主要应用到Gro ...
- VMware与 Device/Credential Guard 不兼容,解决办法及心得
以下为心路历程,想要直接解决可以直接拉到最后看后续 百度要你取消Hyper-V功能,但我要用docker,以及一些相关的帖子都无效的情况下 https://blog.csdn.net/u0136677 ...
- Java生鲜电商平台-商品价格的设计与架构
Java生鲜电商平台-商品价格的设计与架构 说明:Java开源生鲜电商平台-商品价格的设计与架构,主要是对商品的价格进行研究与系统架构. 一.常见的电商价格 市场价(List Price):这个价格仅 ...
- win10自动休眠解决方法
win10使用外接显示器时,总是过2分钟自动睡眠. 这是系统无人值守时睡眠时间的设定,默认是两分钟. 解决方法: 1.运行注册表管理器,win+r ,输入regedit.exe 2.定位到HKEY_L ...
- java.lang.NoSuchMethodError的通用解决思路
NoSuchMethodError中文意思是没有找到方法,遇到这个错误并不是说依赖的jar包.方法不存在而找不到,这就类似于 ClassNotFoundException错误了,出现ClassNotF ...
- PHP-FPM Fastcgi 未授权访问漏洞
漏洞原理 Fastcgi Fastcgi是一个通信协议,和HTTP协议一样,都是进行数据交换的一个通道.HTTP协议是浏览器和服务器中间件进行数据交换的协议,浏览器将HTTP头和HTTP体用某个规则组 ...
- 【AI测试】也许这有你想知道的人工智能 (AI) 测试--开篇
人工智能测试 什么是人工智能,人工智能是怎么测试的.可能是大家一开始最想了解的. 大家看图中关于人工智能的定义.通俗点来说呢,就是 让机器实现原来只有人类才能完成的任务:比如看懂照片,听懂说话,思考等 ...
- Bootstrap Table列宽拖动的方法
在之前做过的一个web项目中,前端表格是基于jQuery和Bootstrap Table实现的,要求能利用拖动改变列宽,现将实现的过程记录如下: 1. Bootstrap Table可拖动,需要用到它 ...
- 澄清Fundebug录屏技术的几点误会
1. "视频"并非真的视频.也不是通过连续播放大量截图来实现 首先请大家观看这个视频: 视频中,当鼠标点击"场景重现",会立即播放一段"视频" ...
- redis高并发总结
Redis是单线程的,省去了很多上下文切换线程的时间:(官方答案:因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽.既然单线程容易实现, ...