Lucene Stopword и nGram - PullRequest
       43

Lucene Stopword и nGram

0 голосов
/ 04 декабря 2018

Я использую 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 голосов
/ 18 декабря 2018

Одна из возможностей будет вместо использования NGramTokenizer в качестве токенизатора, сначала вы можете использовать StandardTokenizer или любой другой приятный токенизация, а затем применить создание нграмм с помощью NGramTokenFilter , который может быть применен точно после использования StopFilter.

...