分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

Lucene 4.4.0中常用的几个分词器

发布时间:2023-09-06 01:12责任编辑:彭小芳关键词:暂无标签

作者: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. packagebond.lucene.analyzer;
  2. importorg.apache.lucene.analysis.TokenStream;
  3. importorg.apache.lucene.analysis.core.SimpleAnalyzer;
  4. importorg.apache.lucene.analysis.tokenattributes.CharTermAttribute;
  5. importorg.apache.lucene.util.Version;
  6. publicclassSimpleAnalyzerTest{
  7. publicstaticvoidmain(String[]args){
  8. try{
  9. //要处理的文本
  10. //"lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
  11. Stringtext="TheLucenePMCispleasedtoannouncethereleaseoftheApacheSolrReferenceGuideforSolr4.4.";
  12. //简单分词器(以非字母符来分割文本信息,并将语汇单元统一为小写形式,并去掉数字类型的字符)
  13. SimpleAnalyzersa=newSimpleAnalyzer(Version.LUCENE_44);
  14. TokenStreamts=sa.tokenStream("field",text);
  15. CharTermAttributech=ts.addAttribute(CharTermAttribute.class);
  16. ts.reset();
  17. while(ts.incrementToken()){
  18. System.out.println(ch.toString());
  19. }
  20. ts.end();
  21. ts.close();
  22. }catch(Exceptionex){
  23. ex.printStackTrace();
  24. }
  25. }
  26. }


三、StopAnalyzer

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

  1. packagebond.lucene.analyzer;
  2. importjava.util.Iterator;
  3. importorg.apache.lucene.analysis.TokenStream;
  4. importorg.apache.lucene.analysis.core.StopAnalyzer;
  5. importorg.apache.lucene.analysis.tokenattributes.CharTermAttribute;
  6. importorg.apache.lucene.analysis.util.CharArraySet;
  7. importorg.apache.lucene.util.Version;
  8. publicclassStopAnalyzerTest{
  9. publicstaticvoidmain(String[]args){
  10. try{
  11. //要处理的文本
  12. //"lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
  13. Stringtext="TheLucenePMCispleasedtoannouncethereleaseoftheApacheSolrReferenceGuideforSolr4.4.";
  14. //自定义停用词
  15. String[]self_stop_words={"分析","release","Apache"};
  16. CharArraySetcas=newCharArraySet(Version.LUCENE_44,0,true);
  17. for(inti=0;i<self_stop_words.length;i++){
  18. cas.add(self_stop_words[i]);
  19. }
  20. //加入系统默认停用词
  21. Iterator<Object>itor=StopAnalyzer.ENGLISH_STOP_WORDS_SET.iterator();
  22. while(itor.hasNext()){
  23. cas.add(itor.next());
  24. }
  25. //停用词分词器(去除一些常有a,the,an等等,也可以自定义禁用词)
  26. StopAnalyzersa=newStopAnalyzer(Version.LUCENE_44,cas);
  27. TokenStreamts=sa.tokenStream("field",text);
  28. CharTermAttributech=ts.addAttribute(CharTermAttribute.class);
  29. ts.reset();
  30. while(ts.incrementToken()){
  31. System.out.println(ch.toString());
  32. }
  33. ts.end();
  34. ts.close();
  35. }catch(Exceptionex){
  36. ex.printStackTrace();
  37. }
  38. }
  39. }


四、StandardAnalyzer

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

  1. packagebond.lucene.analyzer;
  2. importjava.util.Iterator;
  3. importorg.apache.lucene.analysis.TokenStream;
  4. importorg.apache.lucene.analysis.standard.StandardAnalyzer;
  5. importorg.apache.lucene.analysis.tokenattributes.CharTermAttribute;
  6. importorg.apache.lucene.analysis.util.CharArraySet;
  7. importorg.apache.lucene.util.Version;
  8. publicclassStandardAnalyzerTest{
  9. publicstaticvoidmain(String[]args){
  10. try{
  11. //要处理的文本
  12. //"lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
  13. Stringtext="TheLucenePMCispleasedtoannouncethereleaseoftheApacheSolrReferenceGuideforSolr4.4.";
  14. //自定义停用词
  15. String[]self_stop_words={"Lucene","release","Apache"};
  16. CharArraySetcas=newCharArraySet(Version.LUCENE_44,0,true);
  17. for(inti=0;i<self_stop_words.length;i++){
  18. cas.add(self_stop_words[i]);
  19. }
  20. //加入系统默认停用词
  21. Iterator<Object>itor=StandardAnalyzer.STOP_WORDS_SET.iterator();
  22. while(itor.hasNext()){
  23. cas.add(itor.next());
  24. }
  25. //标准分词器(Lucene内置的标准分析器,会将语汇单元转成小写形式,并去除停用词及标点符号)
  26. StandardAnalyzersa=newStandardAnalyzer(Version.LUCENE_44,cas);
  27. TokenStreamts=sa.tokenStream("field",text);
  28. CharTermAttributech=ts.addAttribute(CharTermAttribute.class);
  29. ts.reset();
  30. while(ts.incrementToken()){
  31. System.out.println(ch.toString());
  32. }
  33. ts.end();
  34. ts.close();
  35. }catch(Exceptionex){
  36. ex.printStackTrace();
  37. }
  38. }
  39. }


五、CJKAnalyzer

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

  1. packagebond.lucene.analyzer;
  2. importjava.util.Iterator;
  3. importorg.apache.lucene.analysis.TokenStream;
  4. importorg.apache.lucene.analysis.cjk.CJKAnalyzer;
  5. importorg.apache.lucene.analysis.tokenattributes.CharTermAttribute;
  6. importorg.apache.lucene.analysis.util.CharArraySet;
  7. importorg.apache.lucene.util.Version;
  8. publicclassCJKAnalyzerTest{
  9. publicstaticvoidmain(String[]args){
  10. try{
  11. //要处理的文本
  12. //"TheLucenePMCispleasedtoannouncethereleaseoftheApacheSolrReferenceGuideforSolr4.4.";
  13. Stringtext="lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
  14. //自定义停用词
  15. String[]self_stop_words={"使用","一个","管道"};
  16. CharArraySetcas=newCharArraySet(Version.LUCENE_44,0,true);
  17. for(inti=0;i<self_stop_words.length;i++){
  18. cas.add(self_stop_words[i]);
  19. }
  20. //加入系统默认停用词
  21. Iterator<Object>itor=CJKAnalyzer.getDefaultStopSet().iterator();
  22. while(itor.hasNext()){
  23. cas.add(itor.next());
  24. }
  25. //CJK分词器(C:China;J:Japan;K:Korea;能对中,日,韩语言进行分析的分词器,对中文支持效果一般,基本不用于中文分词)
  26. CJKAnalyzersa=newCJKAnalyzer(Version.LUCENE_44,cas);
  27. TokenStreamts=sa.tokenStream("field",text);
  28. CharTermAttributech=ts.addAttribute(CharTermAttribute.class);
  29. ts.reset();
  30. while(ts.incrementToken()){
  31. System.out.println(ch.toString());
  32. }
  33. ts.end();
  34. ts.close();
  35. }catch(Exceptionex){
  36. ex.printStackTrace();
  37. }
  38. }
  39. }


六、SmartChineseAnalyzer

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

  1. packagebond.lucene.analyzer;
  2. importjava.util.Iterator;
  3. importorg.apache.lucene.analysis.TokenStream;
  4. importorg.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
  5. importorg.apache.lucene.analysis.tokenattributes.CharTermAttribute;
  6. importorg.apache.lucene.analysis.util.CharArraySet;
  7. importorg.apache.lucene.util.Version;
  8. publicclassSmartChineseAnalyzerTest{
  9. publicstaticvoidmain(String[]args){
  10. try{
  11. //要处理的文本
  12. Stringtext="lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
  13. //自定义停用词
  14. String[]self_stop_words={"的","了","呢",",","0",":",",","是","流"};
  15. CharArraySetcas=newCharArraySet(Version.LUCENE_44,0,true);
  16. for(inti=0;i<self_stop_words.length;i++){
  17. cas.add(self_stop_words[i]);
  18. }
  19. //加入系统默认停用词
  20. Iterator<Object>itor=SmartChineseAnalyzer.getDefaultStopSet().iterator();
  21. while(itor.hasNext()){
  22. cas.add(itor.next());
  23. }
  24. //中英文混合分词器(其他几个分词器对中文的分析都不行)
  25. SmartChineseAnalyzersca=newSmartChineseAnalyzer(Version.LUCENE_44,cas);
  26. TokenStreamts=sca.tokenStream("field",text);
  27. CharTermAttributech=ts.addAttribute(CharTermAttribute.class);
  28. ts.reset();
  29. while(ts.incrementToken()){
  30. System.out.println(ch.toString());
  31. }
  32. ts.end();
  33. ts.close();
  34. }catch(Exceptionex){
  35. ex.printStackTrace();
  36. }
  37. }
  38. }


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

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

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

Lucene 4.4.0中常用的几个分词器

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

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved