Lucene之中文分词器

中文分词器

什么是中文分词器

对于英文,是安装空格、标点符号进行分词
对于中文,应该安装具体的词来分,中文分词就是将词,切分成一个个有意义的词。

比如:“我的中国人”,分词:我、的、中国、中国人、国人。

Lucene自带的中文分词器

StandardAnalyzer:

单字分词:就是按照中文一个字一个字地进行分词。如:“我爱中国”,
效果:“我”、“爱”、“中”、“国”。

CJKAnalyzer

二分法分词:按两个字进行切分。如:“我是中国人”,效果:“我是”、“是中”、“中国”“国人”。

上边两个分词器无法满足需求。

第三方中文分词器

名称 最近更新 速度(网上情报) 扩展性支持、其它
mmseg4j 2013 complex 60W字/s (1200 KB/s)
simple 100W字/s (1900 KB/s)
使用sougou词库,也可自定义(complex\simple\MaxWord)
IKAnalyzer 2012 IK2012 160W字/s (3000KB/s) 支持用户词典扩展定义、支持自定义停止词(智能\细粒度)
Ansj 2014 BaseAnalysis 300W字/s
hlAnalysis 40W字/s
支持用户自定义词典,可以分析出词性,有新词发现功能
paoding 2008 100W字/s 支持不限制个数的用户自定义词库

注意:
中文分词器可能与最新版本Lucene不兼容,配置好运行时出现TokenStream contractviolation错误,对于mmseg4j需要更改com.chenlb.mmseg4j.analysis.MMSegTokenizer源码,添加super.reset()reset()内,重新编译后替换原jar。

注意:
lucene 4.6.0以上版本使用IKAnalyzer时可能会出现以下异常:

java.lang.illegalstateexception:tokenstream contract violation: reset()/close() call missing, reset() calledmultiple times, or subclass does not call super.reset(). please see javadocs oftokenstream class for more information about the correct consuming workflow.

因为lucene从4.6.0开始tokenstream使用方法更改的问题,在使用incrementtoken方法前必须调用reset方法

解决方法:更改代码为如下代码

IKAnalyzer analyzer = newIKAnalyzer(true);  
StringReader reader = new StringReader(news);  
TokenStream ts = analyzer.tokenStream("", reader);  
CharTermAttribute term = ts.getAttribute(CharTermAttribute.class);  
ts.reset();  
while(ts.incrementToken()){  
   System.out.print(term.toString()+"|");  
}  
analyzer.close();  
reader.close();  

这个是我在学习Lucene时所做的项目,或许对你们有所帮助 《Lucene6.6.2API示例下载》

阅读更多
换一批

没有更多推荐了,返回首页