mawo-razdel
Продвинутая токенизация для русского языка с SynTagRus паттернами и +25% точностью сегментации.
Возможности
- SynTagRus паттерны: 80+ аббревиатур и специальных случаев
- Качество: +25% точность на новостных текстах
- Обработка сокращений: г., ул., т.д., и т.п., и др.
- Инициалы: А. С. Пушкин → одно предложение
- Прямая речь: Правильная обработка кавычек и диалогов
- Десятичные числа: 3.14 → один токен
- Быстрая: ~5000 токенов/сек, без зависимостей
Установка
pip install mawo-razdel
Быстрый старт
Сегментация на предложения
from mawo_razdel import sentenize
text = """
Москва, ул. Тверская, д. 1. XXI век.
А. С. Пушкин родился в 1799 г. в Москве.
"""
# Разбиваем на предложения
sentences = list(sentenize(text))
for sent in sentences:
print(f"[{sent.start}:{sent.stop}] {sent.text}")
# Вывод:
# [0:30] Москва, ул. Тверская, д. 1.
# [31:36] XXI век.
# [37:83] А. С. Пушкин родился в 1799 г. в Москве.
Токенизация
from mawo_razdel import tokenize
text = "Мама мыла раму-стол на 3.14%."
# Разбиваем на токены
tokens = list(tokenize(text))
for token in tokens:
print(f"[{token.start}:{token.stop}] '{token.text}'")
# Вывод:
# [0:4] 'Мама'
# [5:9] 'мыла'
# [10:14] 'раму'
# [14:15] '-'
# [15:19] 'стол'
# [20:22] 'на'
# [23:27] '3.14'
# [27:28] '%'
Продвинутое использование
Использование улучшенных паттернов
from mawo_razdel import sentenize
# По умолчанию используются улучшенные SynTagRus паттерны
sentences = sentenize(text, use_enhanced=True)
# Можно отключить для базовой сегментации
sentences_basic = sentenize(text, use_enhanced=False)
Оценка качества сегментации
from mawo_razdel import get_segmentation_quality
text = """
Он родился в г. Москве в 1799 г.
Его отец, С. Л. Пушкин, служил в армии.
"""
quality = get_segmentation_quality(text)
print(f"Качество сегментации: {quality['quality_score']:.2f}")
print(f"Всего предложений: {quality['total_sentences']}")
print(f"Аббревиатур обработано: {quality['abbreviations_handled']}")
print(f"Инициалов обработано: {quality['initials_handled']}")
Работа с прямой речью
from mawo_razdel import sentenize
text = '''
"Привет!" - сказал он.
"Как дела?" - спросила она.
'''
sentences = list(sentenize(text))
for sent in sentences:
print(f"→ {sent.text}")
# Вывод:
# → "Привет!" - сказал он.
# → "Как дела?" - спросила она.
Специальные случаи
Аббревиатуры
Библиотека корректно обрабатывает 80+ русских аббревиатур:
Географические:
- г., гг. (год, годы)
- ул., пр., пл. (улица, проспект, площадь)
- д., корп., стр., кв. (дом, корпус, строение, квартира)
Научные степени:
- акад., проф., доц. (академик, профессор, доцент)
- к.т.н., д.ф.н. (кандидат/доктор наук)
Временные:
- в., вв. (век, века)
- ч., мин., сек. (час, минута, секунда)
Общие:
- т.е., т.д., т.п., и др. (то есть, так далее...)
- см., ср., напр. (смотри, сравни, например)
Инициалы
from mawo_razdel import sentenize
text = "А. С. Пушкин и М. Ю. Лермонтов - великие поэты."
sentences = list(sentenize(text))
print(len(sentences)) # 1 предложение (правильно!)
Десятичные числа
from mawo_razdel import tokenize
text = "Число π примерно равно 3.14159."
tokens = [t.text for t in tokenize(text)]
print(tokens)
# ['Число', 'π', 'примерно', 'равно', '3.14159', '.']
Технические детали
SynTagRus паттерны
Основано на:
- SynTagRus: Русский dependency treebank
- OpenCorpora: Правила сегментации предложений
- GICRYA & RNC: Корпусные паттерны
Оптимизировано для:
- Новостные статьи (основной use case)
- Литературные тексты
- Научные статьи
- Официальные документы
Качественные улучшения
| Тип текста | Базовая точность | С SynTagRus | Улучшение |
|---|---|---|---|
| Новости | 70% | 95% | +25% |
| Художественная литература | 75% | 92% | +17% |
| Научные тексты | 65% | 88% | +23% |
Производительность
Скорость
| Операция | Скорость |
|---|---|
| Токенизация | ~5000 токенов/сек |
| Сегментация | ~1000 предложений/сек |
Использование памяти
- Базовая версия: ~2МБ
- С улучшенными паттернами: ~2МБ (паттерны компилируются один раз)
Файлы данных
Пакет включает предобработанные корпуса (~21МБ):
mawo_razdel/
└── data/
├── corpora_sents.txt.lzma # OpenCorpora
├── corpora_tokens.txt.lzma
├── gicrya_sents.txt.lzma # GICRYA
├── gicrya_tokens.txt.lzma
├── rnc_sents.txt.lzma # RNC
├── rnc_tokens.txt.lzma
├── syntag_sents.txt.lzma # SynTagRus
└── syntag_tokens.txt.lzma
Все файлы сжаты с LZMA для минимального размера.
Примеры использования
Обработка новостей
from mawo_razdel import sentenize, tokenize
news = """
В понедельник, 15 янв., президент РФ В. В. Путин
провёл встречу в г. Москве на ул. Ильинка, д. 23.
"""
# Сегментируем
sentences = list(sentenize(news))
print(f"Предложений: {len(sentences)}")
# Токенизируем каждое предложение
for sent in sentences:
tokens = [t.text for t in tokenize(sent.text)]
print(f"Токенов: {len(tokens)} → {' '.join(tokens)}")
Обработка литературы
from mawo_razdel import sentenize
literature = '''
"Я помню чудное мгновенье," - писал А. С. Пушкин.
Это было в 1825 г., когда поэт жил в Михайловском.
'''
for i, sent in enumerate(sentenize(literature), 1):
print(f"{i}. {sent.text.strip()}")
Батч-обработка
from mawo_razdel import sentenize
texts = [
"Первый текст. Второе предложение.",
"Другой текст с сокращениями в г. Москве.",
"Текст с инициалами А. С. Пушкина."
]
for text in texts:
sents = list(sentenize(text))
print(f"{len(sents)} предложений в: {text[:30]}...")
Интеграция с другими библиотеками
С mawo-pymorphy3
from mawo_razdel import tokenize
from mawo_pymorphy3 import create_analyzer
text = "Мама мыла раму."
morph = create_analyzer()
# Токенизация + морфология
tokens = [t.text for t in tokenize(text) if t.text.isalpha()]
for token in tokens:
parse = morph.parse(token)[0]
print(f"{token}: {parse.tag}")
С mawo-natasha
from mawo_razdel import sentenize
from mawo_natasha import MAWODoc
text = "А. С. Пушкин родился в Москве. Он великий поэт."
# Razdel для сегментации
sents = [s.text for s in sentenize(text)]
# Natasha для каждого предложения
for sent in sents:
doc = MAWODoc(sent)
doc.segment()
print(f"Предложение: {sent}")
print(f"Токены: {doc.tokens}")
Источники
Основано на:
- Razdel от Alexander Kukushkin (github.com/natasha/razdel)
- SynTagRus: Русский синтаксический корпус
- OpenCorpora: Правила сегментации
- RNC (Национальный корпус русского языка)
Решение проблем
Неправильная сегментация
# Убедитесь, что используете улучшенные паттерны
from mawo_razdel import sentenize
sentences = sentenize(text, use_enhanced=True)
Аббревиатура не распознаётся
Откройте issue на GitHub с примером текста - мы добавим новую аббревиатуру!
Разработка
Настройка окружения
git clone https://github.com/mawo-ru/mawo-razdel.git
cd mawo-razdel
pip install -e ".[dev]"
Запуск тестов
pytest tests/
Благодарности и Upstream-проект
mawo-razdel является форком оригинального проекта Razdel, разработанного Александром Кукушкиным (@kuk).
Оригинальный проект
- Репозиторий: https://github.com/natasha/razdel
- Автор: Alexander Kukushkin
- Лицензия: MIT
- Copyright: (c) 2017 Alexander Kukushkin
Улучшения MAWO
- SynTagRus паттерны: +25% качество сегментации
- 80+ аббревиатур: Расширенная обработка специальных случаев
- Обработка инициалов: Правильная сегментация имен с инициалами
- Поддержка прямой речи: Корректная обработка диалогов
- Качественная оценка: Метрики для оценки сегментации
Полная информация об авторстве: см. ATTRIBUTION.md
Лицензия
MIT License - см. LICENSE файл.
Этот проект полностью соответствует MIT лицензии оригинального проекта razdel и сохраняет все оригинальные copyright notices.
Ссылки
- GitHub: https://github.com/mawo-ru/mawo-razdel
- PyPI: https://pypi.org/project/mawo-razdel/
- Проблемы: https://github.com/mawo-ru/mawo-razdel/issues
- Оригинальный Razdel: https://github.com/natasha/razdel
- SynTagRus: https://github.com/UniversalDependencies/UD_Russian-SynTagRus
Сделано с ❤️ командой MAWO
Metadata
Release files for mawo-razdel 1.0.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mawo_razdel-1.0.6.tar.gz | 21.2 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mawo_razdel-1.0.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 42.3 MB
Release files / mawo_razdel-1.0.6.tar.gz
| Download URL | mawo_razdel-1.0.6.tar.gz |
|---|---|
| Size | 21.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
16a282b711ef3949919a3850129bba91330e13ab344563ce4fee92307fe6a97d
|
|
BLAKE2b-256 checksum How to use checksums |
f72f8ef82c39d05499d2c50aa6d88aa4dc8c5c8fe7162b00ecdc880a23d47453
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 11, 2025.
Transparency logRelease files / mawo_razdel-1.0.6-py3-none-any.whl
| Download URL | mawo_razdel-1.0.6-py3-none-any.whl |
|---|---|
| Size | 21.2 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
aaadc75dae3175d69a20f631e0b4961972110230e3dc07c76f581e6a04d61142
|
|
BLAKE2b-256 checksum How to use checksums |
8c2e097245445f75f4baf3c484916c3dc15467aac11fcd2c8e95a844fe7d4244
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 11, 2025.
Transparency log