Алгоритм Портера Стеммера в информационно-поисковой
Мне нужно создать простую поисковую систему для моего приложения. Давайте упростим это до следующего: у нас есть несколько текстов (много), и мне нужно искать и показывать релевантные результаты.
Я основываюсь на этой замечательной статье, расширяю некоторые вещи, и она прекрасно работает для меня.
Но у меня есть проблема со связанными словами к терминам. Например, слова "аннотация", "аннотации" и т. Д. Будут ограничены "аннотировать", но представьте, что вы пытаетесь что-то найти, и вы увидите неожиданные результаты:
- "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-граммов для точного соответствия, используя бинарный поиск