Как настроить список запрещенных слов в Lucene 4.4

Я использую Lucene 4.4 для анализа небольшого корпуса. Я пробовал StopAnalyzer и StopAnalyzer. Однако многие термины, которые мне не нужны, по-прежнему отображаются в моем результате. Например, «Я», «мы», «x» и т. Д. Итак, мне нужно настроить список запрещенных слов, предоставляемый Lucene. Мои вопросы:

  1. Как мне добавить новые игнорируемые слова? Я знаю, что в Lucene есть этот конструктор для использования настраиваемых стоп-слов.

    public StopAnalyzer (версия matchVersion, CharArraySet stopWords)

    Но я не хочу создавать заглавные слова с нуля. Я хочу использовать существующие игнорируемые слова и просто добавить дополнительные игнорируемые слова, которые мне нужны.

  2. Как я могу отфильтровать все числа, как словесные, так и буквальные, такие как «1», «20», «пять», «десять» и т. Д.?

Мое решение

  1. Как показал femtoRgon, список запрещенных слов, предоставляемый Lucene, очень мал и не может быть изменен. Я создал CustomizeStopAnalyzer, который принимает список игнорируемых слов. Я использую StandardTokenizer и связываю несколько фильтров вместе.
  2. Чтобы удалить числа, мне нужно добавить класс NumericFilter, который проверяет каждый токен, чтобы узнать, является ли он числовым. Большое спасибо,

person chepukha    schedule 29.09.2013    source источник


Ответы (1)


1 - Стандартный набор стоп-слов StopAnalyzer.ENGLISH_STOPWORD_SET. Его нельзя изменить, поэтому вам следует просто скопировать код в качестве отправной точки:

 final List<String> stopWords = Arrays.asList(
   "a", "an", "and", "are", "as", "at", "be", "but", "by",
   "for", "if", "in", "into", "is", "it",
   "no", "not", "of", "on", "or", "such",
   "that", "the", "their", "then", "there", "these",
   "they", "this", "to", "was", "will", "with"
 );
 final CharArraySet stopSet = new CharArraySet(Version.LUCENE_CURRENT, 
     stopWords, false);

2 - стоп-фильтр не подходит для этого. Я подозреваю, что вы, вероятно, ищете что-то вроде _ 3_, который определит токены как последовательные буквенные строки, тем самым исключив любые небуквенные символы.

person femtoRgon    schedule 29.09.2013
comment
Спасибо femtoRgon. Я не только хочу фильтровать небуквенный символ, но также хочу фильтровать слова, которые означают числа, такие как пять, десять, пятьдесят и т. Д. При использовании NLTK я мог бы проверять каждый токен и иметь метод, чтобы проверить, токен содержит любую цифру или может быть преобразован в число с плавающей запятой. Не знаю, можно ли что-то подобное сделать в Lucene? - person chepukha; 30.09.2013
comment
Я пробовал LetterTokenizer, он решает одну проблему, но создает другую. Он удаляет цифры и знаки препинания. В результате я получаю токены типа isn, didn, ll, ve, которые не попадают в список стоп-слов. Продолжать добавлять эти строки в список запрещенных слов - не очень хорошее решение. StandardTokenizer может распознавать не, я и т. Д. Как токены, но не удаляет числа. Есть ли у вас какие-нибудь предложения, чтобы это исправить? Спасибо, - person chepukha; 30.09.2013
comment
Мне не известны какие-либо фильтры, которые делают именно то, что вы ищете. Возможно, вам придется реализовать свой собственный. Поскольку вы просто собираетесь удалить токены, _ 1_ будет базовым классом для реализации. Вам просто нужно реализовать метод accept, а затем включить его в свой анализатор. - person femtoRgon; 30.09.2013