gpt4 book ai didi

java - 在 Lucene 中关闭词干提取

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:14:04 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com