Lucene几个分词技术的比较

版权声明:本文为自己学习所记,有什么不对的地方欢迎批评指点! https://blog.csdn.net/flyingdog123/article/details/67637783

  一、分词器简单介绍       

       Lucene的分词技术很多,我下面介绍集中常用的分词技术。

1) 标准分词技术(StandardAnalyzer):标准分词技术对英文来说是不错的,把单词分成一个一个的词根,但是对于中文来说,只是简单的把中文分成一个一个的汉字。

2)IK中文分词器(IKAnalyzer):结合词典分词和文法分析算法的中文分词技术,能够对词典进行扩展,是一个很好的中文分词器。

3)空格分词器(WhitespaceAnalyzer):按照空格切分字符串。

4)简单分词器(SimpleAnalyzer):根据标点符号分词。

5)二分法分词器(CJKAnalyzer):二分法分词技术中每个汉字都会和它前边和后边的汉字组成一个词,也就是说每个汉字都会出现两次,除了首字和末字(前提是纯汉字,没有英文,因为英文会根据词根来分词),这种分词技术会有太多的词,会产生太多冗余。

6)关键词分词器(KeywordAnalyzer):不进行分割。

7)被忽略词分词器(StopAnalyzer):被忽略词如标点符号,这种分词技术和SimpleAnalyzer结果很像。

二、 一个简单的实例

package com.dong.lucene;


import java.io.IOException;
import java.io.StringReader;


import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.analysis.core.KeywordAnalyzer;
import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.analysis.core.StopAnalyzer;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.util.Version;


/**
 * 
 * @ClassName: AnalyzerTest
 * @Description: 各个分词器测试比较
 * @author weisd
 * @date 2017-3-28 下午3:24:34
 *
 */
public class AnalyzerTest {
    //要分词的字符串
    private static String str = "东哥学习不错, Lucene学习。";
    
    /**
     * 
     * @Title: print
     * @Description: 对各个分词技术分词结果进行输出
     * @author weisd
     * @time 2017-3-28 下午3:27:10
     */
    public static void print(Analyzer analyzer){
        StringReader reader = new StringReader(str);
        //使用分词器中的TokenStream 进行分词
        try {
            TokenStream tokenStream = analyzer.tokenStream("", reader);
            tokenStream.reset();
            //下面获取分词结果的CharTermAttribute
            CharTermAttribute term = tokenStream.getAttribute(CharTermAttribute.class);
            System.out.println("分词技术:"+analyzer.getClass());
            while (tokenStream.incrementToken()) {
                System.out.print(term.toString()+"|");
            }
            System.out.println();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
    public static void main(String[] args) {
        Analyzer analyzer = null;
        //标准分词
        analyzer = new StandardAnalyzer(Version.LUCENE_43);
        AnalyzerTest.print(analyzer);
        //中文分词 IK
        
        //空格分词
        analyzer = new WhitespaceAnalyzer(Version.LUCENE_43);
        AnalyzerTest.print(analyzer);
        //
        analyzer = new SimpleAnalyzer(Version.LUCENE_43);
        AnalyzerTest.print(analyzer);
        
        analyzer = new CJKAnalyzer(Version.LUCENE_43);
        AnalyzerTest.print(analyzer);
        
        analyzer = new KeywordAnalyzer();
        AnalyzerTest.print(analyzer);
        
        analyzer = new StopAnalyzer(Version.LUCENE_43);
        AnalyzerTest.print(analyzer);
    }
}


三、分词结果

分词技术:class org.apache.lucene.analysis.standard.StandardAnalyzer
东|哥|学|习|不|错|lucene|学|习|
分词技术:class org.apache.lucene.analysis.core.WhitespaceAnalyzer
东哥学习不错,|Lucene学习。|
分词技术:class org.apache.lucene.analysis.core.SimpleAnalyzer
东哥学习不错|lucene学习|
分词技术:class org.apache.lucene.analysis.cjk.CJKAnalyzer
东哥|哥学|学习|习不|不错|lucene|学习|
分词技术:class org.apache.lucene.analysis.core.KeywordAnalyzer
东哥学习不错, Lucene学习。|
分词技术:class org.apache.lucene.analysis.core.StopAnalyzer
东哥学习不错|lucene学习|


展开阅读全文

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