我需要关闭 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/