首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带词干分析的StandardAnalyzer

带词干分析的StandardAnalyzer
EN

Stack Overflow用户
提问于 2014-09-08 04:28:03
回答 1查看 3.4K关注 0票数 4

在Lucene中,有没有办法将PorterStemFilter集成到StandardAnalyzer中,或者我必须复制/粘贴StandardAnalyzers源代码,然后添加过滤器,因为StandardAnalyzer被定义为最终类。有没有更聪明的方法?

另外,如果我不想考虑数字,我如何实现这一点呢?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2014-09-08 06:53:37

如果您想使用这种组合进行英语文本分析,那么您应该使用Lucene的EnglishAnalyzer。否则,您可以创建一个新的Analyzer来扩展AnalyzerWraper,如下所示。

代码语言:javascript
复制
import java.io.IOException;
import java.io.StringReader;
import java.util.HashSet;
import java.util.Set;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.AnalyzerWrapper;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.TypeTokenFilter;
import org.apache.lucene.analysis.en.PorterStemFilter;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.util.Version;


public class PorterAnalyzer extends AnalyzerWrapper {

  private Analyzer baseAnalyzer;

  public PorterAnalyzer(Analyzer baseAnalyzer) {
      this.baseAnalyzer = baseAnalyzer;
  }

  @Override
  public void close() {
      baseAnalyzer.close();
      super.close();
  }

  @Override
  protected Analyzer getWrappedAnalyzer(String fieldName)
  {
      return baseAnalyzer;
  }

  @Override
  protected TokenStreamComponents wrapComponents(String fieldName, TokenStreamComponents components)
  {
      TokenStream ts = components.getTokenStream();
      Set<String> filteredTypes = new HashSet<>();
      filteredTypes.add("<NUM>");
      TypeTokenFilter numberFilter = new TypeTokenFilter(Version.LUCENE_46,ts, filteredTypes);

      PorterStemFilter porterStem = new PorterStemFilter(numberFilter);
      return new TokenStreamComponents(components.getTokenizer(), porterStem);
  }

  public static void main(String[] args) throws IOException
  {

      //Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_46);
      PorterAnalyzer analyzer = new PorterAnalyzer(new StandardAnalyzer(Version.LUCENE_46));
      String text = "This is a testing example. It should tests the Porter stemmer version 111";

      TokenStream ts = analyzer.tokenStream("fieldName", new StringReader(text));
      ts.reset();

      while (ts.incrementToken()){
          CharTermAttribute ca = ts.getAttribute(CharTermAttribute.class);

          System.out.println(ca.toString());
      }
      analyzer.close();
  }

}

上面的代码是基于这个lucene forum thread's的。主要工作由wrapComponents方法实现。首先从包装的分析器中获取TokenStream对象,然后应用一个类型过滤器来忽略数字标记。最后,应用porter词干分析器过滤器。我希望这是清楚的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25714455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档