码迷,mamicode.com
首页 > Web开发 > 详细

Lucene 4.4.0中常用的几个分词器

时间:2017-09-21 19:18:30      阅读:333      评论:0      收藏:0      [点我收藏+]

标签:分析器   future   nlp   except   字母   star   china   ide   研究   

作者: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

 

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

 

 
  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等等,也可以自定义禁用词,不适用于中文环境

 
  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, 0, true);  
  22.             for (int i = 0; i < self_stop_words.length; i++) {  
  23.                 cas.add(self_stop_words[i]);  
  24.             }  
  25.   
  26.             // 加入系统默认停用词  
  27.             Iterator<Object> 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. }  


四、StandardAnalyzer

 

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

 
  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, 0, true);  
  22.             for (int i = 0; i < self_stop_words.length; i++) {  
  23.                 cas.add(self_stop_words[i]);  
  24.             }  
  25.   
  26.             // 加入系统默认停用词  
  27.             Iterator<Object> 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. }  


五、CJKAnalyzer

 

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

 
  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, 0, true);  
  23.             for (int i = 0; i < self_stop_words.length; i++) {  
  24.                 cas.add(self_stop_words[i]);  
  25.             }  
  26.   
  27.             // 加入系统默认停用词  
  28.             Iterator<Object> 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. }  


六、SmartChineseAnalyzer

 

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

 
  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, 0, true);  
  21.             for (int i = 0; i < self_stop_words.length; i++) {  
  22.                 cas.add(self_stop_words[i]);  
  23.             }  
  24.   
  25.             // 加入系统默认停用词  
  26.             Iterator<Object> 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. }  


针对中文的分词处理,整体来说,Lucene的处理不是很好的,我同学推荐了一个分词效果好,扩展起来也很方便的开源库

 

http://nlp.stanford.edu/software/segmenter.shtml

现在还没有研究,运行了一个demo,发现分词效果很好

Lucene 4.4.0中常用的几个分词器

标签:分析器   future   nlp   except   字母   star   china   ide   研究   

原文地址:http://www.cnblogs.com/lxl57610/p/7570083.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!