Фильтр стоп-слов Java Lucene

У меня есть около 500 предложений, в которых я хотел бы составить набор нграмм. У меня возникли проблемы с удалением стоп-слов. Я попытался добавить lucene StandardFilter и StopFilter, но у меня все та же проблема. Вот мой код:

for(String curS: Sentences)
{
          reader = new StringReader(curS);
          tokenizer = new StandardTokenizer(Version.LUCENE_36, reader);
          tokenizer = new StandardFilter(Version.LUCENE_36, tokenizer);
          tokenizer = new StopFilter(Version.LUCENE_36, tokenizer, stopWords);
          tokenizer = new ShingleFilter(tokenizer, 2, 3);
          charTermAttribute = tokenizer.addAttribute(CharTermAttribute.class);

    while(tokenizer.incrementToken())
    {
        curNGram = charTermAttribute.toString().toString();
        nGrams.add(curNGram);                   //store each token into an ArrayList
    }
}

Например, первая фраза, которую я тестирую, звучит так: «Для каждого человека, который слушает». В этом примере для curNGram установлено значение «For», которое является стоп-словом в моем списке stopWords. Кроме того, в этом примере «каждый» является стоп-словом, поэтому «человек» должен быть первым ngram.

  1. Почему стоп-слова добавляются в мой список, когда я использую StopFiler?

Любая помощь приветствуется!


person CodeKingPlusPlus    schedule 21.11.2012    source источник
comment
Как создается стоп-слово? Вы создаете его с помощью StopFilter.makeStopSet?   -  person femtoRgon    schedule 22.11.2012
comment
Я читаю текстовый файл построчно, используя статическую функцию.   -  person CodeKingPlusPlus    schedule 22.11.2012


Ответы (1)


То, что вы опубликовали, мне кажется нормальным, поэтому я подозреваю, что stopWords не предоставляет фильтру информацию, которую вы хотите.

Попробуйте что-то вроде:

//Let's say we read the stop words into an array list (A simple array, or any list implementation should be fine)
List<String> words = new ArrayList();
//Read the file into words.
Set stopWords = StopFilter.makeStopSet(Version.LUCENE_36, words, true);

Предполагая, что список сгенерированных вами стоп-слов (тот, который я назвал «словами») выглядит так, как вы думаете, это должно поместить их в формат, пригодный для StopFilter.

Вы уже генерировали такие стоп-слова?

person femtoRgon    schedule 21.11.2012
comment
Похоже, это работает, однако для некоторых моих выходных данных я получаю те же слова, за исключением того, что у одного будет дополнительное подчеркивание или два. Например, я получу USA, USA_, USA__ как отдельные значения. - person CodeKingPlusPlus; 22.11.2012
comment
Это предполагаемое поведение ShingleFilter из API: этот фильтр обрабатывает приращения позиции > 1, вставляя токены-заполнители (токены с текстом термина _). Он не обрабатывает приращение позиции, равное 0. Это происходит из-за того, что слова удаляются стоп-фильтром, поэтому ShingleFilter сохраняет свою позицию таким образом. - person femtoRgon; 22.11.2012
comment
Если хотите, я думаю, вы можете отключить это с помощью stopfilter.setEnablePositionIncrements(false) - person femtoRgon; 22.11.2012