作者:ceclar123
推荐:刘超觉先
package bond.lucene.analyzer; ???import org.apache.lucene.analysis.TokenStream; ?import org.apache.lucene.analysis.core.WhitespaceAnalyzer; ?import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; ?import org.apache.lucene.util.Version; ???public class WhitespaceAnalyzerTest { ???????public static void main(String[] args) { ?????????try { ?????????????// 要处理的文本 ?????????????// "lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理"; ?????????????String text = "The Lucene PMC is pleased to announce the release of the Apache Solr Reference Guide for Solr 4.4."; ???????????????// 空格分词器(以空格作为切词标准,不对语汇单元进行其他规范化处理) ?????????????WhitespaceAnalyzer wsa = new WhitespaceAnalyzer(Version.LUCENE_44); ???????????????TokenStream ts = wsa.tokenStream("field", text); ?????????????CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class); ???????????????ts.reset(); ?????????????while (ts.incrementToken()) { ?????????????????System.out.println(ch.toString()); ?????????????} ?????????????ts.end(); ?????????????ts.close(); ?????????} catch (Exception ex) { ?????????????ex.printStackTrace(); ?????????} ???????} ?} ?
二、SimpleAnalyzer
以非字母符来分割文本信息,并将语汇单元统一为小写形式,并去掉数字类型的字符。很明显不适用于中文环境。
- packagebond.lucene.analyzer;
- importorg.apache.lucene.analysis.TokenStream;
- importorg.apache.lucene.analysis.core.SimpleAnalyzer;
- importorg.apache.lucene.analysis.tokenattributes.CharTermAttribute;
- importorg.apache.lucene.util.Version;
- publicclassSimpleAnalyzerTest{
- publicstaticvoidmain(String[]args){
- try{
- //要处理的文本
- //"lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
- Stringtext="TheLucenePMCispleasedtoannouncethereleaseoftheApacheSolrReferenceGuideforSolr4.4.";
- //简单分词器(以非字母符来分割文本信息,并将语汇单元统一为小写形式,并去掉数字类型的字符)
- SimpleAnalyzersa=newSimpleAnalyzer(Version.LUCENE_44);
- TokenStreamts=sa.tokenStream("field",text);
- CharTermAttributech=ts.addAttribute(CharTermAttribute.class);
- ts.reset();
- while(ts.incrementToken()){
- System.out.println(ch.toString());
- }
- ts.end();
- ts.close();
- }catch(Exceptionex){
- ex.printStackTrace();
- }
- }
- }
三、StopAnalyzer
停顿词分析器会去除一些常有a,the,an等等,也可以自定义禁用词,不适用于中文环境
- packagebond.lucene.analyzer;
- importjava.util.Iterator;
- importorg.apache.lucene.analysis.TokenStream;
- importorg.apache.lucene.analysis.core.StopAnalyzer;
- importorg.apache.lucene.analysis.tokenattributes.CharTermAttribute;
- importorg.apache.lucene.analysis.util.CharArraySet;
- importorg.apache.lucene.util.Version;
- publicclassStopAnalyzerTest{
- publicstaticvoidmain(String[]args){
- try{
- //要处理的文本
- //"lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
- Stringtext="TheLucenePMCispleasedtoannouncethereleaseoftheApacheSolrReferenceGuideforSolr4.4.";
- //自定义停用词
- String[]self_stop_words={"分析","release","Apache"};
- CharArraySetcas=newCharArraySet(Version.LUCENE_44,0,true);
- for(inti=0;i<self_stop_words.length;i++){
- cas.add(self_stop_words[i]);
- }
- //加入系统默认停用词
- Iterator<Object>itor=StopAnalyzer.ENGLISH_STOP_WORDS_SET.iterator();
- while(itor.hasNext()){
- cas.add(itor.next());
- }
- //停用词分词器(去除一些常有a,the,an等等,也可以自定义禁用词)
- StopAnalyzersa=newStopAnalyzer(Version.LUCENE_44,cas);
- TokenStreamts=sa.tokenStream("field",text);
- CharTermAttributech=ts.addAttribute(CharTermAttribute.class);
- ts.reset();
- while(ts.incrementToken()){
- System.out.println(ch.toString());
- }
- ts.end();
- ts.close();
- }catch(Exceptionex){
- ex.printStackTrace();
- }
- }
- }
四、StandardAnalyzer
标准分析器是Lucene内置的分析器,会将语汇单元转成小写形式,并去除停用词及标点符号,很明显也是不适合于中文环境
- packagebond.lucene.analyzer;
- importjava.util.Iterator;
- importorg.apache.lucene.analysis.TokenStream;
- importorg.apache.lucene.analysis.standard.StandardAnalyzer;
- importorg.apache.lucene.analysis.tokenattributes.CharTermAttribute;
- importorg.apache.lucene.analysis.util.CharArraySet;
- importorg.apache.lucene.util.Version;
- publicclassStandardAnalyzerTest{
- publicstaticvoidmain(String[]args){
- try{
- //要处理的文本
- //"lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
- Stringtext="TheLucenePMCispleasedtoannouncethereleaseoftheApacheSolrReferenceGuideforSolr4.4.";
- //自定义停用词
- String[]self_stop_words={"Lucene","release","Apache"};
- CharArraySetcas=newCharArraySet(Version.LUCENE_44,0,true);
- for(inti=0;i<self_stop_words.length;i++){
- cas.add(self_stop_words[i]);
- }
- //加入系统默认停用词
- Iterator<Object>itor=StandardAnalyzer.STOP_WORDS_SET.iterator();
- while(itor.hasNext()){
- cas.add(itor.next());
- }
- //标准分词器(Lucene内置的标准分析器,会将语汇单元转成小写形式,并去除停用词及标点符号)
- StandardAnalyzersa=newStandardAnalyzer(Version.LUCENE_44,cas);
- TokenStreamts=sa.tokenStream("field",text);
- CharTermAttributech=ts.addAttribute(CharTermAttribute.class);
- ts.reset();
- while(ts.incrementToken()){
- System.out.println(ch.toString());
- }
- ts.end();
- ts.close();
- }catch(Exceptionex){
- ex.printStackTrace();
- }
- }
- }
五、CJKAnalyzer
中日韩分析器,能对中,日,韩语言进行分析的分词器,但是对中文支持效果一般,一般不用
- packagebond.lucene.analyzer;
- importjava.util.Iterator;
- importorg.apache.lucene.analysis.TokenStream;
- importorg.apache.lucene.analysis.cjk.CJKAnalyzer;
- importorg.apache.lucene.analysis.tokenattributes.CharTermAttribute;
- importorg.apache.lucene.analysis.util.CharArraySet;
- importorg.apache.lucene.util.Version;
- publicclassCJKAnalyzerTest{
- publicstaticvoidmain(String[]args){
- try{
- //要处理的文本
- //"TheLucenePMCispleasedtoannouncethereleaseoftheApacheSolrReferenceGuideforSolr4.4.";
- Stringtext="lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
- //自定义停用词
- String[]self_stop_words={"使用","一个","管道"};
- CharArraySetcas=newCharArraySet(Version.LUCENE_44,0,true);
- for(inti=0;i<self_stop_words.length;i++){
- cas.add(self_stop_words[i]);
- }
- //加入系统默认停用词
- Iterator<Object>itor=CJKAnalyzer.getDefaultStopSet().iterator();
- while(itor.hasNext()){
- cas.add(itor.next());
- }
- //CJK分词器(C:China;J:Japan;K:Korea;能对中,日,韩语言进行分析的分词器,对中文支持效果一般,基本不用于中文分词)
- CJKAnalyzersa=newCJKAnalyzer(Version.LUCENE_44,cas);
- TokenStreamts=sa.tokenStream("field",text);
- CharTermAttributech=ts.addAttribute(CharTermAttribute.class);
- ts.reset();
- while(ts.incrementToken()){
- System.out.println(ch.toString());
- }
- ts.end();
- ts.close();
- }catch(Exceptionex){
- ex.printStackTrace();
- }
- }
- }
六、SmartChineseAnalyzer
对中文支持稍好,但扩展性差,扩展词库,禁用词库和同义词库等不好处理
- packagebond.lucene.analyzer;
- importjava.util.Iterator;
- importorg.apache.lucene.analysis.TokenStream;
- importorg.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
- importorg.apache.lucene.analysis.tokenattributes.CharTermAttribute;
- importorg.apache.lucene.analysis.util.CharArraySet;
- importorg.apache.lucene.util.Version;
- publicclassSmartChineseAnalyzerTest{
- publicstaticvoidmain(String[]args){
- try{
- //要处理的文本
- Stringtext="lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
- //自定义停用词
- String[]self_stop_words={"的","了","呢",",","0",":",",","是","流"};
- CharArraySetcas=newCharArraySet(Version.LUCENE_44,0,true);
- for(inti=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());
- }
- //中英文混合分词器(其他几个分词器对中文的分析都不行)
- SmartChineseAnalyzersca=newSmartChineseAnalyzer(Version.LUCENE_44,cas);
- TokenStreamts=sca.tokenStream("field",text);
- CharTermAttributech=ts.addAttribute(CharTermAttribute.class);
- ts.reset();
- while(ts.incrementToken()){
- System.out.println(ch.toString());
- }
- ts.end();
- ts.close();
- }catch(Exceptionex){
- ex.printStackTrace();
- }
- }
- }
针对中文的分词处理,整体来说,Lucene的处理不是很好的,我同学推荐了一个分词效果好,扩展起来也很方便的开源库
http://nlp.stanford.edu/software/segmenter.shtml
现在还没有研究,运行了一个demo,发现分词效果很好
Lucene 4.4.0中常用的几个分词器
原文地址:http://www.cnblogs.com/lxl57610/p/7570083.html