Skip to main content

NER и семантический анализ для русского языка с Navec embeddings

Project description

mawo-natasha

PyPI версия Python 3.10+ Лицензия: MIT

NER и семантический анализ для русского языка с Navec embeddings и интеграцией SlovNet.

Возможности

  • Named Entity Recognition: Извлечение персон, мест и организаций
  • Navec Embeddings: 250K слов, 300 измерений, ~50МБ
  • Семантический анализ: Векторные представления для русских слов
  • Работа офлайн: После первой установки не требует интернета
  • Интеграция с SlovNet: Опциональная интеграция с mawo-slovnet
  • Качество: +30% точности семантического анализа

Установка

pip install mawo-natasha

С дополнительными зависимостями

# С интеграцией SlovNet
pip install mawo-natasha[slovnet]

# Всё вместе
pip install mawo-natasha[all]

Быстрый старт

Извлечение именованных сущностей

from mawo_natasha import MAWODoc

# Создаём документ
doc = MAWODoc("Александр Пушкин родился в Москве.")

# Сегментируем на предложения и токены
doc.segment()

# Извлекаем именованные сущности
print(f"Токены: {doc.tokens}")
print(f"Предложения: {doc.sents}")

Семантические векторы (Navec)

from mawo_natasha import RealRussianEmbedding

# Создаём embedding с Navec
embedding = RealRussianEmbedding(use_navec=True)

# Получаем векторное представление текста
doc = embedding("Привет, как дела?")

# Работаем с векторами
for token, emb in zip(doc.tokens, doc.embeddings):
    print(f"{token}: вектор размерностью {emb.shape}")
    # Привет: вектор размерностью (300,)
    # как: вектор размерностью (300,)
    # дела: вектор размерностью (300,)

Семантическая близость

from mawo_natasha import RealRussianEmbedding
import numpy as np

embedding = RealRussianEmbedding(use_navec=True)

# Получаем векторы для слов
vec1 = embedding("кот").embeddings[0]
vec2 = embedding("кошка").embeddings[0]
vec3 = embedding("собака").embeddings[0]

# Вычисляем косинусное сходство
def cosine_sim(v1, v2):
    return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

print(f"кот ↔ кошка: {cosine_sim(vec1, vec2):.3f}")   # ~0.85 (высокое)
print(f"кот ↔ собака: {cosine_sim(vec1, vec3):.3f}")  # ~0.65 (среднее)

Продвинутое использование

Интеграция с SlovNet

from mawo_natasha import MAWODoc
from mawo_slovnet import NewsNERTagger

# Создаём документ
doc = MAWODoc("Владимир Путин встретился с министром обороны.")

# Используем SlovNet для NER
ner = NewsNERTagger()
markup = ner(doc.text)

# Добавляем NER-метки в документ
doc.spans = markup.spans

# Выводим найденные сущности
for span in doc.spans:
    print(f"{span.text} -> {span.type}")
    # Владимир Путин -> PER
    # министром -> (морфология)

Навигация по документу

from mawo_natasha import MAWODoc

text = """
Александр Сергеевич Пушкин родился в Москве.
Он написал "Евгений Онегин" в 1833 году.
"""

doc = MAWODoc(text)
doc.segment()

# Проходим по предложениям
for i, sent in enumerate(doc.sents):
    print(f"Предложение {i+1}: {sent}")

# Работаем с токенами
print(f"Всего токенов: {len(doc.tokens)}")
print(f"Первые 5 токенов: {doc.tokens[:5]}")

Кастомная обработка

from mawo_natasha import MAWODoc

class CustomDoc(MAWODoc):
    def custom_analysis(self):
        """Свой метод анализа."""
        # Подсчёт слов
        word_count = len([t for t in self.tokens if t.isalpha()])

        # Подсчёт предложений
        sent_count = len(self.sents)

        return {
            "words": word_count,
            "sentences": sent_count,
            "avg_words_per_sent": word_count / sent_count if sent_count > 0 else 0
        }

doc = CustomDoc("Это первое предложение. Это второе. Третье здесь.")
doc.segment()
stats = doc.custom_analysis()
print(stats)
# {'words': 7, 'sentences': 3, 'avg_words_per_sent': 2.33}

Navec Embeddings

Характеристики

  • Словарь: 250,000 русских слов
  • Размерность: 300 измерений
  • Размер: ~50МБ
  • Источник: Обучен на новостных корпусах
  • Качество: Оптимизировано для русского языка

Автоматическая загрузка

from mawo_natasha import download_navec

# Загрузить Navec embeddings (если ещё не скачаны)
download_navec()

Fallback режим

Если Navec недоступен, используются случайные векторы:

from mawo_natasha import RealRussianEmbedding

# Попытка использовать Navec
embedding = RealRussianEmbedding(use_navec=True)

# Если Navec не найден, автоматически fallback на random embeddings
doc = embedding("тест")
# Работает, но качество ниже

Файлы данных

Embeddings хранятся в:

~/.cache/mawo_natasha/embeddings/
└── navec_news_v1/          # Navec embeddings (~50МБ)

Или в пакете:

mawo_natasha/
├── embeddings/
│   └── navec_news_v1_1B_250K_300d_100q.tar  # Navec
├── dictionaries/           # Служебные словари
└── models/                 # Дополнительные модели

Производительность

Скорость обработки

Операция Скорость
Токенизация ~5000 токенов/сек
Embedding lookup ~2000 слов/сек
Сегментация предложений ~1000 предложений/сек

Использование памяти

Компонент Память
Navec embeddings ~50МБ
Базовый анализатор ~10МБ
Итого ~60МБ

Типы сущностей

При интеграции с SlovNet распознаются:

  • PER (Персона): Имена, фамилии, отчества
  • LOC (Место): Города, страны, улицы
  • ORG (Организация): Компании, учреждения

Интеграция с другими MAWO библиотеками

С mawo-pymorphy3

from mawo_natasha import MAWODoc
from mawo_pymorphy3 import create_analyzer

doc = MAWODoc("Мама мыла раму.")
doc.segment()

# Морфологический анализ токенов
morph = create_analyzer()
for token in doc.tokens:
    parses = morph.parse(token)
    if parses:
        print(f"{token}: {parses[0].tag}")

С mawo-razdel

from mawo_natasha import MAWODoc
from mawo_razdel import sentenize

text = "Первое предложение. Второе предложение."

# Natasha сегментация
doc = MAWODoc(text)
doc.segment()
natasha_sents = doc.sents

# Razdel сегментация
razdel_sents = [s.text for s in sentenize(text)]

print(f"Natasha: {natasha_sents}")
print(f"Razdel: {razdel_sents}")

Источники

Основано на:

  • Natasha от Alexander Kukushkin (github.com/natasha/natasha)
  • Navec от Alexander Kukushkin (github.com/natasha/navec)
  • Обучение: Новостные корпуса (RIA, Lenta, etc.)

Решение проблем

Navec не загружается

# Попробуйте загрузить вручную
from mawo_natasha import download_navec
download_navec(force=True)

Ошибка импорта

pip install --upgrade mawo-natasha

Медленная первая загрузка

Это нормально - Navec скачивается один раз (~50МБ). Последующие запуски моментальны.

Разработка

Настройка окружения

git clone https://github.com/mawo-ru/mawo-natasha.git
cd mawo-natasha
pip install -e ".[dev]"

Запуск тестов

pytest tests/

Благодарности

Основано на Natasha и Navec от Alexander Kukushkin.

Улучшения MAWO:

  • Интеграция с Navec embeddings
  • Offline-first архитектура
  • Интеграция с mawo-slovnet
  • Оптимизация памяти

License

MIT License - see LICENSE file.

Ссылки


Сделано с ❤️ командой MAWO

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mawo_natasha-1.0.1.tar.gz (18.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mawo_natasha-1.0.1-py3-none-any.whl (13.6 kB view details)

Uploaded Python 3

File details

Details for the file mawo_natasha-1.0.1.tar.gz.

File metadata

  • Download URL: mawo_natasha-1.0.1.tar.gz
  • Upload date:
  • Size: 18.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for mawo_natasha-1.0.1.tar.gz
Algorithm Hash digest
SHA256 edc7bb8c7316c4d3576134656ca362f8bcde9c391477bcc5265a3508bb0c1501
MD5 f27672543b754621daf8b32669ec1860
BLAKE2b-256 78c621c948f50e0ac76177c057b65146f1220836944ab4faa670cf2510300c13

See more details on using hashes here.

Provenance

The following attestation bundles were made for mawo_natasha-1.0.1.tar.gz:

Publisher: publish.yml on mawo-ru/mawo-natasha

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mawo_natasha-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: mawo_natasha-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 13.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for mawo_natasha-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 bc8efef0ad98b486906387a7240ac2dd2a75edd826949ea05eff36c85995c287
MD5 023a9b89cd7b4fcdbfe91d6f69908a9c
BLAKE2b-256 d5f4996f047c94ce285ba82cb2f77b891364f3aea5ee17cee445b59c897b8dad

See more details on using hashes here.

Provenance

The following attestation bundles were made for mawo_natasha-1.0.1-py3-none-any.whl:

Publisher: publish.yml on mawo-ru/mawo-natasha

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page