Luc*_*ano 3 java lucene stemming
我需要关闭 EnglishAnalyzer 或其他类似分析器(例如 ItalianAnalyzer,等等)的词干分析。
我正在使用 Lucene 3.6.2,我发现只能指定一组不应词干分析的单词使用此构造函数:
EnglishAnalyzer 文档 - 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);
}
};
Run Code Online (Sandbox Code Playgroud)
请注意,我在此处复制了停用词和省略集定义。我还删除了版本检查,因为在您的自定义用法中,您可以指定一个版本,而不是在 if 语句中处理它(假设这里您使用的是 3.2 之后的版本)。
另一种选择是复制 的全部内容ItalianAnalyzer,但我认为像这样重温一遍并粗略地了解分词器/过滤器链是健康的,这样您就可以就您真正想要的内容做出明智的决定分析仪来做。
| 归档时间: |
|
| 查看次数: |
1503 次 |
| 最近记录: |