开源中文分词框架分词效果对比smartcn与IKanalyzer

简介: 一、引言:   中文分词一直是自然语言处理的一个痛处,早在08年的时候,就曾经有项目涉及到相关的应用(Lunce构建全文搜索引擎),那时的痛,没想到5年后的今天依然存在,切分效果、扩展支持、业务应用等方面依然不甚理想。

一、引言:

  中文分词一直是自然语言处理的一个痛处,早在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示例程序

 1 package dictTest;
 2 
 3 import java.util.Iterator;
 4 
 5 import org.apache.lucene.analysis.TokenStream;
 6 import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
 7 import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
 8 import org.apache.lucene.analysis.util.CharArraySet;
 9 import org.apache.lucene.util.Version;
10 
11 public class SmartChineseAnalyzerTest {
12 
13     public static void main(String[] args) {
14         try {
15             // 要处理的文本
16             String text = "lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
17             //String text = "目前我已经用了lucene4.0,虽然是alpha版,但是也是未来的第一步。但是IKAnalyzer不支持lucene4,如果作者在,是否有计划对4支持?何时支持?";
18             // 自定义停用词
19             String[] self_stop_words = { "的", "在","了", "呢", ",", "0", ":", ",", "是", "流" };
20             CharArraySet cas = new CharArraySet(Version.LUCENE_46, 0, true);
21             for (int i = 0; i < self_stop_words.length; i++) {
22                 cas.add(self_stop_words[i]);
23             }
24 
25             // 加入系统默认停用词
26             Iterator<Object> itor = SmartChineseAnalyzer.getDefaultStopSet().iterator();
27             while (itor.hasNext()) {
28                 cas.add(itor.next());
29             }
30             
31 
32             // 中英文混合分词器(其他几个分词器对中文的分析都不行)
33             SmartChineseAnalyzer sca = new SmartChineseAnalyzer(Version.LUCENE_46, cas);
34 
35             TokenStream ts = sca.tokenStream("field", text);
36             CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);
37 
38             ts.reset();
39             while (ts.incrementToken()) {
40                 System.out.print(ch.toString()+"\\");
41             }
42             ts.end();
43             ts.close();
44         } catch (Exception ex) {
45             ex.printStackTrace();
46         }
47     }
48 
49 }

四、IKanalyzer示例程序

 1 package dictTest;
 2 
 3 import org.wltea.analyzer.*;
 4 import org.apache.lucene.analysis.Analyzer;
 5 import org.apache.lucene.analysis.TokenStream;
 6 import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
 7 import org.wltea.analyzer.lucene.*;
 8 
 9 public class IKAnalyzerTest {
10 
11     public static void main(String[] args) {
12         // TODO Auto-generated method stub
13         Analyzer ik  = new IKAnalyzer();
14         try{
15             String text = "lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
16             TokenStream ts = ik.tokenStream("field", text);
17             
18             CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);
19 
20             ts.reset();
21             while (ts.incrementToken()) {
22                 //System.out.println(ch.toString());
23                 System.out.print(ch.toString() + "\\");
24             }
25             ts.end();
26             ts.close();
27             
28         } catch (Exception ex) {
29             ex.printStackTrace();
30         }    
31         
32     }
33 }

五、结论

1.二者分词效果,相比其他已经不错,都值得肯定;

2.smartcn为Lucene4.6版本自带(之前版本也有),中文分词不错,英文分词有问题,Lucene分词后变成了Luncn;

3.IKAnalyzer分词后的碎片太多,可以和人工分析效果做对比;

4.从自定义词库的角度考虑,因为smartcn在Lucene4.6中的版本,目前不支持自定义词库,成为致命缺陷,只能放弃。


作者:张子良
出处:http://www.cnblogs.com/hadoopdev
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

相关文章
|
6月前
|
自然语言处理 应用服务中间件
43分布式电商项目 - 中文分词器IK Analyzer配置
43分布式电商项目 - 中文分词器IK Analyzer配置
30 0
|
9月前
|
自然语言处理 BI
|
11月前
|
自然语言处理 安全 关系型数据库
白话Elasticsearch30-IK中文分词之热更新IK词库
白话Elasticsearch30-IK中文分词之热更新IK词库
124 0
|
自然语言处理
IKAnalyzer - 轻量级的中文分词工具
采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。 采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。
1142 0
|
自然语言处理
Ansj与hanlp分词工具对比
一、Ansj1、利用DicAnalysis可以自定义词库: 2、但是自定义词库存在局限性,导致有些情况无效:比如:“不好用“的正常分词结果:“不好,用”。 (1)当自定义词库”好用“时,词库无效,分词结果不变。
1057 0
|
自然语言处理 Java Maven
HanLP中文分词Lucene插件
基于HanLP,支持包括Solr(7.x)在内的任何基于Lucene(7.x)的系统。
1965 0
|
自然语言处理 算法 测试技术
分词工具Hanlp基于感知机的中文分词框架
结构化感知机标注框架是一套利用感知机做序列标注任务,并且应用到中文分词、词性标注与命名实体识别这三个问题的完整在线学习框架,该框架利用
2042 0
|
机器学习/深度学习 人工智能 自然语言处理
|
自然语言处理 搜索推荐 Java
Hanlp等七种优秀的开源中文分词库推荐
中文分词是中文文本处理的基础步骤,也是中文人机自然语言交互的基础模块。由于中文句子中没有词的界限,因此在进行中文自然语言处理时,通常需要先进行分词。
3740 0
|
自然语言处理 Linux
中文分词工具比较
五款中文分词工具的比较,尝试的有jieba,SnowNLP,thulac(清华大学自然语言处理与社会人文计算实验室),StanfordCoreNLP,pyltp(哈工大语言云),环境是Win10,anaconda3.
4989 0