Lucene Stopword和nGram

时间:2018-12-04 10:35:48

标签: java lucene tokenize n-gram stop-words

我正在使用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可以做到这一点。

有人有主意吗?

1 个答案:

答案 0 :(得分:0)

一种可能性是代替使用 NGramTokenizer 作为令牌生成器,首先可以使用 StandardTokenizer 或任何其他不错的令牌生成,然后通过用法应用ngram的创建 NGramTokenFilter 的标签,可以在使用StopFilter后完全应用。