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 ...
随机推荐
- 使用AspectCore实现AOP模式的Redis缓存
这次的目标是实现通过标注Attribute实现缓存的功能,精简代码,减少缓存的代码侵入业务代码. 缓存内容即为Service查询汇总的内容,不做其他高大上的功能,提升短时间多次查询的响应速度,适当减轻 ...
- 在.NET Core 3.0 Preview上使用Windows窗体设计器
支持使用基于Windows窗体应用程序的.NET Core 3.0(预览)的Windows窗体设计器 介绍 截至撰写本文时,Microsoft和社区目前正在测试.NET Core 3.0.如果您在.N ...
- Python - 面向对象 - 第二十天
Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过 ...
- 华为手机 android8.0APP更新时出现安装包解析异常的提示及安装闪退(无反应)问题
在做android app升级更新时遇到几个问题,我用的测试机是华为V10 系统为8.0 一.安装闪退(无反应) 解决办法: 只要在Mainfest.xml 中加入权限编码即可解决 <uses- ...
- 利用Python模拟登录pastebin.com
任务 在https://pastebin.com网站注册一个账号,利用python实现用户的自动登录和创建paste.该任务需要分成如下两步利用python实现: 账号的自动登录 paste的自动创建 ...
- 关于重学Linux的随笔
毕业已有半年, 现在想想真的后悔, 大学没有认真学Linux, 导致现在Linux操作抓瞎, 连服务器都搭不起来. 下定决心重学Linux, 不追求能比上大佬, 但是要熟练, 常用命令要熟悉. 作为一 ...
- [基础]斯坦福cs231n课程视频笔记(二) 神经网络的介绍
目录 Introduction to Neural Networks BP Nerual Network Convolutional Neural Network Introduction to Ne ...
- Spark之RDD
Spark学习之路Spark之RDD 目录 一.RDD的概述 1.1 什么是RDD? RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数 ...
- 2.1 Scala语言概述
一.编程范式 命令式编程没有办法充分利用多核CPU: 函数式编程很多变量是不可修改的. 二.Scala简介 特点 scala运行在JVM上,兼容现有的Java程序: 面向对象的编程语言: 一门函数式语 ...
- jmeter压测学习3-提取json数据里面的token参数关联
前言 现在很多接口的登录是返回一个json数据,token值在返回的json里面,在jmeter里面也可以直接提取json里面的值. 上一个接口返回的token作为下个接口的入参. 案例场景 我现在有 ...