Розставляє наголоси (U+0301) в українському тексті - char-level BiLSTM + контекстний резолвер омографів
Project description
stress-uk
Розставляє наголоси в українському тексті символом U+0301 (combining
acute accent), напр. рука → рука́. Гібрид: char-level нейромережа
(BiLSTM) для самого слова + rule-based шар для слів, де наголос залежить
від ЗНАЧЕННЯ в контексті (омографи, напр. за́мок-фортеця проти
замо́к-механізм).
Встановлення
pip install stress-uk
Вага моделі (~9.5MB) НЕ входить у пакет — підвантажується автоматично з
HuggingFace Hub при першому використанні й кешується locally
(~/.cache/huggingface/), повторні запуски вже offline.
Використання
from stress_uk import stressify_text, stressify
print(stressify_text("Привіт, як справи?"))
# Приві́т, я́к спра́ви?
print(stressify("електрифікація"))
# електрифіка́ція
Для ансамблю кількох чекпоінтів або власної моделі:
from stress_uk import Stressifier
s = Stressifier(checkpoint_paths=["шлях/до/мого_чекпоінта.pt"])
print(s.stressify_text("Текст."))
Розстановка наголосу в омографах залежить від слів навколо (±8 слів, без
перетину пунктуації, ближчі слова важать більше) — словник сенсів і
контекстних тригерів у stress_uk/heteronyms.py можна редагувати/
розширювати напряму, формат самоописний
(HETERONYMS: dict[слово, tuple[Sense, ...]]).
Тренування власної моделі
pip install stress-uk
python -m stress_uk.train --epochs 2 # демо на маленькій вибірці, що йде з пакетом
Формат даних — JSONL, один приклад на рядок:
{"word": "рука", "stress": [0, 0, 0, 1]}
де word — слово малими буквами без наголосу, stress — бінарна маска
тієї самої довжини (1 на позиції наголошеної букви). За замовчуванням
використовується невелика ілюстративна вибірка з пакета (НЕ повний
навчальний набір) — передай --data-dir шлях/до/своїх/даних зі своїми
train.jsonl/val.jsonl/vocab.json/word_patterns.json того самого
формату (word_patterns.json потрібен лише для лагідної оцінки під час
тренування: {слово: {"best": [...], "all": [[...]]}}).
Звичайний прогін ділить дані на train/val і зупиняється сам через early
stopping, чекпоінт зберігається в ./models/. Для фінального
прод-чекпоінта (тренування на train+val разом, без held-out оцінки) —
--full-data --epochs N, де N — номер найкращої епохи звичайного
прогону.
Розробка/публікація
Якщо клонував репозиторій (не просто pip install):
cd release
pip install -e .
Інструкції з публікації нової версії моделі на HuggingFace Hub і пакета
на PyPI — scripts/PUBLISHING.md.
Вимоги
torch + huggingface_hub (CPU достатньо — інференс на слово займає
частки мілісекунди, тренування на CPU теж практично, бо модель невелика).
Історія розробки (коротко)
Базова модель — символьний (character-level) bidirectional LSTM: embedding → 2-шаровий BiLSTM → лінійний шар, що для кожної букви слова передбачає "ця буква наголошена чи ні" (multi-label, не softmax — природно підтримує рідкі слова з кількома наголосами, зокрема дефісні композити). Навчена на великому корпусі акцентованих українських словоформ із кількох лексикографічних джерел, об'єднаних і узгоджених між собою (конфліктні випадки — або очевидна друкарська помилка джерела, яку виправляли голосуванням, або справжня граматична омонімія, яку свідомо НЕ форсували до єдиної відповіді, а лишали моделі вчити обидва варіанти з емпіричного розподілу).
Окремо — rule-based шар для омографів (слів, де те саме написання має різний наголос залежно від значення): словник із кількох сотень ручно/LLM-курованих записів, кожен запис — наголошені варіанти + контекстні слова-тригери. Резолвер шукає тригери в ±8 словах навколо цілі (з розривом контексту по будь-якій пунктуації) і зважує кандидатів за відстанню (ближче слово — сильніший доказ), а не просто рахує бінарний "матч/не матч".
Якість систематично перевірялась проти опублікованого незалежного бенчмарку (Senyk et al., "Context-Aware Lexical Stress Prediction and Phonemization for Ukrainian TTS Systems", UNLP 2025) — це дозволило порівняти результат із кількома іншими опублікованими підходами на тому самому тестовому наборі речень, а не лише на власних тестах. Кілька раундів цільової діагностики (які саме слова й чому помиляються на цьому бенчмарку, а не "сліпе" розширення словника) підняли Macro-F1 на омографах із ~34% до ~49%, а також виявили і виправили системний баг у підрахунку голосів між джерелами навчальних даних (рідкісна граматична колізія могла переважити частотою формальних словоформ значно частотніше в реальному вжитку слово). Фінальний результат — найкращий за всіма п'ятьма метриками порівняння серед усіх перевірених систем (включно з гібридними).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file stress_uk-0.1.0.tar.gz.
File metadata
- Download URL: stress_uk-0.1.0.tar.gz
- Upload date:
- Size: 80.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
db7c00b06188352bc2745d6af4545adcc54ca86cf5294664b37ee3565a833211
|
|
| MD5 |
ab0235a99a16893e4560b95ece8820cd
|
|
| BLAKE2b-256 |
59c1ce8117d115a29cbd00654452333eb789f5ffb011ab1e3ec8ce5bdf948245
|
File details
Details for the file stress_uk-0.1.0-py3-none-any.whl.
File metadata
- Download URL: stress_uk-0.1.0-py3-none-any.whl
- Upload date:
- Size: 82.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
83178b06df007d1ad286673b7e387f7ebbf5e212f05769dc0cce11d4c6017257
|
|
| MD5 |
d3045af803626b125ae1447ba713f12b
|
|
| BLAKE2b-256 |
c3044680d59e111738bcdd8f8aace26e3c04c9910f7a5b1a4d3569e0be734ed6
|