Рекомендации по поиску альтернативных форм слова с помощью Lucene

StackOverflow https://stackoverflow.com/questions/893436

Вопрос

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

Пожалуйста, обрати внимание:на этом сайте есть только контент на английском языке.

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

  1. Найдите слово в каком-нибудь файле тезауруса, чтобы определить альтернативные формы данного слова.
    • Некоторые примеры:
      • При поиске по запросу «автомобиль» к запросу также добавляются слова «автомобили».
      • При поиске по запросу «carry» к запросу также добавляются «carries» и «carried».
      • При поиске по запросу «маленький» к запросу также добавляются слова «меньше» и «самый маленький».
      • При поиске «можно» к запросу также добавляются «нельзя», «нельзя», «может» и «консервы».
      • И это должно работать наоборот (т.при поиске «переносит» следует добавить «переносить» и «переносить»).
    • Недостатки:
      • Не работает для многих новых технических слов, если словарь/тезаурус не обновляется часто.
      • Я не уверен в производительности поиска в файле тезауруса.
  2. Сгенерируйте альтернативные формы алгоритмически, на основе некоторых эвристик.
    • Некоторые примеры:
      • Если слово заканчивается на «s», «es», «ed», «er» или «est», опустите суффикс.
      • Если слово заканчивается на «ies», «ied», «ier» или «iest», преобразуйте его в «y».
      • Если слово заканчивается на «y», преобразуйте его в «ies», «ied», «ier» и «iest».
      • Попробуйте добавить к слову «s», «es», «er» и «est».
    • Недостатки:
      • Генерирует множество не-слов для большинства входных данных.
      • Ощущение взлома.
      • Похоже на то, что вы найдете на TheDailyWTF.com.:)
  3. Что-то гораздо более сложное?

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top