中文分词器
什么是中文分词器
对于英文,是安装空格、标点符号进行分词
对于中文,应该安装具体的词来分,中文分词就是将词,切分成一个个有意义的词。
比如:“我的中国人”,分词:我、的、中国、中国人、国人。
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示例下载》