Современные морфоанализаторы русского языка: от словарей к нейросетям

от автора

Введение

В статье «Извлечение и обработка требований из документов с помощью NLP-инструментов» я уже показывал, как переход от LLM к NLP-библиотекам помогает ускорить обработку текста. Это, конечно, не значит, что нужно совсем отказываться от LLM — они незаменимы для генерации текста и сложных рассуждений. Но чтобы определить, что «кошками» — это творительный падеж множественного числа существительного «кошка», действительно не нужен миллиард параметров нейросети. Для задач лемматизации, POS-тегирования и определения падежа существуют специализированные инструменты, которые работают быстрее, обходятся дешевле и зачастую точнее LLM в конкретных доменах. Это подтверждают годы их использования в поисковых системах, email-фильтрах и чат-ботах.

Сам я часто использую библиотеки spaCy и PyMorphy3, но наткнулся на упоминание того, что проект PyMorphy3 уже не активен. Мне захотелось разобраться в том, какие решения сейчас существуют для работы с текстами на русском языке, и немного заглянуть в историю этой темы.

Я поискал готовые обзорные статьи и нашёл несколько интересных материалов:

Многие из этих материалов вышли достаточно давно, поэтому решил актуализировать информацию со ссылками на первоисточники там, где это важно.

Немного истории

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

Словарь Зализняка как нулевая точка

В 1977 году лингвист Андрей Антонович Зализняк издал «Грамматический словарь русского языка» — и это была не просто академическая работа. Словарь содержал формализованное описание словоизменения для десятков тысяч лексем: для каждого слова был указан тип склонения или спряжения, по которому можно восстановить все его формы. Важно понимать, что словарь изначально не был машинным ресурсом — это была лингвистическая формализация, описанная в книжном формате. Однако сама система записи позволяла относительно легко перевести её в цифровой вид: любой человек, прочитав описание правила, мог восстановить все формы слова. Именно эта особенность сделала словарь основой для множества компьютерных программ автоматического морфологического анализа.

В статье Зализняк: основа русской прикладной лингвистики приводится информация о том, как в СССР и затем в России действительно сформировалось несколько поколений морфологических анализаторов — от экспериментальных систем, работавших на мейнфреймах и в научных лабораториях, до массовых прикладных решений, встроенных в текстовые редакторы, словари и поисковые системы. В 1990-е годы это направление стало особенно практико-ориентированным: появились DOS-программы вроде ORFO (разработки Ашманова), Presto! и «Лексикон + Ортодок», в которых морфологический анализ уже использовался для проверки орфографии и нормализации словоформ. Параллельно развивались Windows-решения, такие как «Пропись» (С. Королёв), а также программные библиотеки libmorph / linguist.dll (А. Коваленко).

К концу десятилетия морфологические модели стали важной частью поисковых технологий — их использовали практически все русскоязычные поисковые системы, такие как Aport, Rambler и Яндекс, для лемматизации запросов и расширения поиска по словоформам. Все эти разработки в той или иной степени опирались на лингвистическую формализацию, восходящую к школе Зализняка, и стали фундаментом для более поздних систем — включая AOT и подходы, основанные на двухуровневой морфологии и конечных автоматах.

В 2001 году появляется проект AOT (Автоматическая Обработка Текста) — набор лингвистических процессоров, в основе которых лежали словари, производные от работы Зализняка. Параллельно шло теоретическое осмысление: формализация морфологии через конечные автоматы-трансдьюсеры (FST), работы по двухуровневой морфологии.

OpenCorpora и сдвиг в сторону открытости

Можно сказать, что долгое время словари были закрытыми или коммерческими. Ситуация начала меняться в начале 2010-х, когда сформировался проект OpenCorpora — открытый морфологический словарь русского языка с лицензией CC-BY-SA. Это был принципиальный сдвиг: вместо зависимости от закрытых ресурсов у разработчиков появилась общая база, которую можно было свободно использовать, улучшать и встраивать в свои инструменты.

Конечно, OpenCorpora — не единственный открытый ресурс. Стоит упомянуть Национальный корпус русского языка (НКРЯ) с собственной системой морфологической разметки, древовидные корпусы Universal Dependencies (UD Russian, UD Russian-SynTagRus), предоставляющие полную морфосинтаксическую аннотацию, а также открытые словари проекта AOT, исторически служившие основой для ранних версий морфоанализаторов. Однако именно OpenCorpora стал де-факто стандартом благодаря трём факторам: удобная лицензия CC-BY-SA, разрешающая коммерческое использование, краудсорсинговая модель обновления, обеспечивающая актуальность лексики, продуманный формат данных, легко интегрируемый в библиотеки.

Эволюция морфоанализаторов и методы их оценки

С развитием открытых лексических ресурсов и вычислительных методов морфологический анализ вышел за пределы чисто словарных подходов и стал опираться на комбинацию нескольких стратегий: словарных баз, правил и вероятностных моделей. Как отмечается в сравнительных исследованиях, современные морфоанализаторы используют как лексиконы (например, построенные на грамматических словарях или корпусах вроде OpenCorpora), так и методы предсказания для обработки неизвестных слов и снятия омонимии на основе контекста.

Параллельно с развитием самих анализаторов существенно продвинулись и методы их оценки. Уже в рамках кампании RU-EVAL 2010 года на Оценке методов автоматического анализа текста: морфологический анализ русского языка, посвящённой сравнительному тестированию морфологических парсеров русского языка, было показано, что лучшие результаты достигаются при использовании гибридных систем, сочетающих словарную полноту с контекстной вероятностной интерпретацией.

Более поздние сравнительные работы, например, A Close Look at Russian Morphological Parsers: Which One Is the Best, подтверждают этот вывод: качество морфологического анализа определяется не только объёмом и качеством словаря, но и способностью системы учитывать контекст и обрабатывать неизвестные слова. Это особенно важно для русского языка с его развитой флективной системой и высокой степенью омонимии. Таким образом, эволюция морфоанализаторов характеризуется переходом к гибридным архитектурам, а развитие методов оценки — использованием корпусных методов оценки и метрик, учитывающих как точность лемматизации, так и качество морфосинтаксической разметки.

Обзор существующих решений

Традиционные морфологические анализаторы, основанные на словарях и жёстких правилах, не утратили актуальности и до сих пор активно поддерживаются авторами и сообществом. Однако современные инструменты пошли дальше: они объединяют лексикографическую точность, эвристические алгоритмы и контекстные нейросетевые модели. Сегодня это уже не монолитный класс программ, а широкий спектр решений — от компактных словарных библиотек до сложных нейросетевых пайплайнов. Их ключевые различия заключаются не только в качестве разбора, но и в требованиях к вычислительным ресурсам, скорости обработки и удобстве интеграции в рабочие процессы.

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

Mystem

Mystem — один из наиболее известных морфологических анализаторов для русского языка, разработанный в Яндексе. Это зрелое, но фактически «замороженное» решение: последняя крупная версия 3.1 относится к 2014 году, а публичная информация о дальнейшем развитии проекта отсутствует. Тем не менее инструмент традиционно считается одним из наиболее качественных морфологических анализаторов для русского языка. Основные ограничения Mystem обусловлены его закрытым исходным кодом: невозможно самостоятельно исправить ошибки или адаптировать анализатор под специфические требования. Кроме того, инструмент не предоставляет нативного API для современных языков программирования — распространяется исключительно в виде бинарного исполняемого файла, что усложняет интеграцию в новые проекты и требует использования обёрток сторонних разработчиков.

libmorph

Библиотека морфологического анализа от Александра Коваленко libmorph — это пионер промышленного морфологического анализа. Почитать, что пишет автор о библиотеке, можно в статье Тридцать лет libmorph. Это устоявшееся прикладное решение, ориентированное на встраивание в другие системы. Библиотека активно использовалась в 90–2000-х годах в текстовых редакторах, словарях и поисковых системах. В основе лежал словарно-правиловой подход (в духе Зализняка), но с сильным акцентом на инженерную реализацию: компактные структуры данных, высокая скорость разбора и возможность работы на ограниченных ресурсах. По сути, libmorph стал одним из первых массовых «движков» морфологического анализа, доведённых до production-уровня. Самое главное, что проект до сих пор поддерживается автором.

Для меня эта библиотека стала неожиданным открытием. Задача у меня была прикладная: для каждого слова из наименования детали или сборочной единицы получить его лемму. Проект делался на Free Pascal, и никакого Python-окружения поднимать не хотелось.

Интеграция свелась к написанию тонкого binding-модуля — Pascal-обёртки над vtable-интерфейсом IMlmaMb, которую morphrus.dllэкспортирует в стиле COM. Разобраться с интеграцией библиотеки помог LLM, с третьей попытки выдав рабочий вариант обёртки.

В результате была сформирована отдельная функция, которая лемматизирует список слов через, без каких-либо сторонних зависимостей. Кроме того приятно удивила скорость загрузки DLL и скорость работы со словарём.

Эволюция открытых библиотек PyMorphy

На рубеже 2010-х годов у Python-разработчиков наконец появляется удобный инструмент для работы с русской морфологией — PyMorphy от Михаила Коробова. В 2009 вышла первая публикация Кузявые ли бутявки, т.е. пишем морфологический анализатор на Python, в которой автор изложил основные принципы работы и назначение. Библиотека использовала словари AOT и давала простой API: передаёшь слово, получаешь его разбор. Для своего времени это было большим шагом вперёд, но словари AOT имели ограничения, и проект постепенно уступил место преемнику.

В 2012 начата работа над PyMorphy2, а в 2013 Михаил Коробов публикует статью о pymorphy2, представляя переработанную версию на основе OpenCorpora. Библиотека стала стандартом де-факто: быстрая, надёжная, с понятным API и хорошим покрытием словаря. Именно её большинство разработчиков имеют в виду, когда говорят «морфологический анализатор для Python». Pymorphy2 попала в учебники, в продакшен-системы, в десятки open-source проектов.

В 2022 году Danylo Halaiko (@d9nich) выпустил PyMorphy3 — форк с поддержкой актуальных версий Python и украинского языка в дополнение к русскому. Это был точечный ремонт PyMorphy2: совместимость восстановлена, API не изменился. Однако история повторилась — развитие проекта замедлилось.

Эстафету подхватили две различные команды. В 2025 году вышла Mawo-pymorphy3 от команды MAWO, о чём был опубликован развёрнутый технический отчёт с деталями оптимизации. По данным авторов проекта, переход на DAWG-структуры позволил сократить потребление памяти примерно с 500 МБ до 50 МБ, а также уменьшить время холодного старта до 1–2 секунд при сохранении совместимости с API pymorphy2.

Также в 2025 году была представлена Steosmorphy от Mind Simulation — об этом был отдельный материал на Хабре: SteosMorphy: опенсорс замена давно умершему PyMorphy2. Это решение пошло в другом направлении — было реализовано Go-ядро с Python-обёрткой, с ориентиром на высокопроизводительные пайплайны.

Пока проекты словарных анализаторов передавали эстафету друг другу, параллельно развивалось совершенно другое направление.

Решения с использованием нейросетей

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

rnnmorph

В 2018 году Илья Гусев представил rnnmorph — нейросетевой морфологический анализатор для русского языка, который мог разбирать русские слова по частям речи и грамматике. Программа смотрит на каждую букву в слове, чтобы понять его строение, а потом анализирует соседние слова — что стоит слева и справа. Это помогает правильно определить, в каком падеже стоит слово, какого оно рода, единственное или множественное число, и так далее. Программу обучали на большой коллекции размеченных русских текстов. Если нейросеть не была уверена в форме слова, на помощь приходил другой инструмент — pymorphy2 в качестве резервного решения, что позволило реализовать гибридную архитектуру, объединяющую статистические и нейросетевые подходы. С методологическими деталями реализации можно ознакомиться в статье Improving part-of-speech tagging via multi-task learning and character-level word representations.

На текущий момент проект находится в режиме архива: отсутствие обновлений, зависимость от TensorFlow 1.x и Keras <2.4, а также несовместимость с Python ≥3.10 ограничивают его применимость в современных решениях. Для новых разработок автор рекомендует использовать решение Slovnet, о которой расскажу ниже.

Natasha и Slovnet: ставка на компактность

Проект Natasha был начат в 2017 году, немного подробностей о начале работы можно найти в статье Yargy-парсер и библиотека Natasha. Извлечения структурированной информации из текстов на русском языке. В 2020 году проект выпустил библиотеку Slovnet с принципиально иным подходом. Вместо тяжёлых трансформеров — компактные нейросетевые модели, обученные с использованием методов дистилляции и расширенных корпусов. Модель для морфологии занимает несколько мегабайт и работает на CPU без заметных задержек.

Natasha в целом придерживается философии «русский NLP без внешних зависимостей и без GPU» — и Slovnet хорошо отражает этот принцип. Для большинства практических задач точности хватает, а накладные расходы минимальны. Хорошее описание возможностей приведено в статье Проект Natasha. Набор качественных открытых инструментов для обработки естественного русского языка (NLP).

DeepMorphy и MARu

Говоря об анализаторах стоит также упомянуть о DeepMorphy — анализаторе для .NET, сочетающем нейросеть со словарём OpenCorpora. Высокая точность сделала его интересным вариантом для C#-стека. Единственное, что стоит сказать, — последний коммит в репозиторий был около 5 лет назад, проект фактически заброшен. Архитектура .NET-специфична, что ограничивает переиспользование. Нет публичной информации о бенчмарках и метриках качества данного анализатора.

MARu от Chomechome предлагает немного другое решение: модульность. Библиотека позволяет выбирать между CRF, RNN и pymorphy2 в зависимости от задачи, обучена на данных MorphoRuEval-2017 и достигает 96.3% точности на том же бенчмарке. Удобно, когда нужно экспериментировать или сравнивать подходы в рамках одного проекта. Однако у проекта есть существенный недостаток: он не поддерживается уже более пяти лет, а последние коммиты датируются 2021 годом.

Международные кросс-языковые конвейеры

Конечно, существуют и международные решения, изначально ориентированные на многоязычную обработку текстов, а не только на русский язык. Одним из таких инструментов является UDPipe — обучаемый конвейер для обработки естественного языка, разработанный в 2016 году Миланом Стракой и коллегами из Института формальной и прикладной лингвистики Карлова университета (Прага). Система поддерживает токенизацию, морфологическую разметку, лемматизацию и синтаксический парсинг, а результаты обработки могут быть представлены в формате CoNLL-U.

В свою очередь, Stanza — библиотека обработки естественного языка, представленная командой Stanford NLP в 2020 году, — развивает схожий подход, однако делает основной акцент на современных нейросетевых архитектурах и глубокой интеграции с экосистемой PyTorch. Система предоставляет инструменты для токенизации, морфологического и синтаксического анализа, лемматизации и распознавания именованных сущностей, поддерживая работу с множеством языков в рамках единого унифицированного конвейера обработки текста.

Однако для задач русского языка специализированные инструменты (например, Slovnet или отдельные конфигурации DeepPavlov) могут оказаться удобнее универсальных конвейеров вроде UDPipe и Stanza — прежде всего за счёт меньших требований к ресурсам, более компактных моделей и лучшей адаптации к русскоязычным корпусам.

Комплексные решения

DeepPavlov

Разработанный Московским физико-техническим институтом (МФТИ), изначально проект DeepPavlov создавался как фреймворк для диалоговых систем, но со временем превратился в универсальную библиотеку, охватывающую практически весь стек обработки естественного языка.

Внутри доступны: морфологический анализ и POS-tagging, распознавание именованных сущностей (NER), синтаксический разбор, модели вопросно-ответных систем, диалоговые модели, трансформерные архитектуры. Ключевая особенность DeepPavlov — использование контекстных нейросетевых моделей. В отличие от словарных подходов, анализ здесь выполняется не для отдельного слова, а для всей последовательности целиком. С примерами использования решения можно ознакомиться в статьях: Автоматизация обслуживания клиентов: An End-To-End решение от DeepPavlov и DeepPavlov 3 года: обзор и итоги 2020 года.

spaCy

Одна из самых популярных NLP-библиотек в промышленной разработке для Python — это spaCy. В отличие от академических решений, она изначально проектировалась как инструмент для production-систем: быстрый, стабильный и предсказуемый. Архитектурно spaCy построен вокруг модульного pipeline, где каждый этап обработки представляет собой независимый компонент. Это позволяет гибко собирать цепочки обработки под конкретную задачу. Библиотека реализует стандартный пайплайн обработки текста: токенизация, лемматизация, POS-tagging, dependency parsing, NER.

Для русского языка поддержка появилась позже, чем для английского, и в значительной степени она опирается на статистические и нейросетевые модели, а также интеграции с внешними лемматизаторами. spaCy чаще выступает не как «лучший морфологический анализатор», а как универсальный оркестратор NLP-пайплайна, который при необходимости дополняется внешними решениями.

Catalyst (C# / .NET)

Отдельного упоминания заслуживает Catalyst — NLP-библиотека для .NET-экосистемы. Важно сразу расставить акценты: это не тот Catalyst, что в мире Python (фреймворк для обучения моделей), а самостоятельный проект для C# разработчиков. Библиотека построена поверх ML.NET и следует философии «всё в одном стеке»: токенизация, лемматизация, POS-тегирование и NER доступны без выхода за пределы .NET. Под капотом — модели в формате ONNX и пайплайны ML.NET, что позволяет запускать инференс напрямую в приложении, без зависимости от Python-окружения. Для команд, которые уже используют C# в продакшене, это серьёзное преимущество: не нужно поднимать отдельные микросервисы или настраивать межъязыковое взаимодействие.

Есть нюансы использования библиотеки: поддержка русского языка в Catalyst пока остаётся ограниченной. Морфологический анализ реализован на базовом уровне, качество разметки сильно зависит от предобученных моделей, которые в основном ориентированы на английский. Если ваш проект требует точной работы с падежами, числом или родом русских существительных — Catalyst, скорее всего, не станет «коробочным» решением.

Однако у разработчиков есть элегантный обходной путь: официальный пакет Catalyst.Spacy, который позволяет запускать модели spaCy напрямую из C# кода. Интеграция построена на базе Python.Included — библиотеки, которая автоматически разворачивает изолированное окружение Python при первом запуске и не требует ручной установки интерпретатора.

Подводя итоги

Для себя я сформулировал следующие области для применения решений:

  • Нужна просто лемматизация в Python — использую Mawo-pymorphy3. Без вопросов, без GPU, холодный старт за секунду.

  • Нужна полная морфоразметка с POS-тегами и падежами — добавляю Slovnet. Работает на CPU, модель весит мегабайты, точности обычно достаточно для большинства прикладных задач.

  • Строю полноценный NLP-пайплайн — тут spaCy для меня без вариантов. Для морфологии и изменения словоформ дополнительно подключаю Mawo-pymorphy3 или Slovnet.

  • Нужен контекст NER, вопросно-ответные системы, диалоги — можно использовать DeepPavlov.

  • Делаю проект на Free pascallibmorph отличный вариант, до сих пор поддерживается автором, работает как DLL, подключается куда угодно.

Заключение

Эта статья стала результатом систематического поиска и проверки существующих инструментов для обработки русского текста. Её стоит воспринимать как небольшой навигационный гид в русскоязычных NLP-решениях. Надеюсь, что человек, который впервые сталкивается с задачей морфоанализа русского текста, получит здесь нужную информацию для старта.

ссылка на оригинал статьи https://habr.com/ru/articles/1037128/