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.1.tar.gz (21.1 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.1-py3-none-any.whl (21.1 MB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: mawo_razdel-1.0.1.tar.gz
  • Upload date:
  • Size: 21.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for mawo_razdel-1.0.1.tar.gz
Algorithm Hash digest
SHA256 4c57c59f157c7960ef2629216c6cd07823ef08ca14667ef03158ed223f5044be
MD5 913e8631232b5e46872ee196862d4434
BLAKE2b-256 4867ccea1f1013890d8b28509294d9fc2f50678bb948a85fb9a27f91c24ca9ce

See more details on using hashes here.

File details

Details for the file mawo_razdel-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: mawo_razdel-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 21.1 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for mawo_razdel-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 517749106cb8c86b9c60074804e757fedb8ac8da1f07668c03fcec04f2816fe6
MD5 d648ccfd1f1d66c9b2d2903455f99ad3
BLAKE2b-256 df7c8ae91e45e77d1a08145e61e8fd8bd10ae8dc24ff2657d1741d3561786520

See more details on using hashes here.

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