Skip to content

Ударения, метр и рифма: VerseStats и словарь StressDict - #67

Merged
SergeyShk merged 2 commits into
masterfrom
feature/verse-stats
Sep 20, 2026
Merged

SergeyShk merged 2 commits into
masterfrom
feature/verse-stats

Conversation

@SergeyShk

Copy link
Copy Markdown
Owner

Что сделано

Словарь ударений ruts.datasets.StressDict - словарь Ильи Козиева all_accents (1 680 535 словоформ, CC0): архив 10,6 МБ загружается из репозитория автора по закрепленному коммиту с проверкой SHA-256, как FreqDict. Файл (77 МБ) читается один раз на процесс и индексируется целиком в памяти без разбора строк: позиции строк и табуляций находятся векторно через numpy, словоформа ищется двоичным поиском по байтам отсортированного файла - загрузка 0,2 с, около 100 МБ памяти, поиск 4 мкс. lookup возвращает номер ударного слога, get_records/get_texts перебирают словарь.

Модуль ruts.verse_stats:

  • word_stress - ударный слог слова: по букве ё, по словарю с поправками STRESS_CORRECTIONS (около 150 частых ошибок и подвижных ударений словаря: ещё, себе́, пе́ред, зо́лото, леса́х - найдены сверкой частых форм PoetryCorpus), для составных слов по частям, для стяжений (желанье - желание) и деепричастий (забыв - забывший) по полной форме.
  • VerseStats - метр по алгоритму Барахнина, Кожемякиной и Кузнецовой: выбирается метр с наименьшим числом ударений многосложных слов на слабых позициях (ударение в анакрузе не считается), затем метр снимает неоднозначность: клитики безударны, односложные слова ударны на икте, служебные слова безударны вне икта, подвижные ударения (воды́ - во́ды) переносятся на икт, если после переноса строка становится метрической, слова вне словаря получают икт или ударение по рифме. Если после подгонки больше 10% ударений остаются на слабых позициях, метр None - дольник, акцентный стих, верлибр, проза. Статистики: число стоп и их распределение, доля отклонений, пиррихии, профиль ударности, схемы cCcC, схемы рифмовки по строфам, доля рифмованных строк, типы окончаний, ударные гласные, accentuate().
  • Рифма по фонетическому ключу окончания (ударная гласная, группа согласных после оглушения и упрощения, число заударных слогов) в окне 4 строк внутри строфы; нерифмованные строки в схеме обозначены дефисом (-A-A), как в RIFMA.
  • Функции accentuate, detect_meter, rhyme_scheme, split_stanzas, компонент spaCy verse.

Версия 0.14.0.dev4, документация на двух языках (модуль, функции с описанием алгоритма, словарь, компонент), README.

Проверка

  • RIFMA (5121 строфа с ручной разметкой ударений и схем рифмовки): ударения совпадают у 97% слов (многосложные из словаря 97%, вне словаря 75%), пары рифмующихся строк - точность 93%, полнота 90%, схема строфы целиком 78%, метр не определен у 5% строф.
  • PoetryCorpus (3000 случайных стихотворений): 1,1 мс на стихотворение; метр не определен у 14% - Маяковский (88 из 107), Тредиаковский, Высоцкий, дольники Ахматовой и Цветаевой; у Пушкина None только гекзаметры и подражания народному стиху.
  • Тесты на словаре-фикстуре без сети: словарь (индекс, кэш, загрузка, контрольная сумма), ударения по всем правилам, пять метров, дольник и проза, снятие омографии по рифме, строфы, Doc, компонент; доктесты на реальном словаре пропускаются без него. Покрытие новых модулей 98-100%, make lint, mypy, mkdocs build --strict проходят.

🤖 Generated with Claude Code

Словарь ударений Козиева all_accents (1,68 млн словоформ, CC0) подключен как
набор данных StressDict: архив загружается по закрепленному коммиту с проверкой
SHA-256, файл индексируется в памяти без разбора строк и ищется двоичным поиском.

Модуль verse_stats: ударение слова по словарю с поправками частых ошибок,
по букве ё, для составных слов, стяжений (желанье) и деепричастий (забыв);
метр по алгоритму Барахнина с подгонкой ударений под икты и отсевом дольника,
верлибра и прозы; схема рифмовки по фонетическому ключу окончания; типы
окончаний, пиррихии, профиль ударности, строфы. Класс VerseStats, функции
word_stress, accentuate, detect_meter, rhyme_scheme, split_stanzas, компонент
spaCy verse. На RIFMA ударения совпадают у 97% слов, рифмы находятся
с точностью 93% и полнотой 90%.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@SergeyShk SergeyShk added documentation Improvements or additions to documentation enhancement New feature or request labels Sep 20, 2026

@SergeyShk SergeyShk left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Проверил на реальном словаре и PoetryCorpus. Индекс StressDict в порядке: файл отсортирован по байтам, ключи уникальны, все 1 680 535 записей согласованы с ключами. По VerseStats четыре замечания ниже: два бага в подгонке ударений (кандидаты чужого слова и перенос ударения с ё и из анакрузы), переполнение букв в схеме рифмовки и наречия на -ого в ключе рифмы.

Comment thread ruts/verse_stats.py Outdated
Comment thread ruts/verse_stats.py Outdated
Comment thread ruts/verse_stats.py Outdated
Comment thread ruts/verse_stats.py Outdated
Кандидаты ударения хранятся в слове, а не в строке: слово вне словаря
в середине строки больше не подменяет ударение последнего слова, а после
сброса метра кандидаты отброшенного метра не используются. Ударение по букве ё
и ударение в анакрузе на икт не переносятся - первое надежнее словарного,
второе отклонением не считается. Буквы схемы рифмовки после прописных идут
строчными, а когда кончаются - повторно используются буквы закрытых групп.
Замена -ого на -ово не применяется к наречиям с произносимым [г] (много,
строго, дорого).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@SergeyShk
SergeyShk merged commit 08f9f7b into master Sep 20, 2026
11 of 12 checks passed
@SergeyShk
SergeyShk deleted the feature/verse-stats branch September 20, 2026 17:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants