Lucene中常用的几个分词器

来自网页:http://blog.csdn.net/ceclar123/article/details/10150839

一、WhitespaceAnalyzer

以空格作为切词标准,不对语汇单元进行其他规范化处理。很明显这个实用英文,单词之间用空格。

[java]  view plain  copy
  1. package bond.lucene.analyzer;  
  2.   
  3. import org.apache.lucene.analysis.TokenStream;  
  4. import org.apache.lucene.analysis.core.WhitespaceAnalyzer;  
  5. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;  
  6. import org.apache.lucene.util.Version;  
  7.   
  8. public class WhitespaceAnalyzerTest {  
  9.   
  10.     public static void main(String[] args) {  
  11.         try {  
  12.             // 要处理的文本  
  13.             // "lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";  
  14.             String text = "The Lucene PMC is pleased to announce the release of the Apache Solr Reference Guide for Solr 4.4.";  
  15.   
  16.             // 空格分词器(以空格作为切词标准,不对语汇单元进行其他规范化处理)  
  17.             WhitespaceAnalyzer wsa = new WhitespaceAnalyzer(Version.LUCENE_44);  
  18.   
  19.             TokenStream ts = wsa.tokenStream("field", text);  
  20.             CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);  
  21.   
  22.             ts.reset();  
  23.             while (ts.incrementToken()) {  
  24.                 System.out.println(ch.toString());  
  25.             }  
  26.             ts.end();  
  27.             ts.close();  
  28.         } catch (Exception ex) {  
  29.             ex.printStackTrace();  
  30.         }  
  31.   
  32.     }  
  33. }  
二、SimpleAnalyzer

以非字母符来分割文本信息,并将语汇单元统一为小写形式,并去掉数字类型的字符。很明显不适用于中文环境。

[java]  view plain  copy
  1. package bond.lucene.analyzer;  
  2.   
  3. import org.apache.lucene.analysis.TokenStream;  
  4. import org.apache.lucene.analysis.core.SimpleAnalyzer;  
  5. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;  
  6. import org.apache.lucene.util.Version;  
  7.   
  8. public class SimpleAnalyzerTest {  
  9.   
  10.     public static void main(String[] args) {  
  11.         try {  
  12.             // 要处理的文本  
  13.             // "lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";  
  14.             String text = "The Lucene PMC is pleased to announce the release of the Apache Solr Reference Guide for Solr 4.4.";  
  15.   
  16.             // 简单分词器(以非字母符来分割文本信息,并将语汇单元统一为小写形式,并去掉数字类型的字符)  
  17.             SimpleAnalyzer sa = new SimpleAnalyzer(Version.LUCENE_44);  
  18.   
  19.             TokenStream ts = sa.tokenStream("field", text);  
  20.             CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);  
  21.   
  22.             ts.reset();  
  23.             while (ts.incrementToken()) {  
  24.                 System.out.println(ch.toString());  
  25.             }  
  26.             ts.end();  
  27.             ts.close();  
  28.         } catch (Exception ex) {  
  29.             ex.printStackTrace();  
  30.         }  
  31.     }  
  32.   
  33. }  

三、StopAnalyzer

停顿词分析器会去除一些常有a,the,an等等,也可以自定义禁用词,不适用于中文环境

[java]  view plain  copy
  1. package bond.lucene.analyzer;  
  2.   
  3. import java.util.Iterator;  
  4.   
  5. import org.apache.lucene.analysis.TokenStream;  
  6. import org.apache.lucene.analysis.core.StopAnalyzer;  
  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 StopAnalyzerTest {  
  12.   
  13.     public static void main(String[] args) {  
  14.         try {  
  15.             // 要处理的文本  
  16.             // "lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";  
  17.             String text = "The Lucene PMC is pleased to announce the release of the Apache Solr Reference Guide for Solr 4.4.";  
  18.   
  19.             // 自定义停用词  
  20.             String[] self_stop_words = { "分析""release""Apache" };  
  21.             CharArraySet cas = new CharArraySet(Version.LUCENE_44, 0true);  
  22.             for (int i = 0; i < self_stop_words.length; i++) {  
  23.                 cas.add(self_stop_words[i]);  
  24.             }  
  25.   
  26.             // 加入系统默认停用词  
  27.             Iterator itor = StopAnalyzer.ENGLISH_STOP_WORDS_SET.iterator();  
  28.             while (itor.hasNext()) {  
  29.                 cas.add(itor.next());  
  30.             }  
  31.   
  32.             // 停用词分词器(去除一些常有a,the,an等等,也可以自定义禁用词)  
  33.             StopAnalyzer sa = new StopAnalyzer(Version.LUCENE_44, cas);  
  34.   
  35.             TokenStream ts = sa.tokenStream("field", text);  
  36.             CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);  
  37.   
  38.             ts.reset();  
  39.             while (ts.incrementToken()) {  
  40.                 System.out.println(ch.toString());  
  41.             }  
  42.             ts.end();  
  43.             ts.close();  
  44.         } catch (Exception ex) {  
  45.             ex.printStackTrace();  
  46.         }  
  47.     }  
  48. }  

  49. 四、StandardAnalyzer

    标准分析器是Lucene内置的分析器,会将语汇单元转成小写形式,并去除停用词及标点符号,很明显也是不适合于中文环境

    [java]  view plain  copy
    1. package bond.lucene.analyzer;  
    2.   
    3. import java.util.Iterator;  
    4.   
    5. import org.apache.lucene.analysis.TokenStream;  
    6. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
    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 StandardAnalyzerTest {  
    12.   
    13.     public static void main(String[] args) {  
    14.         try {  
    15.             // 要处理的文本  
    16.             // "lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";  
    17.             String text = "The Lucene PMC is pleased to announce the release of the Apache Solr Reference Guide for Solr 4.4.";  
    18.   
    19.             // 自定义停用词  
    20.             String[] self_stop_words = { "Lucene""release""Apache" };  
    21.             CharArraySet cas = new CharArraySet(Version.LUCENE_44, 0true);  
    22.             for (int i = 0; i < self_stop_words.length; i++) {  
    23.                 cas.add(self_stop_words[i]);  
    24.             }  
    25.   
    26.             // 加入系统默认停用词  
    27.             Iterator itor = StandardAnalyzer.STOP_WORDS_SET.iterator();  
    28.             while (itor.hasNext()) {  
    29.                 cas.add(itor.next());  
    30.             }  
    31.   
    32.             // 标准分词器(Lucene内置的标准分析器,会将语汇单元转成小写形式,并去除停用词及标点符号)  
    33.             StandardAnalyzer sa = new StandardAnalyzer(Version.LUCENE_44, cas);  
    34.   
    35.             TokenStream ts = sa.tokenStream("field", text);  
    36.             CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);  
    37.   
    38.             ts.reset();  
    39.             while (ts.incrementToken()) {  
    40.                 System.out.println(ch.toString());  
    41.             }  
    42.             ts.end();  
    43.             ts.close();  
    44.         } catch (Exception ex) {  
    45.             ex.printStackTrace();  
    46.         }  
    47.     }  
    48.   
    49. }  

    50. 五、CJKAnalyzer

      中日韩分析器,能对中,日,韩语言进行分析的分词器,但是对中文支持效果一般,一般不用

      [java]  view plain  copy
      1. package bond.lucene.analyzer;  
      2.   
      3. import java.util.Iterator;  
      4.   
      5. import org.apache.lucene.analysis.TokenStream;  
      6. import org.apache.lucene.analysis.cjk.CJKAnalyzer;  
      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 CJKAnalyzerTest {  
      12.   
      13.     public static void main(String[] args) {  
      14.         try {  
      15.             // 要处理的文本  
      16.   
      17.             // "The Lucene PMC is pleased to announce the release of the Apache Solr Reference Guide for Solr 4.4.";  
      18.             String text = "lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";  
      19.   
      20.             // 自定义停用词  
      21.             String[] self_stop_words = { "使用""一个""管道" };  
      22.             CharArraySet cas = new CharArraySet(Version.LUCENE_44, 0true);  
      23.             for (int i = 0; i < self_stop_words.length; i++) {  
      24.                 cas.add(self_stop_words[i]);  
      25.             }  
      26.   
      27.             // 加入系统默认停用词  
      28.             Iterator itor = CJKAnalyzer.getDefaultStopSet().iterator();  
      29.             while (itor.hasNext()) {  
      30.                 cas.add(itor.next());  
      31.             }  
      32.   
      33.             // CJK分词器(C:China;J:Japan;K:Korea;能对中,日,韩语言进行分析的分词器,对中文支持效果一般,基本不用于中文分词)  
      34.             CJKAnalyzer sa = new CJKAnalyzer(Version.LUCENE_44, cas);  
      35.   
      36.             TokenStream ts = sa.tokenStream("field", text);  
      37.             CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);  
      38.   
      39.             ts.reset();  
      40.             while (ts.incrementToken()) {  
      41.                 System.out.println(ch.toString());  
      42.             }  
      43.             ts.end();  
      44.             ts.close();  
      45.         } catch (Exception ex) {  
      46.             ex.printStackTrace();  
      47.         }  
      48.     }  
      49.   
      50. }  

      51. 六、SmartChineseAnalyzer

        对中文支持稍好,但扩展性差,扩展词库,禁用词库和同义词库等不好处理

        [java]  view plain  copy
        1. package bond.lucene.analyzer;  
        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.   
        18.             // 自定义停用词  
        19.             String[] self_stop_words = { "的""了""呢"",""0"":"",""是""流" };  
        20.             CharArraySet cas = new CharArraySet(Version.LUCENE_44, 0true);  
        21.             for (int i = 0; i < self_stop_words.length; i++) {  
        22.                 cas.add(self_stop_words[i]);  
        23.             }  
        24.   
        25.             // 加入系统默认停用词  
        26.             Iterator itor = SmartChineseAnalyzer.getDefaultStopSet().iterator();  
        27.             while (itor.hasNext()) {  
        28.                 cas.add(itor.next());  
        29.             }  
        30.   
        31.             // 中英文混合分词器(其他几个分词器对中文的分析都不行)  
        32.             SmartChineseAnalyzer sca = new SmartChineseAnalyzer(Version.LUCENE_44, cas);  
        33.   
        34.             TokenStream ts = sca.tokenStream("field", text);  
        35.             CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);  
        36.   
        37.             ts.reset();  
        38.             while (ts.incrementToken()) {  
        39.                 System.out.println(ch.toString());  
        40.             }  
        41.             ts.end();  
        42.             ts.close();  
        43.         } catch (Exception ex) {  
        44.             ex.printStackTrace();  
        45.         }  
        46.     }  
        47.   
        48. }  

        49. 你可能感兴趣的:(技术总结,Java学习)