"Москва, ул. Тверская, д. 1. XXI век."
# razdel: 2 предложения
# mawo-razdel: 1 предложение ❌
Корневая причина:
Не проверялся контекст ПОСЛЕ точки
Не различались HEAD (ул., проф.) и TAIL (г., в.) аббревиатуры
Не поддерживались латинские заглавные буквы (XXI)
Исправление:
Добавлена проверка контекста ДО и ПОСЛЕ точки (как в razdel)
Разделены аббревиатуры на HEAD (перед именами) и TAIL (после чисел)
Добавлена поддержка латинских заглавных букв
Результат:
text = """
Москва, ул. Тверская, д. 1. XXI век.
А. С. Пушкин родился в 1799 г. в Москве.
"""
# razdel
['Москва, ул. Тверская, д. 1.',
'XXI век.',
'А. С. Пушкин родился в 1799 г. в Москве.'] # 3 предложения
# mawo-razdel (исправлено)
['Москва, ул. Тверская, д. 1.',
'XXI век.',
'А. С. Пушкин родился в 1799 г. в Москве.'] # 3 предложения ✅
3. Первые два примера
Вы написали:
"Для первых двух предложений разницы нет. razdel сам по себе отлично справился с этими предложениями. Так и не понял, почему у вас раздел здесь спотыкался"
Проверка:
# Тест 1
"Он родился в 1799 г. в Москве."
# razdel: 1 предложение ✅
# mawo-razdel: 1 предложение ✅
# Тест 2
"А. С. Пушкин - великий русский поэт."
# razdel: 1 предложение ✅
# mawo-razdel: 1 предложение ✅
Да - для простых случаев обе библиотеки работают одинаково.
Почему это лучше: "10:30" - это одна семантическая единица (время), должна быть одним токеном.
5. Обработка специальных символов (°C, %, и др.)
text = "Температура составила 25.5°C. Это важно."
# razdel (НЕ находит границу из-за °C)
['Температура составила 25.5°C. Это важно.'] # 1 предложение ❌
# mawo-razdel
['Температура составила 25.5°C.', 'Это важно.'] # 2 предложения ✅
Почему это лучше: Правильная обработка Unicode-символов и научной нотации.
6. Поддержка современных форматов
Диапазоны: 1995-1999 → один токен
Дроби: 1/2 → один токен
Проценты: 95.5% → два токена (95.5 и %)
Десятичные с запятой: 3,50 → один токен
7. Разделение HEAD/TAIL аббревиатур
Инспирировано архитектурой razdel, но с улучшениями:
HEAD_ABBREVIATIONS = {
# Идут ПЕРЕД именами: "ул. Тверская", "проф. Иванов"
"ул", "пр", "г", "проф", "акад", "им", ...
}
TAIL_ABBREVIATIONS = {
# Идут ПОСЛЕ чисел: "1799 г.", "XXI в.", "д. 1"
"г", "гг", "в", "вв", "д", "руб", ...
}
Логика: HEAD-аббревиатуры могут идти перед заглавной буквой, TAIL - нет (кроме инициалов).
8. Двунаправленная проверка контекста
# Проверка ДО точки (есть ли аббревиатура)
if preceding in ABBREVIATIONS:
# Проверка ПОСЛЕ точки (заглавная буква?)
if next_char.isupper():
if is_head:
return True # "ул. Тверская" - не разбиваем
if is_tail:
return False # "г. Москва" - разбиваем, если "г" = год
Вы правы оригинальный razdel действительно работает лучше в описанных тестовых случаях. Обнаружены две критические проблемы в mawo-razdel. Сейчас исправлю и отпишу детально!
Спасибо за внимательность! Вы абсолютно правы — в статье действительно есть неточность.
Что было на самом деле
pymorphy2 (с 2013 года):
✅ УЖЕ использовал DAWG (статья М. Коробова: https://habr.com/ru/articles/176575/)
✅ Занимал ~15 МБ памяти (документация: https://pymorphy2.readthedocs.io/en/stable/internals/dict.html)
✅ Использовал предкомпилированные DAWG словари (words.dawg ~7 МБ)
pymorphy3:
✅ Также использовал DAWG (наследовал архитектуру pymorphy2)
✅ Аналогичное использование памяти (~15-20 МБ)
Откуда взялись 500 МБ?
В статье мы некорректно сравнили:
❌ 500 МБ — это размер RAW XML OpenCorpora при загрузке в память (что никто не делал в production)
✅ Реальный pymorphy2/3 занимал ~15-20 МБ благодаря DAWG
Что мы на самом деле улучшили
Наши реальные улучшения в mawo-pymorphy3:
Архитектура и API:
Упрощенный API (
create_analyzer(),get_global_analyzer())Потокобезопасный паттерн синглтон
Lazy-инициализация
Удобство использования:
DAWG словари включены в пакет (~11 МБ) — не нужно скачивать отдельно
Offline-first архитектура
Современный pyproject.toml
Обновления:
Интеграция с OpenCorpora 2025 (391,845 лексем)
Python 3.10+ поддержка
Улучшенное кэширование
DevEx:
Упрощенная установка через PyPI
Полная документация
Современный CI/CD
Сейчас изменю статью и ридми!
ZIP сжал бы данные для хранения, но при работе всё равно нужно распаковать → потребление памяти будет 500 МБ
DAWG хранит данные в сжатом виде И работает с ними напрямую → 50 МБ в памяти во время работы
Это разные задачи: архивирование vs оптимизация структур данных
Еще раз спасибо за детальный анализ и конструктивную критику! Проблем оказалось немного больше чем 2. Вот что получилось.
Что было исправлено
1. Токенизация десятичных чисел ✅
Проблема:
3.14159разбивался на['3', '.', '14159']Исправление: Добавлена продвинутая токенизация на основе современных практик NLP (2024-2025):
Десятичные числа (3.14159, 3,50)
Диапазоны (1995-1999)
Время (10:30)
Дроби (1/2)
Проценты (95.5%)
Результат:
2. Сегментация с аббревиатурами ✅
Проблема: Текст не разбивался на предложения
Корневая причина:
Не проверялся контекст ПОСЛЕ точки
Не различались HEAD (ул., проф.) и TAIL (г., в.) аббревиатуры
Не поддерживались латинские заглавные буквы (XXI)
Исправление:
Добавлена проверка контекста ДО и ПОСЛЕ точки (как в razdel)
Разделены аббревиатуры на HEAD (перед именами) и TAIL (после чисел)
Добавлена поддержка латинских заглавных букв
Результат:
3. Первые два примера
Вы написали:
Проверка:
Да - для простых случаев обе библиотеки работают одинаково.
4. Улучшенная токенизация времени
Почему это лучше: "10:30" - это одна семантическая единица (время), должна быть одним токеном.
5. Обработка специальных символов (°C, %, и др.)
Почему это лучше: Правильная обработка Unicode-символов и научной нотации.
6. Поддержка современных форматов
Диапазоны:
1995-1999→ один токенДроби:
1/2→ один токенПроценты:
95.5%→ два токена (95.5и%)Десятичные с запятой:
3,50→ один токен7. Разделение HEAD/TAIL аббревиатур
Инспирировано архитектурой razdel, но с улучшениями:
Логика: HEAD-аббревиатуры могут идти перед заглавной буквой, TAIL - нет (кроме инициалов).
8. Двунаправленная проверка контекста
9. Продвинутая токенизация
Паттерн на основе современных практик:
Можете проверять =)
Вы правы оригинальный razdel действительно работает лучше в описанных тестовых случаях. Обнаружены две критические проблемы в mawo-razdel.
Сейчас исправлю и отпишу детально!