Pull to refresh
7
Mawo@Mawo

User

14
Subscribers
Send message

Спасибо за внимательность! Вы абсолютно правы — в статье действительно есть неточность.

Что было на самом деле

pymorphy2 (с 2013 года):

pymorphy3:

  • Также использовал DAWG (наследовал архитектуру pymorphy2)

  • ✅ Аналогичное использование памяти (~15-20 МБ)

Откуда взялись 500 МБ?

В статье мы некорректно сравнили:

  • 500 МБ — это размер RAW XML OpenCorpora при загрузке в память (что никто не делал в production)

  • Реальный pymorphy2/3 занимал ~15-20 МБ благодаря DAWG

Что мы на самом деле улучшили

Наши реальные улучшения в mawo-pymorphy3:

  1. Архитектура и API:

    • Упрощенный API (create_analyzer(), get_global_analyzer())

    • Потокобезопасный паттерн синглтон

    • Lazy-инициализация

  2. Удобство использования:

    • DAWG словари включены в пакет (~11 МБ) — не нужно скачивать отдельно

    • Offline-first архитектура

    • Современный pyproject.toml

  3. Обновления:

    • Интеграция с OpenCorpora 2025 (391,845 лексем)

    • Python 3.10+ поддержка

    • Улучшенное кэширование

  4. 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%)

Результат:

text = "Число π ≈ 3.14159"

# razdel
['Число', 'π', '≈', '3.14159']  # 4 токена

# mawo-razdel (исправлено)
['Число', 'π', '≈', '3.14159']  # 4 токена ✅

2. Сегментация с аббревиатурами ✅

Проблема: Текст не разбивался на предложения

"Москва, ул. Тверская, д. 1. XXI век."
# razdel: 2 предложения
# mawo-razdel: 1 предложение ❌

Корневая причина:

  1. Не проверялся контекст ПОСЛЕ точки

  2. Не различались HEAD (ул., проф.) и TAIL (г., в.) аббревиатуры

  3. Не поддерживались латинские заглавные буквы (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 предложение ✅

Да - для простых случаев обе библиотеки работают одинаково.

4. Улучшенная токенизация времени

text = "Встреча в 10:30"

# razdel
['Встреча', 'в', '10', ':', '30']  # 5 токенов ❌

# mawo-razdel
['Встреча', 'в', '10:30']  # 3 токена ✅

Почему это лучше: "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  # "г. Москва" - разбиваем, если "г" = год

9. Продвинутая токенизация

Паттерн на основе современных практик:

pattern = r"""
    \d+[.,]\d+                    # Десятичные: 3.14, 3,50
    |\d+[-:]\d+(?:[-:]\d+)*       # Диапазоны/время: 1995-1999, 10:30
    |\d+/\d+                      # Дроби: 1/2
    |\d+\s*%                      # Проценты: 95.5%
    |\d+                          # Числа
    |[\w\u0400-\u04FF]+          # Слова (кириллица + латиница)
    |\S                           # Прочее
"""

Можете проверять =)

Вы правы оригинальный razdel действительно работает лучше в описанных тестовых случаях. Обнаружены две критические проблемы в mawo-razdel.
Сейчас исправлю и отпишу детально!

2

Information

Rating
Does not participate
Registered
Activity

Specialization

Бэкенд разработчик, Фронтенд разработчик