Алгоритм Портера Стеммера в информационно-поисковой

Мне нужно создать простую поисковую систему для моего приложения. Давайте упростим это до следующего: у нас есть несколько текстов (много), и мне нужно искать и показывать релевантные результаты.

Я основываюсь на этой замечательной статье, расширяю некоторые вещи, и она прекрасно работает для меня.

Но у меня есть проблема со связанными словами к терминам. Например, слова "аннотация", "аннотации" и т. Д. Будут ограничены "аннотировать", но представьте, что вы пытаетесь что-то найти, и вы увидите неожиданные результаты:

  • "anno" - ничего
  • "аннота" - ничего и т. д.

Только слово "annot" даст соответствующий результат. Итак, как мне улучшить поиск, чтобы получить ожидаемые результаты? Потому что "annot" содержит "anno", а "annota" немного больше, чем "annot". Использование содержимого все время, очевидно, не является решением

Если в первом случае я могу использовать какое-то троичное дерево поиска, во втором случае я не знаю, что делать.

Любые идеи будут очень полезны.

ОБНОВИТЬ

oleksii указал мне на n-грамм, что может oleksii для меня, но я не знаю, как правильно индексировать n-грамм.

Итак, вопрос:

  • Какая структура данных будет лучше для моих нужд
  • Как правильно индексировать мои н-граммы

1 ответ

Решение

Стемминг, пожалуй, не очень актуален здесь. Stemming преобразует множественное число в единственном числе.

Учитывая, что у вас есть токенизатор, парадигматический модуль и средство очистки (для удаления стоп-слов, возможно, знаков препинания и цифр, коротких слов и т. Д.), Вы просматриваете полнотекстовый поиск. Я бы посоветовал вам получить готовое решение (например, Elasticsearch, Lucene, Solr), но если вам нравится подход DIY, я могу предложить следующую наивную реализацию.

Шаг 1
Создайте ориентированный на поиск токенизатор. Одним из примеров будет токенайзер n-граммы. Он примет ваше слово и разделится на следующие последовательности:

аннотирование
1 - [a, n, o, t, a, i]
2 - [an, nn, no, ot, ...]
3 - [Анн, нет, нет, ота, ...]
4 - [anno, nnot, nota, otat, ...]
....

Шаг 2
Сортируйте n-граммы для более эффективного поиска

Шаг 3
Поиск n-граммов для точного соответствия, используя бинарный поиск

Другие вопросы по тегам