我正在使用Lucene,并且我想将nGrams与停用词一起使用。
我在Lucene中针对德国停用词分析器编写了自己的分析器。
public class GermanNGramAnalyzer extends StopwordAnalyzerBase {
@Override
protected TokenStreamComponents createComponents(String s) {
NGramTokenizer tokenizer = new NGramTokenizer(4,4); //Tokenizer for nGrams
TokenStream result = new StandardFilter(tokenizer);
result = new LowerCaseFilter(result);
result = new StopFilter(result, this.stopwords);
result = new SetKeywordMarkerFilter(result, this.exclusionSet);
result = new GermanNormalizationFilter(result);
result = new NumberFilter(result);
return new TokenStreamComponents(tokenizer, result);
}
(...)
}
这有效,但不符合我的要求。 如您所见,我们有4克,它看起来像这样:(空白用“ _”遮盖)
Das Haus
das_
as_h
s_ha
_hau
haus
在德语中,“ das”类似于“ the”,应将其删除。但是,当然不会删除它,因此“ das _”,“ as_h”,“ s_ha”根本不包含“ das”。
因此,我想首先使用单词分词器,使用停用词,然后再次合并所有内容,并像平常一样使用ngram。
当然,我可以在将其丢入Lucene之前“手动”从字符串中删除所有停用词,但我认为使用Lucene可以做到这一点。
有人有主意吗?
答案 0 :(得分:0)
一种可能性是代替使用 NGramTokenizer 作为令牌生成器,首先可以使用 StandardTokenizer 或任何其他不错的令牌生成,然后通过用法应用ngram的创建 NGramTokenFilter 的标签,可以在使用StopFilter后完全应用。