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

Какие библиотеки для русского 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 с поддержкой русского языка.

YandexGPT:

  • Основана на YaLM (100 млрд параметров).
  • Поддерживает диалоговый режим, суммаризацию, генерацию кода.
  • Пайплайн NLP: модель может работать как NLG-модуль после классической обработки (например, генерация ответа на основе извлечённых сущностей).
  • Пример: получить текст, отфильтровать спам, передать в YandexGPT для рерайтинга.

GigaChat:

  • Обладает функциями NLP: NER, генерация, диалог.
  • Отличительная особенность — поддержка русского юридического и медицинского домена.
  • API позволяет задавать системные промпты.

Сравнение:

ПараметрYandexGPTGigaChat
МодельYaLM 100BMGPT (рекуррентный гибрид)
КачествоВысочайшееХорошее, но ниже на сложных задачах
Бесплатный доступКвоты (ориентировочно 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 или DeepPavlovNatasha — лёгкая, DeepPavlov — точнее (BERT)
Даты, числа, адресаNatashaСпециализированные парсеры
Классификация текстаDeepPavlov (RuBERT)Лучше кастомизировать через дообучение
Ответы на вопросы (SQuAD)DeepPavlovГотовая модель
Генерация текстаYandex GPT / GigaChat APIНе требуют собственной инфраструктуры
Высоконагруженный пайплайнСвоя реализация (например, pymorphy2 + Natasha)Ниже latency, нет зависимости от облака

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

Задача: Построить конвейер для автоматического аннотирования новостных текстов: извлечение дат, имён, организаций и приведение всех слов к нормальной форме.

Инструменты: Python, pymorphy2, Natasha (сегментация, NER, даты), JSON для вывода.

Шаги:

  1. Написать функцию normalize_text(text), которая через pymorphy2 лемматизирует все слова.
  2. Использовать Natasha для разбиения на предложения и извлечения сущностей (NER, даты).
  3. Объединить: сначала сегментация → NER → лемматизация каждого токена.
  4. Вывести структуру: список предложений, каждое с 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. Индекс разборов