我需要关闭 EnglishAnalyzer 或其他类似分析器(例如 ItalianAnalyzer、ecc ..)的词干提取我使用的是 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 的全部内容,但我认为像这样给它一次并粗略地了解标记器/过滤器链是健康的,这样你就可以对你真正想要的做出明智的决定你的分析器来做。

关于java - 在 Lucene 中关闭词干,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23438438/

10-12 16:41