Лучшие практики для поиска альтернативных форм слова с Lucene - PullRequest
4 голосов
/ 21 мая 2009

У меня есть сайт, который можно искать с помощью Lucene. Из журналов я заметил, что пользователи иногда не находят то, что ищут, потому что вводят единственный термин, но на сайте используется только множественная версия этого термина. Я бы хотел, чтобы поиск нашел и другие формы слова. Я уверен, что это проблема, которая была решена много раз, так каковы лучшие методы для этого?

Обратите внимание: этот сайт содержит только английский контент .

Некоторые подходы, о которых я думал:

  1. Найдите слово в каком-нибудь файле тезауруса, чтобы определить альтернативные формы данного слова.
    • Некоторые примеры:
      • Выполняет поиск "car", также добавляет "cars" к запросу.
      • Выполняет поиск по запросу "переносить", а также добавлять к запросу слова "переносы" и "переносы".
      • Выполняет поиск слов "small", а также добавляет в запрос слова "small" и "smallle".
      • Выполняет поиск слов "can", также добавляет к запросу слова "can", "can", "cans" и "canned".
      • И он должен работать в обратном порядке (т. Е. Для поиска «переноски» следует добавить «переносить» и «переносить»).
    • Недостатки:
      • Не работает для многих новых технических слов, если словарь / тезаурус часто обновляется.
      • Я не уверен в производительности поиска файла тезауруса.
  2. Генерация альтернативных форм алгоритмически на основе некоторой эвристики.
    • Некоторые примеры:
      • Если слово оканчивается на «s», «es», «ed», «er» или «est», сбросьте суффикс
      • Если слово оканчивается на «ies», «ied», «ier» или «iest», преобразовать в «y»
      • Если слово оканчивается на "y", преобразуйте в "ies", "ied", "ier" и "iest"
      • Попробуйте добавить слова "s", "es", "er" и "est".
    • Недостатки:
      • Генерирует множество не-слов для большинства входных данных.
      • Чувствуется как хак.
      • Похоже, что вы найдете на TheDailyWTF.com. :)
  3. Что-то гораздо более сложное?

Я думаю о некоторой комбинации первых двух подходов, но я не уверен, где найти файл тезауруса (или как он называется, так как "тезаурус" не совсем прав, но и не "словарь").

Ответы [ 5 ]

4 голосов
/ 21 мая 2009

Рассмотрите возможность включения PorterStemFilter в ваш анализ. Обязательно выполните тот же анализ запросов, который используется при построении индекса.

Я также использовал алгоритм Lancaster с хорошими результатами. Используя PorterStemFilter в качестве руководства, его легко интегрировать с Lucene.

4 голосов
/ 22 мая 2009

Запоминание слов работает нормально для английского языка, однако для языков, в которых перенос слов практически невозможен (как у меня), вариант # 1 жизнеспособен. Я знаю по крайней мере одну такую ​​реализацию для моего языка (исландский) для Lucene, которая, кажется, работает очень хорошо.

3 голосов
/ 21 мая 2009

Некоторые из них выглядят как довольно аккуратные идеи. Лично я бы просто добавил несколько тегов к запросу (преобразование запроса), чтобы сделать его нечетким, или вы можете использовать встроенный FuzzyQuery , который использует расстояния редактирования Левенштейна, что поможет при неправильном написании.

Используя нечеткий поиск ' тегов запроса ', также используется Левенштейн. Рассмотрим поиск по «машине». Если вы измените запрос на «автомобиль ~», он найдет «автомобиль» и «автомобили» и так далее. Существуют и другие преобразования запроса, которые должны обрабатывать практически все, что вам нужно.

1 голос
/ 28 мая 2009

Если вы работаете в специализированной области (я сделал это с помощью садоводства) или с языком, который не очень хорошо работает с обычными методами формирования стеблей, вы можете использовать ведение журнала запросов для создания таблицы стемминга вручную.

Просто создайте отображение слова -> основы для всех несоответствий, о которых вы можете подумать / которые ищут люди, а затем при индексации или поиске замените любое слово, встречающееся в таблице, на соответствующее основание. Благодаря кешированию запросов это довольно дешевое решение.

0 голосов
/ 24 мая 2009

Stemming - довольно стандартный способ решения этой проблемы. Я обнаружил, что стеммер Портер очень агрессивен для стандартного поиска по ключевым словам. В конечном итоге это объединяет слова, которые имеют разные значения. Попробуйте алгоритм KStemmer.

...