Улучшенный морфологический анализатор для русского языка с DAWG-оптимизацией и сокращением памяти на 90%
Project description
mawo-pymorphy3
Улучшенный морфологический анализатор для русского языка с удобным API, потокобезопасностью и встроенными DAWG-словарями OpenCorpora 2025.
Возможности
- Компактные словари DAWG: Всего ~13МБ на диске (против 69МБ XML)
- Работа офлайн: После установки не требует интернета
- Потокобезопасность: Безопасно для многопоточного использования
- OpenCorpora 2025: Самый свежий словарь русского языка
- Быстрая загрузка: ~0.05 секунды (против 30-60 секунд разбора XML)
- Малое потребление памяти: ~15-20 МБ (вместо ~500 МБ)
- 100% Совместимость: Полная замена для pymorphy2/pymorphy3
Установка
pip install mawo-pymorphy3
С дополнительными зависимостями
# Безопасность (рекомендуется для production)
pip install mawo-pymorphy3[security]
# Красивый вывод в консоль
pip install mawo-pymorphy3[rich]
# Все дополнения
pip install mawo-pymorphy3[all]
Быстрый старт
from mawo_pymorphy3 import create_analyzer
# Создаём анализатор (автоматически загружает DAWG словарь)
analyzer = create_analyzer()
# Разбираем русские слова
word = analyzer.parse("стали")[0]
print(word.tag) # VERB,perf,intr plur,past,indc
print(word.normal_form) # стать
print(word.inflect({"sing", "femn"})) # стала
# Морфологический анализ
for parse in analyzer.parse("дом"):
print(f"{parse.word} -> {parse.normal_form} ({parse.tag})")
Продвинутое использование
Потокобезопасный синглтон
from mawo_pymorphy3 import get_global_analyzer
# Получаем глобальный экземпляр (потокобезопасный)
analyzer = get_global_analyzer()
Анализ падежей
# Поддержка русских падежей
word = analyzer.parse("дома")[0]
# Получаем все падежные формы
cases = {
"именительный": word.inflect({"nomn"}),
"родительный": word.inflect({"gent"}),
"дательный": word.inflect({"datv"}),
"винительный": word.inflect({"accs"}),
"творительный": word.inflect({"ablt"}),
"предложный": word.inflect({"loct"}),
}
for case_name, form in cases.items():
if form:
print(f"{case_name}: {form.word}")
Управление DAWG кэшем
from mawo_pymorphy3 import MAWODictionaryManager
manager = MAWODictionaryManager()
# Проверяем наличие DAWG кэша
if manager.is_dawg_cache_available():
print("✅ DAWG кэш готов")
else:
# Создаём DAWG кэш из OpenCorpora XML
manager.build_dawg_cache()
Оптимизированный анализатор с кэшированием
from mawo_pymorphy3 import MAWOOptimizedMorphAnalyzer
# Создаём оптимизированный анализатор (с кэшем результатов)
analyzer = MAWOOptimizedMorphAnalyzer()
# Анализируем текст целиком
results = analyzer.analyze("Я иду домой")
for result in results:
print(f"{result['word']} -> {result['normal_form']} ({result['pos']})")
print(f" Падеж: {result['case']}, Число: {result['number']}")
Производительность
Использование памяти
Реальные цифры (v1.0.3+):
| Библиотека | Размер на диске | Память в RAM | Время загрузки | Примечание |
|---|---|---|---|---|
| OpenCorpora XML (raw) | ~69МБ | ~500МБ | 30-60 сек | Используется только для компиляции словарей |
| pymorphy2 (DAWG) | ~11МБ (отдельно) | ~15-20МБ | ~0.05-0.1 сек | Требуется отдельная загрузка словарей |
| mawo-pymorphy3 v1.0.3+ (DAWG) | ~13МБ (в пакете) | ~15-20МБ | ~0.05 сек | ✅ Словари встроены, работает из коробки |
Что изменилось:
- ❌ v1.0.0-1.0.2: Парсил XML при загрузке (~30-60 сек, ~500 МБ памяти)
- ✅ v1.0.3+: Использует готовые DAWG словари (~0.05 сек, ~15-20 МБ памяти)
Бенчмарки
import time
from mawo_pymorphy3 import create_analyzer
analyzer = create_analyzer()
# Прогрев
analyzer.parse("тест")
# Замер производительности
start = time.time()
for _ in range(10000):
analyzer.parse("стали")
elapsed = time.time() - start
print(f"10000 разборов: {elapsed:.2f}сек ({10000/elapsed:.0f} слов/сек)")
# Типично: ~15k-25k слов/сек (однопоточно)
Файлы данных
Пакет включает оптимизированные DAWG словари (~13МБ):
mawo_pymorphy3/
├── dicts_ru/
│ ├── words.dawg # Основной словарь
│ ├── prediction-suffixes-0.dawg # Суффиксы для предсказания
│ ├── prediction-suffixes-1.dawg
│ └── prediction-suffixes-2.dawg
└── data/
└── dict.opcorpora.xml # OpenCorpora 2025 (опционально)
📦 Репозиторий данных MAWO
Все справочные данные, модели и корпуса для библиотек MAWO доступны в отдельном репозитории:
Репозиторий содержит:
- OpenCorpora 2025 (69MB) - полный корпус для продвинутого морфологического анализа
- SlovNet модели (2-3MB каждая) - NER, морфология, синтаксис
- Navec эмбеддинги (26MB) - векторные представления слов
- Словари имён (2025) - мужские/женские имена, фамилии, отчества
Скачать полный OpenCorpora (опционально)
Для продвинутого использования или пересборки словаря:
# Скачать с релизов MAWO (69МБ)
wget https://github.com/mawo-ru/mawo-nlp-data/releases/download/v1.0.0/opencorpora-2025.tar.gz
tar -xzf opencorpora-2025.tar.gz -C ~/.mawo-pymorphy3/
# Проверить контрольную сумму
wget https://github.com/mawo-ru/mawo-nlp-data/releases/download/v1.0.0/checksums.txt
sha256sum -c checksums.txt
Подробнее о данных, моделях и способах установки см. в mawo-nlp-data README.
Миграция с pymorphy2/pymorphy3
100% совместимость! Просто замените импорт:
# Было (pymorphy2)
from pymorphy2 import MorphAnalyzer
analyzer = MorphAnalyzer()
# Было (pymorphy3)
from pymorphy3 import MorphAnalyzer
analyzer = MorphAnalyzer()
# Стало
from mawo_pymorphy3 import create_analyzer
analyzer = create_analyzer()
# или
from mawo_pymorphy3 import MorphAnalyzer
analyzer = MorphAnalyzer()
Все API остаются прежними. Ваш код будет работать без изменений.
Настройка
Свой путь к словарю
from pathlib import Path
from mawo_pymorphy3 import MAWOMorphAnalyzer
analyzer = MAWOMorphAnalyzer(
dict_path=Path("/свой/путь/к/словарям")
)
Отключить DAWG оптимизацию
# Использовать оригинальный XML словарь (медленнее, больше памяти)
analyzer = create_analyzer(use_dawg=False)
Технические детали
DAWG (Направленный ациклический граф слов)
- Сжатие: Без потерь, 100% точность
- Структура: Префиксное дерево с общими суффиксами
- Поиск: O(|слово|) временная сложность
- Размер: ~50МБ для 391,845 лексем
История DAWG в pymorphy
Важное уточнение:
- pymorphy2 (с 2013) использовал DAWG (~15 МБ памяти, ~0.05 сек загрузка)
- pymorphy3 также использовал DAWG (~15-20 МБ)
- mawo-pymorphy3 v1.0.3+ теперь ПРАВИЛЬНО использует DAWG:
- ✅ Использует pymorphy2 внутри для работы с DAWG
- ✅ Словари встроены в пакет (~13 МБ)
- ✅ Загрузка ~0.05 секунды (НЕ 30-60!)
- ✅ Память ~15-20 МБ (НЕ ~500!)
- ✅ Современный API и потокобезопасность
- ✅ OpenCorpora 2025 из коробки
Что было исправлено в v1.0.3:
- ❌ Раньше (v1.0.0-1.0.2): Парсил OpenCorpora XML каждый раз (~30-60 сек, ~500 МБ)
- ✅ Теперь (v1.0.3+): Использует готовые DAWG словари (~0.05 сек, ~15-20 МБ)
Источники:
Источники словаря
- OpenCorpora 2025: Морфологический словарь русского языка
- Ревизия: 417260 (сентябрь 2025)
- Лексем: 391,845
- Словоформ: ~5 миллионов
Потокобезопасность
Все операции потокобезопасны:
- Глобальный синглтон использует threading.Lock
- DAWG словари неизменяемы (только чтение)
- Нет разделяемого изменяемого состояния
Решение проблем
Модуль не найден
# Если видите: ModuleNotFoundError: No module named 'mawo_pymorphy3'
pip install --upgrade mawo-pymorphy3
Отсутствует DAWG кэш
# Создайте кэш вручную
from mawo_pymorphy3 import MAWODictionaryManager
manager = MAWODictionaryManager()
manager.build_dawg_cache()
Нехватка памяти
# Используйте DAWG (по умолчанию, только 50МБ)
analyzer = create_analyzer(use_dawg=True)
Разработка
Настройка окружения
git clone https://github.com/mawo-ru/mawo-pymorphy3.git
cd mawo-pymorphy3
pip install -e ".[dev]"
Запуск тестов
pytest tests/
Форматирование кода
black mawo_pymorphy3/
ruff check mawo_pymorphy3/
Благодарности и Upstream-проекты
mawo-pymorphy3 является форком проекта pymorphy3, который основан на оригинальном pymorphy2.
Оригинальный проект - pymorphy2
- Репозиторий: https://github.com/pymorphy2/pymorphy2
- Автор: Mikhail Korobov (@kmike)
- Лицензия: MIT
- Публикация: Korobov M.: Morphological Analyzer and Generator for Russian and Ukrainian Languages // Analysis of Images, Social Networks and Texts, pp 320-332 (2015)
Продолжение - pymorphy3
- Репозиторий: https://github.com/no-plagiarism/pymorphy3
- Мейнтейнеры: Danylo Halaiko (@d9nchik), @insolor
- Лицензия: MIT
- Copyright: (c) 2022 (продолжение pymorphy2)
Словари OpenCorpora
- Сайт: http://opencorpora.org/
- Лицензия: CC BY-SA 3.0
- Версия: 0.92 (revision 417260, 2025)
Улучшения MAWO
- Компактные DAWG-словари: ~11МБ против 69МБ XML (снижение на 84%)
- Потокобезопасность: Thread-safe паттерн Singleton
- Offline-first архитектура: Полная автономность
- Быстрая загрузка: 1-2 секунды против 30-60 секунд
- OpenCorpora 2025: Самые свежие словари
- 100% совместимость API: Drop-in replacement
Полная информация об авторстве: см. ATTRIBUTION.md
Лицензия
MIT License - см. LICENSE файл.
Этот проект полностью соответствует MIT лицензии оригинальных проектов pymorphy2/pymorphy3 и CC BY-SA 3.0 лицензии OpenCorpora, сохраняя все оригинальные copyright notices.
Ссылки
- GitHub: https://github.com/mawo-ru/mawo-pymorphy3
- PyPI: https://pypi.org/project/mawo-pymorphy3/
- Проблемы: https://github.com/mawo-ru/mawo-pymorphy3/issues
- Данные и модели: https://github.com/mawo-ru/mawo-nlp-data
- Оригинальный pymorphy2: https://github.com/pymorphy2/pymorphy2
- Оригинальный pymorphy3: https://github.com/no-plagiarism/pymorphy3
- OpenCorpora: http://opencorpora.org/
Сделано с ❤️ командой 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mawo_pymorphy3-1.0.4.tar.gz.
File metadata
- Download URL: mawo_pymorphy3-1.0.4.tar.gz
- Upload date:
- Size: 6.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6124bc7a7e4136f06b1f69def7d0d8cbecd4320b745a9a282de65846c7a8aa55
|
|
| MD5 |
8ec2338bef3421525a09a63cfd4d6fe1
|
|
| BLAKE2b-256 |
29fbedc8c5928295c0b79ae292b0d33a420c772b6d333ddf6ab642c95dbea75d
|
Provenance
The following attestation bundles were made for mawo_pymorphy3-1.0.4.tar.gz:
Publisher:
publish-to-pypi.yml on mawo-ru/mawo-pymorphy3
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mawo_pymorphy3-1.0.4.tar.gz -
Subject digest:
6124bc7a7e4136f06b1f69def7d0d8cbecd4320b745a9a282de65846c7a8aa55 - Sigstore transparency entry: 684835842
- Sigstore integration time:
-
Permalink:
mawo-ru/mawo-pymorphy3@dbe5aeba4e1c899177b33a75a5e0923bdb3a3639 -
Branch / Tag:
refs/tags/v1.0.4-fix - Owner: https://github.com/mawo-ru
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@dbe5aeba4e1c899177b33a75a5e0923bdb3a3639 -
Trigger Event:
release
-
Statement type:
File details
Details for the file mawo_pymorphy3-1.0.4-py3-none-any.whl.
File metadata
- Download URL: mawo_pymorphy3-1.0.4-py3-none-any.whl
- Upload date:
- Size: 6.9 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00dd18458b42959949424424a8c8d4c3782f0180ea8ea1468ea25ae419a574c5
|
|
| MD5 |
ba17bca70dac2059cd3f83538233696e
|
|
| BLAKE2b-256 |
b6672fe70c95f248630d69e87f65e858fb0b769ba2092267bc217ed11d7043c2
|
Provenance
The following attestation bundles were made for mawo_pymorphy3-1.0.4-py3-none-any.whl:
Publisher:
publish-to-pypi.yml on mawo-ru/mawo-pymorphy3
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mawo_pymorphy3-1.0.4-py3-none-any.whl -
Subject digest:
00dd18458b42959949424424a8c8d4c3782f0180ea8ea1468ea25ae419a574c5 - Sigstore transparency entry: 684835843
- Sigstore integration time:
-
Permalink:
mawo-ru/mawo-pymorphy3@dbe5aeba4e1c899177b33a75a5e0923bdb3a3639 -
Branch / Tag:
refs/tags/v1.0.4-fix - Owner: https://github.com/mawo-ru
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@dbe5aeba4e1c899177b33a75a5e0923bdb3a3639 -
Trigger Event:
release
-
Statement type: