开源中文分词框架分词效果对比smartcn与IKanalyzer
一、引言:
中文分词一直是自然语言处理的一个痛处,早在08年的时候,就曾经有项目涉及到相关的应用(Lunce构建全文搜索引擎),那时的痛,没想到5年后的今天依然存在,切分效果、扩展支持、业务应用等方面依然不甚理想。收费的版本不提了,原因自不必言表,开源版本中,发现之前曾经活跃的版本,大多已经没落(好几年没更新了),存活下来的寥寥无几。我是一个守旧的人,评估版本的选择有些保守,至少目前为止,只看1.0正式版本之后的版本,0.XX的不在考虑范围之内,用了一个周末的时间,对比了十多款的样子,个人感觉源于中科院ICTCLAS的smartcn和IKAnanlyzer效果还是不错的。
二、结果对比
2.1 原始文本
"lucene\分析器\使用\分词器\和\过滤器\构成\一个\“管道”,文本\在\流经\这个\管道\后\成为\可以\进入\索引\的\最小单位,因此,一个\标准\的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
2.2 smartcn
lucen\分析器\使用\分词\器\和\过滤器\构成\一个\管道\文本\流经\这个\管道\后\成为\可以\进入\索引\最\小\单位\因此\一个\标准\分析器\有\两\个\部分\组成\一个\分词\器\token\它\用于\将\文本\按照\规则\切分\为\一个\个\可以\进入\索引\最\小\单位\另外\一个\tokenfilt\它\主要\作用\对\切\出来\词\进行\进一步\处理\如\去掉\敏感\词\英文\大小写\转换\单\复数\处理\等\lucen\中\tokenstram\方法\首先\创建\一\个\token\对象\处理\reader\对象\中\式\文本\然后\利用\tokenfilt\对\输出\进行\过滤\处理\
2.3 IKanalyzer
lucene\分析器\分析\器使\使用\分词器\分词\器\和\过滤器\过滤\滤器\构成\一个\一\个\管道\文本\在\流经\这个\管道\后\成为\可以\进入\索引\的\最小\单位\因此\一个\一\个\标准\的\分析器\分析\器\有\两个\两\个\部分\分组\组成\一个是\一个\一\个\是\分词器\分词\器\tokenizer\它用\用于\将\文本\按照\规则\切分\切\分为\一个个\一个\一\个个\个\个\可以\进入\索引\的\最小\单位\另外\一个是\一个\一\个\是\tokenfilter\它\主要\作用\用是\对\切出来\切出\切\出来\的\词\进行\行进\进一步\进一\一步\一\步\的\处理\如\去掉\敏感\词\英文\大小写\大小\小写\转换\单\复数\处理\等\lucene\中\的\tokenstram\方法\首先\创建\一个\一\个\tokenizer\对象\处理\reader\对象\中\的\流式\文本\然后\利用\tokenfilter\对\输出\流进\进行\过滤\处理\
三、smartcn示例程序
package dictTest; import java.util.Iterator; import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.util.CharArraySet;
import org.apache.lucene.util.Version; public class SmartChineseAnalyzerTest { public static void main(String[] args) {
try {
// 要处理的文本
String text = "lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
//String text = "目前我已经用了lucene4.0,虽然是alpha版,但是也是未来的第一步。但是IKAnalyzer不支持lucene4,如果作者在,是否有计划对4支持?何时支持?";
// 自定义停用词
String[] self_stop_words = { "的", "在","了", "呢", ",", "0", ":", ",", "是", "流" };
CharArraySet cas = new CharArraySet(Version.LUCENE_46, 0, true);
for (int i = 0; i < self_stop_words.length; i++) {
cas.add(self_stop_words[i]);
} // 加入系统默认停用词
Iterator<Object> itor = SmartChineseAnalyzer.getDefaultStopSet().iterator();
while (itor.hasNext()) {
cas.add(itor.next());
} // 中英文混合分词器(其他几个分词器对中文的分析都不行)
SmartChineseAnalyzer sca = new SmartChineseAnalyzer(Version.LUCENE_46, cas); TokenStream ts = sca.tokenStream("field", text);
CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class); ts.reset();
while (ts.incrementToken()) {
System.out.print(ch.toString()+"\\");
}
ts.end();
ts.close();
} catch (Exception ex) {
ex.printStackTrace();
}
} }
四、IKanalyzer示例程序
package dictTest; import org.wltea.analyzer.*;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.wltea.analyzer.lucene.*; public class IKAnalyzerTest { public static void main(String[] args) {
// TODO Auto-generated method stub
Analyzer ik = new IKAnalyzer();
try{
String text = "lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
TokenStream ts = ik.tokenStream("field", text); CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class); ts.reset();
while (ts.incrementToken()) {
//System.out.println(ch.toString());
System.out.print(ch.toString() + "\\");
}
ts.end();
ts.close(); } catch (Exception ex) {
ex.printStackTrace();
} }
}
五、结论
1.二者分词效果,相比其他已经不错,都值得肯定;
2.smartcn为Lucene4.6版本自带(之前版本也有),中文分词不错,英文分词有问题,Lucene分词后变成了Luncn;
3.IKAnalyzer分词后的碎片太多,可以和人工分析效果做对比;
4.从自定义词库的角度考虑,因为smartcn在Lucene4.6中的版本,目前不支持自定义词库,成为致命缺陷,只能放弃。
开源中文分词框架分词效果对比smartcn与IKanalyzer的更多相关文章
- 渴切-开源中文css框架
渴切:是国内优秀的开源css框架. 渴切是一个开源中文 (X)HTML/CSS 框架 ,它的目的是减少你的css开发时间.它提供一个可靠的css基础去创建你的项目,能够用于网站的快速设计,通过重设和重 ...
- smartcn与IKanalyzer
开源中文分词框架分词效果对比smartcn与IKanalyzer 项目背景: 某银行呼叫中心工单数据挖掘和分析项目,旨在利用文本计算实现热点聚焦和舆情分析. 一.引言: 中文分词一直是自然语言处理的一 ...
- 11大Java开源中文分词器的使用方法和分词效果对比
本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那 ...
- 11大Java开源中文分词器的使用方法和分词效果对比,当前几个主要的Lucene中文分词器的比较
本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那 ...
- 推荐十款java开源中文分词组件
1:Elasticsearch的开源中文分词器 IK Analysis(Star:2471) IK中文分词器在Elasticsearch上的使用.原生IK中文分词是从文件系统中读取词典,es-ik本身 ...
- 开源中文分词工具探析(五):FNLP
FNLP是由Fudan NLP实验室的邱锡鹏老师开源的一套Java写就的中文NLP工具包,提供诸如分词.词性标注.文本分类.依存句法分析等功能. [开源中文分词工具探析]系列: 中文分词工具探析(一) ...
- 开源中文分词工具探析(五):Stanford CoreNLP
CoreNLP是由斯坦福大学开源的一套Java NLP工具,提供诸如:词性标注(part-of-speech (POS) tagger).命名实体识别(named entity recognizer ...
- 开源中文分词工具探析(六):Stanford CoreNLP
CoreNLP是由斯坦福大学开源的一套Java NLP工具,提供诸如:词性标注(part-of-speech (POS) tagger).命名实体识别(named entity recognizer ...
- 开源中文分词工具探析(三):Ansj
Ansj是由孙健(ansjsun)开源的一个中文分词器,为ICTLAS的Java版本,也采用了Bigram + HMM分词模型(可参考我之前写的文章):在Bigram分词的基础上,识别未登录词,以提高 ...
随机推荐
- [Java123] Spring
最近转组需要Hands on进行一些Java开发工作. 已经不是用十几年前初级Java写代码就能应付的了. 踏踏实实拾起来过去含含糊糊走过的章节吧. https://www.cnblogs.com/x ...
- testNG参数化
听说testNG比junit更好用,记录下 环境:springboot2.0+testNG6.8+maven+myeclipse 一 安装 (1)m'yeclipse安装testNg包,下载testN ...
- leetcode338—Counting Bits
Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the ...
- PAT B1040 有几个PAT (25 分)
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T). 现 ...
- 包学会之浅入浅出 Vue.js:开学篇
2016年,乃至接下来整个2017年,如果你要问前端技术框架什么最火,那无疑就是前端三巨头:React.Angular.Vue.没错,什么jQuery,seaJs,gulp等都逐渐脱离了热点.面试的时 ...
- php操作url 函数等
pathinfo() - Returns information about a file path parse_str() - Parses the string into variables pa ...
- 2017-2018-2 20155224『网络对抗技术』Exp5:MSF基础应用
基础问题回答 用自己的话解释什么是exploit,payload,encode? exploit就相当于是载具,将真正要负责攻击的代码传送到靶机中,我觉得老师上课举的火箭和卫星的例子非常形象,火箭只是 ...
- 【第三方插件】使用Topshelf创建Windows服务
概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...
- Class does not Implement Equals——Code Correctness(代码正确性)
系列文章目录: 使用Fortify进行代码静态分析(系列文章) class does not implement equals(类未能实现Equals方法) 示例: protec ...
- [CF1010E]Store[kd-tree]
题意 有一个长方体,不知道它的位置,给出 \(n\) 个一定在长方体内的点和 \(m\) 个一定不在的点,有 \(k\) 次询问,每次询问一个点是否 在.不在.不确定 在长方体内. \(n\leq 1 ...