Москва: проверенные б/у ноутбуки с гарантией и проверкой перед оплатой
+7 906 722-94-45

Главная → Статьи → Лемматизация и стемминг текста для поиска

Лемматизация и стемминг: приведение слов к базовой форме

Стемминг и лемматизация в полнотекстовом поиске: различия методов, влияние на индекс и выдачу, словари и настройка анализатора текста.

Прямой ответ

Приведение слова к базовой форме позволяет запросу «ноутбуки» находить документ со словом «ноутбук». Два метода решают задачу по-разному.

Стемминг отсекает окончание по набору правил без словаря. Результат — основа слова, которая может не быть реальным словом.

Лемматизация использует словарь и морфологический разбор, поэтому результат — существующая начальная форма.

from nltk.stem.snowball import SnowballStemmer

st = SnowballStemmer("russian")
for w in ["ноутбуки", "ноутбуков", "ноутбуком"]:
    print(w, "->", st.stem(w))

Стеммер работает быстро и не требует словаря, но одинаково обрабатывает слова, которые стоит различать.

Слово Стемминг (основа) Лемматизация (лемма)
ноутбуки ноутбук ноутбук
ноутбуков ноутбук ноутбук
бегу бег бежать
беги бег бежать
небо неб небо

Различие критично в последней строке: стеммер усекает слово «небо» до несуществующей основы, а лемматизатор возвращает корректную форму.

В поисковых движках приведение выполняется в анализаторе — конвейере обработки текста при индексации и при разборе запроса:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "ru_text": {
          "tokenizer": "standard",
          "filter": ["lowercase", "russian_stemmer"]
        }
      },
      "filter": {
        "russian_stemmer": {"type": "stemmer", "language": "russian"}
      }
    }
  }
}

Анализатор применяется и к документу при индексации, и к запросу при поиске. Несовпадение анализаторов приводит к тому, что приведённые формы не совпадают и документ не находится.

Что меняется в индексе и выдаче

Приведение к базовой форме влияет не только на совпадение, но и на размер индекса и порядок результатов.

Размер терминологического словаря. Формы одного слова объединяются в один термин, поэтому словарь сокращается. Сокращение заметно для языков с богатой морфологией.

Частота термина. Объединение форм увеличивает частоту термина, а частота участвует в оценке релевантности; о ранжировании — в статье про релевантность поиска.

Число совпадений. Запрос находит больше документов, поскольку совпадение проверяется по базовой форме. Одновременно растёт число ложных совпадений для слов с одинаковой основой.

Возможность точного поиска. После приведения исходная форма слова в индексе не сохраняется, поэтому поиск по точной форме невозможен без отдельного поля.

Последний пункт определяет распространённую практику: поле индексируется дважды — с приведением для обычного поиска и без приведения для точного совпадения и сортировки.

Выбор метода зависит от задачи. Стемминг подходит для поиска, где полнота выдачи важнее точности, и не требует словаря для нового языка. Лемматизация предпочтительна, когда усечение искажает смысл либо когда результат используется не только для поиска, но и для отображения.

Отдельный случай — имена собственные и артикулы. Приведение изменяет их, поэтому такие поля индексируются анализатором без стеммера.

Практика: настройка приведения слов в поиске

1. Применяйте один анализатор к документу и запросу. Разные анализаторы приводят к несовпадению форм и отсутствию результатов.

2. Не применяйте стеммер ко всем полям. Поля с именами, артикулами и кодами индексируются без приведения.

3. Храните исходный текст отдельно. Приведённая форма используется для совпадения, а отображается исходный текст из отдельного поля либо из источника.

4. Проверяйте результат приведения на выборке. Ошибки стеммера видны только на реальном тексте, а не на примерах из документации.

5. Учитывайте порядок фильтров анализатора. Приведение выполняется после приведения к нижнему регистра и до фильтров синонимов; о словарях — в статье про синонимы в поиске.

6. Измеряйте влияние на выдачу. Добавление стеммера увеличивает полноту и снижает точность, поэтому изменение проверяется на наборе реальных запросов.

7. Фиксируйте анализатор в маппинге. Изменение анализатора требует переиндексации, поскольку приведение выполняется при записи.

Рекомендации:

  1. Различайте полноту и точность выдачи. Приведение форм увеличивает число найденных документов и одновременно число нерелевантных, поэтому баланс проверяется на реальных запросах.
  2. Не смешивайте стемминг и нечёткий поиск без проверки. Оба механизма расширяют совпадение, и совместное применение даёт больше ложных результатов; о нечётком поиске — в статье про fuzzy-поиск.
  3. Проверяйте поддержку языка. Набор доступных стеммеров ограничен, а качество для конкретного языка проверяется на выборке текста.
  4. Учитывайте стоимость лемматизации. Морфологический разбор медленнее стемминга, что влияет на скорость индексации больших объёмов.
  5. Документируйте выбор метода. Решение влияет на выдачу, поэтому причина выбора фиксируется вместе с настройкой.

Практический сценарий: поиск не находит документы после добавления стеммера

Контекст: после включения русского стеммера часть документов перестала находиться по запросам, которые ранее работали.

  1. Диагностика. Запросы, вводившие точную форму слова, возвращали пустой результат, а запросы по другой форме того же слова работали.
  2. Причина. Анализатор со стеммером применили к документу при переиндексации, но анализатор поля запроса остался прежним. Форма запроса не приводилась к основе, поэтому не совпадала с приведённым термином в индексе.
  3. Действия. (а) Указали один и тот же анализатор для индексации и для поиска по полю; (б) выполнили переиндексацию, поскольку изменение анализатора не применяется к существующим сегментам; (в) добавили отдельное подполе без приведения для точного совпадения и сортировки; (г) исключили из приведения поля с артикулами и именами; (д) прогнали набор реальных запросов и сравнили выдачу до и после изменения.
  4. Результат. Поиск работает по всем формам слова, а точное совпадение доступно через отдельное подполе.

Вывод: приведение к базовой форме применяется одинаково к документу и запросу, а изменение анализатора требует переиндексации. Поля, где точная форма имеет значение, индексируются без приведения, иначе возможность точного поиска теряется.

FAQ

Что быстрее — стемминг или лемматизация? Стемминг, поскольку выполняется по правилам без обращения к словарю и морфологического разбора.

Можно ли найти слово по точной форме после стемминга? Нет, если исходная форма не сохранена. Для точного поиска используется отдельное поле либо подполе без приведения.

Нужен ли стеммер для английского текста? Зависит от задачи. Английская морфология проще русской, поэтому влияние стеммера меньше, но он всё равно объединяет формы единственного и множественного числа.

Применяется ли приведение к запросу пользователя? Да, анализатор запроса выполняет те же преобразования, иначе приведённые формы не совпадут.

Источники: Snowball stemmers, Elasticsearch stemmer token filter, NLTK stem API — ссылки в шапке.