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/

Благодарности

Основано на Razdel от Alexander Kukushkin.

Улучшения MAWO:

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

License

MIT License - see LICENSE file.

Ссылки


Сделано с ❤️ командой 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.3.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.3-py3-none-any.whl (21.1 MB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: mawo_razdel-1.0.3.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.3.tar.gz
Algorithm Hash digest
SHA256 761620f3d129433db2e91a43d8f01ea5f330ffe13dd9e9eec235670d630b155b
MD5 54a141916e245f05dbc74014f7900620
BLAKE2b-256 701f7ea24616b06e923f371ece973c3b734577f0d905d4885bfc7fd43ca46aeb

See more details on using hashes here.

Provenance

The following attestation bundles were made for mawo_razdel-1.0.3.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.3-py3-none-any.whl.

File metadata

  • Download URL: mawo_razdel-1.0.3-py3-none-any.whl
  • Upload date:
  • Size: 21.1 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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 0485da46eb400ff72c92b636cd7bdf021aff79d46beee4bae1f64325dccdb0c8
MD5 c67578dc44fc377ef6fc62f1f29a62d8
BLAKE2b-256 65c159d96065d6f5a691fc25912ac86fd4ad9995530a5b3758fbc7cf2cf3edd0

See more details on using hashes here.

Provenance

The following attestation bundles were made for mawo_razdel-1.0.3-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