Какие библиотеки для русского NLP вы знаете? (pymorphy2, Natasha, DeepPavlov, Yandex GPT API, GigaChat API)
Краткий тезис
Русскоязычный NLP-ландшафт включает как классические библиотеки для морфологического анализа (pymorphy2), так и гибридные пайплайны (Natasha) и полноценные фреймворки (DeepPavlov). Для генеративных задач используются облачные API: Yandex GPT и GigaChat API. Выбор инструмента определяется задачей: морфология, извлечение сущностей, классификация или генерация текста.
2. Natasha: NER, даты и нормализация
Natasha — набор библиотек для морфемного анализа, извлечения именованных сущностей (NER), распознавания дат, чисел, адресов и телефонов. Основана на гибридном подходе: правилами (эвристиками) + нейросетевых моделях (для NER — BERT-like encoder).
Ключевые модули:
natasha— основной фреймворк, включает токенизацию, сегментацию предложений, морфологию, лемматизацию.ner— NER-модель для русского (персоны, организации, локации, даты, деньги и т.д.), обученная на собственных корпусах.dates— парсинг и нормализация дат (относительных и абсолютных).numbers— распознавание чисел (включая прописные).address— разбор адресов (неофициальная, но мощная).
Пример:
from natasha import (
Segmenter,
NewsEmbedding, NewsMorphTagger,
NewsSyntaxParser,
NewsNERTagger,
Doc
)
text = "Вчера, 15 марта 2024 года, компания Яндекс объявила о старте продаж в Москве."
segmenter = Segmenter()
emb = NewsEmbedding()
morph_tagger = NewsMorphTagger(emb)
syntax_parser = NewsSyntaxParser(emb)
ner_tagger = NewsNERTagger(emb)
doc = Doc(text)
doc.segment(segmenter)
doc.tag_morph(morph_tagger)
doc.parse_syntax(syntax_parser)
doc.tag_ner(ner_tagger)
for span in doc.spans:
print(f"{span.type}: {span.text}")
# DATE: 15 марта 2024
# ORG: Яндекс
# LOC: Москва
Ограничения:
- NER обучена на новостях (News), может хуже работать на разговорной речи или узких доменах.
- Морфологический анализатор внутри Natasha — обёртка над pymorphy2, но с дополнительными норматизациями.
3. DeepPavlov: полный стек
DeepPavlov — фреймворк для построения конвейеров NLP, включая классификацию, вопросно-ответные системы (SQuAD), NER, тональность, генерацию. Имеет готовые конфигурационные файлы для русского языка (deeppavlov/models/ner, deeppavlov/models/qa и др.).
Ключевые компоненты:
- NER — на основе BERT (RuBERT) с поддержкой многослойного CRF. Высокая точность на новостях и биомедицинских текстах.
- SQuAD — русскоязычная модель для ответа на вопросы по контексту (
rubert_base_cased). - Классификация — предобученные модели для определения тональности (RuSentiment) или темы.
- Генерация диалогов — на основе TF-IDF + RNN или Transformer.
Пример (конфиг для NER, запуск через Python):
from deeppavlov import build_model, configs
ner_model = build_model(configs.ner.ner_ontonotes_bert, download=True)
print(ner_model(["Компания Apple открыла новый офис в Москве"]))
# [['Компания', 'Apple', 'открыла', 'новый', 'офис', 'в', 'Москве']]
# [['B-ORG', 'I-ORG', 'O', 'O', 'O', 'O', 'B-LOC']]
Ограничения:
- Тяжёлые модели (требуют GPU для быстрой работы).
- Версия 1.0 устарела; DeepPavlov Dream — новая версия, но нестабильна.
- Не поддерживает прямой online-обучение пользовательских моделей (только дообучение на своём датасете).
4. Yandex GPT / GigaChat: API для генерации
Yandex GPT и GigaChat API — облачные генеративные модели от Яндекса и Сбера. Предоставляют доступ через REST API с поддержкой русского языка.
- Основана на YaLM (100 млрд параметров).
- Поддерживает диалоговый режим, суммаризацию, генерацию кода.
- Пайплайн NLP: модель может работать как NLG-модуль после классической обработки (например, генерация ответа на основе извлечённых сущностей).
- Пример: получить текст, отфильтровать спам, передать в YandexGPT для рерайтинга.
- Обладает функциями NLP: NER, генерация, диалог.
- Отличительная особенность — поддержка русского юридического и медицинского домена.
- API позволяет задавать системные промпты.
Сравнение:
| Параметр | YandexGPT | GigaChat |
|---|---|---|
| Модель | YaLM 100B | MGPT (рекуррентный гибрид) |
| Качество | Высочайшее | Хорошее, но ниже на сложных задачах |
| Бесплатный доступ | Квоты (ориентировочно 10k токенов/день) | Есть бесплатный тариф |
| Специализация | Общая | Юриспруденция, медицина |
Пример (YandexGPT, упрощённый):
import requests
yandex_key = "..."
response = requests.post(
url="https://llm.api.cloud.yandex.net/foundationModels/v1/completion",
headers={"Authorization": f"Api-Key {yandex_key}"},
json={
"model": "yandexgpt/latest",
"messages": [{"role": "user", "text": "Напиши кратко о задаче NER"}]
}
)
print(response.json()["result"]["alternatives"][0]["message"]["text"])
Ограничения: закрытый код, стоимость, задержки, зависимость от интернета.
5. Сравнение по задачам
| Задача | Лучшая библиотека | Пояснение |
|---|---|---|
| Морфология, лемматизация | pymorphy2 | Быстрый, лёгкий, не требует GPU |
| Извлечение именованных сущностей (NER) | Natasha или DeepPavlov | Natasha — лёгкая, DeepPavlov — точнее (BERT) |
| Даты, числа, адреса | Natasha | Специализированные парсеры |
| Классификация текста | DeepPavlov (RuBERT) | Лучше кастомизировать через дообучение |
| Ответы на вопросы (SQuAD) | DeepPavlov | Готовая модель |
| Генерация текста | Yandex GPT / GigaChat API | Не требуют собственной инфраструктуры |
| Высоконагруженный пайплайн | Своя реализация (например, pymorphy2 + Natasha) | Ниже latency, нет зависимости от облака |
Пет-проект для закрепления
Задача: Построить конвейер для автоматического аннотирования новостных текстов: извлечение дат, имён, организаций и приведение всех слов к нормальной форме.
Инструменты: Python, pymorphy2, Natasha (сегментация, NER, даты), JSON для вывода.
Шаги:
- Написать функцию
normalize_text(text), которая через pymorphy2 лемматизирует все слова. - Использовать Natasha для разбиения на предложения и извлечения сущностей (NER, даты).
- Объединить: сначала сегментация → NER → лемматизация каждого токена.
- Вывести структуру: список предложений, каждое с
entities(тип, текст, нормальная форма) иdates(нормализованная дата).
Ожидаемый результат:
- Код пайплайна (100-200 строк).
- Тестовый вывод на тексте: "Президент России Владимир Путин 25 апреля 2025 года посетил Казань."
{ "sentences": [{ "text": "Президент России Владимир Путин 25 апреля 2025 года посетил Казань.", "entities": [ {"type": "PERSON", "text": "Владимир Путин", "normal": "владимир путин"}, {"type": "LOC", "text": "России", "normal": "россия"}, {"type": "LOC", "text": "Казань", "normal": "казань"} ], "dates": [{"text": "25 апреля 2025 года", "normalized": "2025-04-25"}] }] }
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 901 | Основные задачи NLP |
Навигация
- Предыдущий: 917
- Следующий: 919
- Индекс: 00. Индекс разборов