编程语言
首页 > 编程语言> > java-在Lucene中关闭词干

java-在Lucene中关闭词干

作者:互联网

我需要关闭EnglishAnalyzer或其他类似分析器的词干(例如,ItalianAnalyzer等).我正在使用Lucene 3.6.2,我发现只能指定一组不应词干的单词使用此构造函数:
EnglishAnalyzer documentation – stemExclusionSet

我能怎么做?

解决方法:

通常,当您使用特定于语言的分析时,这是因为您想要词干分析.如果您不想词干分析,StandardAnalyzer是一种非常有效的非语言特定的分析器.

但是,在语言分析器中还有其他一些不错的小细节,因此,如果您真的只需要消除分析器中的词干,请抓住分析器的源,并创建自己的分析器,以覆盖TokenStreamComponents方法,然后删除词干过滤器以及相关的组件(通常会找到一个SetKeywordMarkerFilter,可以将其删除,因为它仅用于防止词干对选定标记的影响),例如:

final CharArraySet defaultStopwords = new ItalianAnalyzer(Version.LUCENE_47).getStopWordSet();

final CharArraySet defaultArticles = CharArraySet.unmodifiableSet(
   new CharArraySet(Version.LUCENE_CURRENT, 
       Arrays.asList(
      "c", "l", "all", "dall", "dell", "nell", "sull", "coll", "pell", 
       "gl", "agl", "dagl", "degl", "negl", "sugl", "un", "m", "t", "s", "v", "d"
       ), true));

Analyzer customItalianAnalyzer = new Analyzer() {
  @Override
  protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
    final Tokenizer source = new StandardTokenizer(Version.LUCENE_47, reader);
    TokenStream result = new StandardFilter(Version.LUCENE_47, source);
    result = new ElisionFilter(result, defaultArticles);
    result = new LowerCaseFilter(Version.LUCENE_47, result);
    result = new StopFilter(Version.LUCENE_47, result, defaultStopwords);
    return new TokenStreamComponents(source, result);
  }
};

注意,我在这里重现了停用词和省略号集的定义.我还删除了版本检查,因为在您的自定义用法中,您可以指定一个版本,而不是在if语句中处理它(假设此处您使用的是3.2之后的版本).

另一种选择是只复制ItalianAnalyzer的全部内容,但我认为这样作一次,并粗略地理解了分词器/过滤器链是健康的做法,因此您可以对自己真正想要的内容做出明智的决定您的分析仪要做.

标签:stemming,lucene,java
来源: https://codeday.me/bug/20191029/1961164.html