Aivaro
  • Оглавление
  • Вопросы
  • Практика
  • Вики
  • Материалы сообщества
  • Тесты
  • Поиск
✈Telegram @ai_varo
RUEN中文
…
Оглавление/Вопросы/#902

Объясните разницу между стеммингом и лемматизацией. Приведите примеры для русского языка. Какой подход лучше для информационного поиска?

Краткий тезис

Стемминг и лемматизация — два основных подхода к приведению словоформ к единому основанию. Стемминг отрубает суффиксы и окончания по эвристическим правилам, не заботясь о грамматической корректности, а лемматизация возвращает слово в его словарную (каноническую) форму — инфинитив для глаголов, именительный падеж единственного числа для существительных. Для русского языка с его развитой морфологией лемматизация даёт более точные результаты, но требует словарей и медленнее. Выбор зависит от задачи: стемминг подходит для высоконагруженного информационного поиска, где допускаются ложные срабатывания, лемматизация — для задач, чувствительных к смыслу (классификация, вопросно-ответные системы).

2. Определение лемматизации (pymorphy2, Mystem)

Лемматизация — приведение слова к его лемме (словарной форме) с учётом морфологического анализа. Требует словарей и грамматического разбора.

Key concepts

  • Инструменты для русского
    • pymorphy2 — библиотека на Python, использует открытую морфологическую модель OpenCorpora. Возвращает лемму и грамматические теги.
    • Mystem — инструмент Яндекса, работает быстро, использует свою словарную базу; поддерживает снятие омонимии в контексте.
  • Подход — слово анализируется: определяется часть речи, число, падеж, время и т.д., затем строится парадигма и выбирается нормальная форма.
  • Преимущества — точность; возвращает реальные слова.
  • Недостатки — скорость ниже стемминга; зависимость от качества словаря.

Пример работы pymorphy2:

  • «бежал» → анализируется как глагол прошедшего времени, лемма «бежать».
  • «лесами» → существительное мн.ч. творит.падеж → лемма «лес».

3. Примеры: «бежал» → стемминг «беж» vs лемма «бежать»

Для наглядности рассмотрим несколько словоформ русского языка:

СловоформаСтем (Porter для рус)Лемма (pymorphy2)Комментарий
бежалбежбежатьСтем «беж» – несуществующее слово, потерян формообразующий суффикс
бежалабежбежатьАналогично
бежалибежбежатьАналогично
бегущийбегбежатьСтем совпал с корнем «бег» случайно
лучшийлучшлучший (прил.)Стем теряет окончание -ий, лемма полная
большогобольшбольшойСтем «больш» часто считается корнем
яблокамияблокяблокоСтем совпал с основой мн.ч., но лемма корректна
смотрелисмотрсмотретьСтему «смотр» можно принять за существительное
смеясьсмесмеятьсяСтем «сме» – обрубок, непонятный без контекста

Вывод: для русского языка стемминг может порождать «слова», которые не являются леммами и даже не похожи на корень (например, «сме»). Лемматизация всегда возвращает валидную словарную единицу.


4. Trade-offs: скорость vs точность

КритерийСтеммингЛемматизация
Скорость (слов/сек на Python)~200 000 (nltk.Porter)~10 000 (pymorphy2) – в 20 раз медленнее
Требования к ресурсамМинимальные: только правилаНеобходим словарь (~10-50 МБ)
Точность для русскогоСредняя – может объединять формы разных слов (например, «печь» сущ. и гл.)Высокая – различает омонимичные формы при контексте (Mystem с контекстом)
РезультатЧасто не является словомВсегда слово из словаря
ПамятьНет дополнительнойСловарь в RAM (~50-100 МБ)
Применимость для поискаЧасто достаточна, чтобы найти документы по корнюИзбыточна для простых запросов, но незаменима для точного поиска

Когда скорость критична

  • Real-time поиск на больших корпусах (миллиарды документов).
  • Предобработка в потоковых пайплайнах.

Когда точность критична

  • Semantic search / QA.
  • Классификация текстов с ограниченным набором классов.
  • Извлечение сущностей (NER) – лемматизация помогает нормализовать именованные сущности.

5. Когда какой подход выбрать

Выбор между стеммингом и лемматизацией зависит от задачи и языка.

  • Для информационного поиска (IR) – в классическом подходе (tf-idf, BM25) стемминг используется чаще из-за скорости и хорошего recall. Лемматизация может улучшить precision, но незначительно. Однако современные IR-системы на word embeddings (или dense retrieval) часто обходятся без явной нормализации, так как embeddings уже учитывают морфологию.
  • Для русского языка – точность лемматизации заметно выше, особенно при работе с краткими формами прилагательных, возвратными глаголами, наречиями. Поэтому в коммерческих системах (например, поиск Яндекса) используется Mystem (лемматизация) для индексации.
  • Компромисс – использовать стемминг на этапе индексации и лемматизацию только для ключевых полей (например, заголовков) или для запросов с малым количеством слов.
  • Для анализа тональности и классификации – лемматизация даёт более стабильные признаки, так как разные формы одного слова попадают в один признак.
  • Для чат-ботов и QA – лемматизация обязательна, чтобы правильно извлекать интенты и сущности.

Рекомендация для новичков: начать с лемматизации (pymorphy2), если проект не требует обработки миллионов документов в реальном времени. В противном случае – Snowball стемминг.


6. Пет-проект для закрепления

Задача: сравнить качество и скорость стемминга (Porter/Snowball для русского) и лемматизации (pymorphy2) на корпусе русскоязычных новостей (~10 000 документов). Оценить, какой подход даёт больше коллизий (когда разные слова сводятся к одной основе) и как это влияет на поиск по ключевому запросу.

Инструменты:

  • Python: nltk (PorterStemmer для русского через nltk.stem.snowball.RussianStemmer), pymorphy2, scikit-learn для оценки метрик.
  • Корпус: любой открытый набор новостей (например, lenta-ru-news из HuggingFace).
  • Метрики: время обработки, количество уникальных стемов/лемм, precision@k при поиске BM25.

Шаги:

  1. Загрузите корпус, проведите токенизацию.
  2. Примените стемминг и лемматизацию к каждому токену.
  3. Постройте инвертированный индекс (слова → документы) на основе стемов и лемм.
  4. Для набора тестовых запросов (10-20 разговорных фраз с разными формами слов) вычислите среднюю точность по первым 5 результатам.
  5. Замерьте время создания индекса.

Ожидаемый результат:

  • Стемминг даст индексацию в 3-5 раз быстрее.
  • Лемматизация выдаст на 10-15% больше precision@5 для запросов с глаголами прошедшего времени или прилагательными.
  • Коллизии стемминга приведут к ложным срабатываниям (например, запрос «печь» может выдать документы про «печь» (глагол) и про «печь» (существительное) – стем не различает).
  • Вывод: для поиска в новостях (где важна точность) стоит использовать лемматизацию; для поиска по тегам – стемминг.

Связь с другими вопросами

ВопросТема
901Токенизация – базовый этап предобработки перед стеммингом/лемматизацией
918Word embeddings – альтернативный способ учёта морфологии без явной нормализации

Навигация

  • Предыдущий: 901
  • Следующий: 903
  • Индекс: 00. Индекс разборов