Lucene 停用词和 nGram

Lucene Stopword and nGram

我正在使用 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 克,所以它看起来像这样:(空白被屏蔽为“_”)

故居
达斯_
as_h
s_ha
_hau
豪斯

在德语中 "das" 类似于 "the",应该删除。但是当然它不会被删除然后 "das_","as_h","s_ha" 根本不包含 "das"。

所以我想先做一个单词分词器,使用停用词,然后再次合并所有内容,然后像往常一样使用 ngram。

当然我可以"manually"在将字符串放入 Lucene 之前从字符串中删除所有停用词,但我认为使用 Lucene 应该可以做到这一点。

有人有想法吗?

一种可能性是不使用 NGramTokenizer 作为标记器,首先你可以使用 StandardTokenizer 或任何其他好的标记化和然后通过使用 NGramTokenFilter 应用 ngram 的创建,这可以在使用 StopFilter 之后应用。