一、引言:

  中文分词一直是自然语言处理的一个痛处,早在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的更多相关文章

  1. 渴切-开源中文css框架

    渴切:是国内优秀的开源css框架. 渴切是一个开源中文 (X)HTML/CSS 框架 ,它的目的是减少你的css开发时间.它提供一个可靠的css基础去创建你的项目,能够用于网站的快速设计,通过重设和重 ...

  2. smartcn与IKanalyzer

    开源中文分词框架分词效果对比smartcn与IKanalyzer 项目背景: 某银行呼叫中心工单数据挖掘和分析项目,旨在利用文本计算实现热点聚焦和舆情分析. 一.引言: 中文分词一直是自然语言处理的一 ...

  3. 11大Java开源中文分词器的使用方法和分词效果对比

    本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那 ...

  4. 11大Java开源中文分词器的使用方法和分词效果对比,当前几个主要的Lucene中文分词器的比较

    本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那 ...

  5. 推荐十款java开源中文分词组件

    1:Elasticsearch的开源中文分词器 IK Analysis(Star:2471) IK中文分词器在Elasticsearch上的使用.原生IK中文分词是从文件系统中读取词典,es-ik本身 ...

  6. 开源中文分词工具探析(五):FNLP

    FNLP是由Fudan NLP实验室的邱锡鹏老师开源的一套Java写就的中文NLP工具包,提供诸如分词.词性标注.文本分类.依存句法分析等功能. [开源中文分词工具探析]系列: 中文分词工具探析(一) ...

  7. 开源中文分词工具探析(五):Stanford CoreNLP

    CoreNLP是由斯坦福大学开源的一套Java NLP工具,提供诸如:词性标注(part-of-speech (POS) tagger).命名实体识别(named entity recognizer ...

  8. 开源中文分词工具探析(六):Stanford CoreNLP

    CoreNLP是由斯坦福大学开源的一套Java NLP工具,提供诸如:词性标注(part-of-speech (POS) tagger).命名实体识别(named entity recognizer ...

  9. 开源中文分词工具探析(三):Ansj

    Ansj是由孙健(ansjsun)开源的一个中文分词器,为ICTLAS的Java版本,也采用了Bigram + HMM分词模型(可参考我之前写的文章):在Bigram分词的基础上,识别未登录词,以提高 ...

随机推荐

  1. Netty入门(四)ByteBuf 字节级别的操作

     Netty 中使用 ByteBuf 代替 Java NIO 提供的 ByteBuffer 作为字节的容器. 一.索引 ByteBuf 提供两个指针变量支持读和写操作,读操作使用 readerInde ...

  2. k8s mongodb 集群配置

    service.yaml apiVersion: v1 kind: Service metadata: name: mongo labels: name: mongo spec: ports: - p ...

  3. OpenCV——开操作、闭操作、形态学梯度、顶帽、黑帽

    ---恢复内容开始--- ---恢复内容结束---

  4. Advanced Javascript outlining插件说明

    Advanced Javascript outlining插件 用途:在js文件中写入#region/#endregion代码组合段,可收缩和展开.类似于后台页面的region用法. 效果截图如下(前 ...

  5. office2016word 每次打开都有进度条问题 解决方式

      最佳答案   每次打开Office 2016都提示配置进度(包括Word.PPT.Excel等等Office产品都有这种现象),如图,先是显示“安装程序正在准备必要的文件”,接着显示“正在配置Mi ...

  6. Transaction Check Error:file /usr/libexec/getconf/default conflicts between attempted installs of gcc-6.4.1-1.fc25.i686 and gcc-6.4.1-1.fc25.x86_64

    今天在我的ubuntu系统上使用yum来安装软件时出错了错误:Transaction Check Error:file /usr/libexec/getconf/default conflicts b ...

  7. python基础1之python介绍、安装、变量和字符编码、数据类型、输入输出、数据运算、循环

    开启python之路 内容概要: 一.python介绍 二.安装 三.第一个python程序 四.变量和字符编码 五.用户输入 六.数据类型 七.一切皆对象 八.数据运算 九.if else 流程判断 ...

  8. 【php增删改查实例】第七节 - 部门管理模块(画一个datagrid表格)

    在easyui中,datagrid组件需要用一个table标签去渲染. <table id="grid0" title="部门管理" class=&quo ...

  9. [Deep-Learning-with-Python]机器学习基础

    机器学习类型 机器学习模型评估步骤 深度学习数据准备 特征工程 过拟合 解决机器学习问题的一般性流程 机器学习四分支 二分类.多分类以及回归问题都属于监督学习--目标是学习训练输入和对应标签之间的关系 ...

  10. PHP 练习(租房子)

    一.题目要求 二.题目做法 1.建立数据库 2.封装类文件 <?php class DBDA { public $fuwuqi="localhost"; //服务器地址 pu ...