Что такое pymorphy2 и Natasha? В чем разница между морфологическим анализом и синтаксическим парсингом?
Краткий тезис
pymorphy2 и Natasha — две популярные Python-библиотеки для обработки русского языка, решающие задачи разных уровней лингвистического анализа. pymorphy2 выполняет морфологический анализ (лемматизацию, POS-теггинг, извлечение грамматических признаков) на основе статического словаря OpenCorpora. Natasha — более современный фреймворк, реализующий синтаксический парсинг (деревья зависимостей), а также NER и распознавание сущностей (дат, имён). Разница между морфологическим и синтаксическим анализом фундаментальна: первый оперирует отдельными словами, второй — связями между ними в предложении. Для реальных NLP-проектов часто требуется комбинация обоих подходов.
2. Обзор Natasha
Natasha — фреймворк от команды Natasha (проект нейросетевых NLP-инструментов для русского языка), построенный на глубоком обучении (трансформеры BERT, контекстные эмбеддинги). Включает несколько модулей:
- Мета-парсер (
MetaParser) — выделение предложений и токенизация на основе нейросетевой сегментации. - POS-теггер — определяет часть речи (может использовать pymorphy2 как fallback).
- Синтаксический парсер — строит дерево зависимостей в формате UD (головное слово, тип отношения
nsubj,obj,amodи т.д.). - NER — распознавание персон, организаций, локаций и других сущностей (на базе BERT).
- Извлечение дат, чисел, адресов — с нормализацией (например, «через два дня» → конкретная дата).
- Transformer-тюнинг — дообучение на кастомных данных.
Natasha требует более мощного железа (GPU для быстрой работы, хотя на CPU тоже возможно, но медленнее). Модели весят от 200 МБ до 1.5 ГБ.
Когда использовать Natasha:
- Глубокий синтаксический анализ предложений (извлечение субъекта-объекта, отношений).
- Извлечение структурированной информации из текста (даты, имена, деньги).
- Сборка комплексного пайплайна NLP, где нужно не только разобрать слова, но и понять, как они связаны.
Natasha не предназначена для быстрой лемматизации больших объёмов текста — уступает pymorphy2 по скорости (но может вызывать pymorphy2 в качестве вспомогательного компонента).
3. Сравнение и когда что использовать
Морфологический vs синтаксический анализ
| Аспект | Морфологический (pymorphy2) | Синтаксический (Natasha + модули) |
|---|---|---|
| Единица анализа | Отдельное слово (токен) | Слово в контексте предложения |
| Результат | Лемма, POS, падеж, число и т.д. | Дерево зависимостей (отношения) + метки ролей |
| Пример вывода (слово «книгу») | {'word': 'книгу', 'lemma': 'книга', 'POS': 'NOUN', 'case': 'acc', 'number': 'sing'} | Синтаксис: зависит от глагола, obj |
| Зависимость от контекста | Слабая (омонимы разрешаются вероятностно) | Сильная (требует целое предложение) |
| Скорость | Высокая (10k+ wps) | Умеренная (100–500 wps на CPU) |
| Потребление ресурсов | Минимальное (без моделей ML) | Значительное (нейросети, RAM/GPU) |
Практические рекомендации
- Для быстрой предобработки (чистка, лемматизация корпуса, TF-IDF) — используйте pymorphy2.
- Для извлечения грамматических признаков из отдельного слова (например, проверка падежа в QA-системе) — pymorphy2.
- Для построения графов зависимостей, определения подлежащего/сказуемого — Natasha (или аналог SpaCy с русской моделью).
- Для комплексного пайплайна (NER + даты + синтаксис + лемматизация) — комбинируйте: pymorphy2 для лемм, Natasha для синтаксиса.
- Если важна скорость и стабильность на больших данных — pymorphy2; если важна точность и глубина — Natasha.
4. Примеры кода для обоих
pymorphy2 — морфологический разбор
import pymorphy2
morph = pymorphy2.MorphAnalyzer()
word = "лучшему"
parses = morph.parse(word)
for p in parses:
print(f"Слово: {p.word}, лемма: {p.normal_form}, POS: {p.tag.POS}, "
f"падеж: {p.tag.case}, число: {p.tag.number}, вес: {p.score}")
# Вывод (первый вариант):
# Слово: лучшему, лемма: хороший, POS: ADJF, падеж: datv, число: sing, вес: 0.97
Natasha — синтаксический разбор
from natasha import (
Segmenter,
MorphVocab,
NewsEmbedding,
NewsMorphTagger,
NewsSyntaxParser,
Doc,
)
segmenter = Segmenter()
morph_vocab = MorphVocab()
emb = NewsEmbedding()
morph_tagger = NewsMorphTagger(emb)
syntax_parser = NewsSyntaxParser(emb)
text = "Маша прочитала интересную книгу."
doc = Doc(text)
doc.segment(segmenter)
doc.tag_morph(morph_tagger)
doc.parse_syntax(syntax_parser)
for token in doc.tokens:
print(f"{token.text} : {token.pos} , head={token.head_id} , rel={token.rel}")
# Пример вывода:
# Маша : PROPN , head=2 , rel=nsubj
# прочитала : VERB , head=0 , rel=root
# интересную : ADJ , head=4 , rel=amod
# книгу : NOUN , head=2 , rel=obj
# . : PUNCT , head=2 , rel=punct
Дополнительно: NER с Natasha
from natasha import NewsNERTagger
ner_tagger = NewsNERTagger(emb)
doc.tag_ner(ner_tagger)
for span in doc.spans:
print(f"Сущность: {span.text}, тип: {span.type}") # Person, Org, Loc, Date
5. Пет-проект для закрепления
Задача: Реализовать скрипт, который принимает на вход русскоязычную новостную статью (5–10 предложений) и выводит:
- Таблицу лемм, POS-тегов и грамматических признаков для каждого слова (pymorphy2).
- Синтаксическое дерево в виде списка пар «зависимое → главное» с типом отношения (Natasha).
- Именованные сущности (NER) с типами (Natasha).
- Вывод о том, какие слова в обоих анализах трактуются по-разному (омонимы, грамматическая неоднозначность).
Инструменты: Python 3.9+, pymorphy2, natasha (с моделями NewsEmbedding), Jupyter Notebook или скрипт.
Шаги:
- Установить библиотеки:
pip install pymorphy2 natasha - Загрузить текст (например, из файла или вставить вручную).
- Токенизировать с помощью Natasha (сегментация на предложения и токены).
- Пройти по каждому токену: вызвать
morph.parse()и сохранить результаты. - Используя тот же список токенов, применить синтаксический парсер Natasha (обработать каждое предложение отдельно).
- Извлечь NER-сущности.
- Сформировать итоговый отчёт (Markdown-таблицы или вывод в консоль).
Ожидаемый результат:
- Понимание, как лемматизация pymorphy2 может давать разные варианты для одного слова в зависимости от контекста (омонимы).
- Умение интерпретировать синтаксические отношения (например,
nsubj— подлежащее,obj— прямое дополнение). - Навык комбинирования двух библиотек в одном пайплайне.
Связь с другими вопросами
Навигация
- Предыдущий: 900
- Следующий: 902
- Индекс: 00. Индекс разборов
Навигация
- Предыдущий: 900
- Следующий: 902
- Индекс: 00. Индекс разборов