Skip to main content

Продвинутая токенизация для русского языка с SynTagRus паттернами и +25% точностью

Project description

mawo-razdel

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

Продвинутая токенизация для русского языка с 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).

Оригинальный проект

Улучшения MAWO

  • SynTagRus паттерны: +25% качество сегментации
  • 80+ аббревиатур: Расширенная обработка специальных случаев
  • Обработка инициалов: Правильная сегментация имен с инициалами
  • Поддержка прямой речи: Корректная обработка диалогов
  • Качественная оценка: Метрики для оценки сегментации

Полная информация об авторстве: см. ATTRIBUTION.md

Лицензия

MIT License - см. LICENSE файл.

Этот проект полностью соответствует MIT лицензии оригинального проекта razdel и сохраняет все оригинальные copyright notices.

Ссылки


Сделано с ❤️ командой 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_razdel-1.0.6.tar.gz (21.2 MB view details)

Uploaded Source

Built Distribution

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

mawo_razdel-1.0.6-py3-none-any.whl (21.2 MB view details)

Uploaded Python 3

File details

Details for the file mawo_razdel-1.0.6.tar.gz.

File metadata

  • Download URL: mawo_razdel-1.0.6.tar.gz
  • Upload date:
  • Size: 21.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for mawo_razdel-1.0.6.tar.gz
Algorithm Hash digest
SHA256 16a282b711ef3949919a3850129bba91330e13ab344563ce4fee92307fe6a97d
MD5 593e147d0c7dc85eaf64b90c5041ac11
BLAKE2b-256 f72f8ef82c39d05499d2c50aa6d88aa4dc8c5c8fe7162b00ecdc880a23d47453

See more details on using hashes here.

Provenance

The following attestation bundles were made for mawo_razdel-1.0.6.tar.gz:

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

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_razdel-1.0.6-py3-none-any.whl.

File metadata

  • Download URL: mawo_razdel-1.0.6-py3-none-any.whl
  • Upload date:
  • Size: 21.2 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for mawo_razdel-1.0.6-py3-none-any.whl
Algorithm Hash digest
SHA256 aaadc75dae3175d69a20f631e0b4961972110230e3dc07c76f581e6a04d61142
MD5 f9968a2b6591cda4cd90c945461533ac
BLAKE2b-256 8c2e097245445f75f4baf3c484916c3dc15467aac11fcd2c8e95a844fe7d4244

See more details on using hashes here.

Provenance

The following attestation bundles were made for mawo_razdel-1.0.6-py3-none-any.whl:

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

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