Раздел 40 · Elasticsearch и ELK

Стемминг, стоп-слова и языки

junior~10 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

С первого урока раздела нас мучила одна беда: «грибы», «грибами», «грибов» для поиска разные слова. В уроке про анализаторы мы видели детали, из которых собирается разбор текста. Теперь займёмся самыми языковыми из них: стеммером, стоп-словами и синонимами. От них поиск по-русски становится поиском по-человечески.

Стемминг

Русское слово меняется по падежам, числам и родам: пицца, пиццы, пиццу, пиццей. Для поиска это одно слово. Стемминг отрезает окончания по правилам языка и оставляет основу: «грибами» и «грибов» станут «гриб», «пиццы» станут «пицц». Если стемминг делать и при записи, и при поиске, все формы встретятся в одной основе.

Стеммер не словарь, он работает по правилам. В Elasticsearch для русского стоит алгоритм Snowball: список окончаний и порядок, в каком их отрезать. Поэтому у него бывают промахи:

  • основа не слово. «пицц», «маргарит», «говядин». Человеку их не показывают, это только ключи индекса;
  • родственные слова не склеиваются. «грибной» станет «грибн», а не «гриб»: это прилагательное с другим суффиксом. «пиццерия» станет «пиццер»;
  • разные слова склеиваются. Изредка у двух разных слов совпадает основа. Обычно это не мешает.

Есть и более бережный вариант, light_russian, он отрезает меньше. А для точного разбора по словарю бывают плагины морфологии, но их ставят отдельно.

Стоп-слова

Слова «с», «и», «для», «в» есть почти в каждом названии и ничего о нём не говорят. Их idf почти ноль, а места в индексе они занимают много. Фильтр stop выбрасывает такие стоп-слова по списку _russian_ или _english_.

Выброшенное слово оставляет пропуск в позициях: у «пицца с грибами» термин гриб стоит на позиции 2, а не 1. Это сохраняет расстояния для поиска фраз.

Готовые анализаторы языков

Собирать цепочку каждый раз не нужно: для 30 с лишним языков есть готовые анализаторы. russian это стандартный токенизатор, нижний регистр, русские стоп-слова и стеммер Snowball. english делает то же для английского и ещё убирает притяжательное 's. Им и задано поле name в индексе блюд «Гонца».

урок из курса

Урок из курса «Elasticsearch и ELK». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.