Поэтический транскриптор в генеративных стихах: тво́рог или творо́г

Feb 03, 2022 10:26


Начну рассказ вот с этого замечательного результата работы программного кода:

два́ лингви́ста спо́ря тво́рог иль творо́г
мо́рдами друг дру́га би́ли об поро́г

Приведенные выше две строчки это результат полностью автоматической разметки текста алгоритмом, который я для удобства внутри проекта называю "поэтический транскриптор". Самое интересное в этом двустишье то, как обработаны два слова "творог". В одном случае ударение выставлено на первый слог "тво́рог", во втором - на второй "творо́г".

Как это происходит и, главное, зачем - рассказываю далее.
Что это такое?

Формально, поэтический транскриптор это модуль, который для заданного поэтического текста:

1) определяет правило чередования ударных и безударных слогов (метрику),
2) проверяет рифмовку последних слов в каждой строке,
3) расставляет ударения в словах, учитывая различные нюансы и п.1, 2

Где его исходники?

Исходный текст класса PoetryStressAligner можно найти в репозитории проекта. Метод align() получает на вход строки стиха и возвращает структуру, в которой есть поля для результатов подбора метрики с числовой оценкой качества, схемы рифмовки, строки с проставленными ударениями.

При отладке проекта я сам активно использую вот эту консольную утилитку. Она выводит результаты работы транскриптора в консоль:

score=0.2681841126139815 meter=хорей
два́ лингви́ста спо́ря тво́рог иль творо́г
мо́рдами друг дру́га би́ли об поро́г

Какие фонетические явления учитываются?
Особенность силлабо-тонических стихов в том, что в них фонетическая структура доминирует. Автор текста подгоняет лексику и синтаксис под выбранный порядок чередования ударных и безударных слогов, учитывая также правила рифмовки.

Из-за чередования ударных и безударных слогов не все слова в стихах нужно "ударять". Обычно предлоги и частицы типа "ли" остаются безударными (см. клитики).

Также безударными могут стать некоторые наречия и даже вспомогательные глаголы.

Для иллюстрации:

Их куку́шка на крюку́
Ме́рит вре́мя старику́
По часо́чку, по деньку́
Ме́лет го́дики в муку́

С предлогами бывает и так, что они перетягивают ударение на себя, оставляя последующее существительное вообще безударным - см. за́ борт:

Авто́бус на паро́ме через Ни́л
Но за́ борт ру́хнул - перепо́лнен бы́л
Опло́шность пассажи́рам бо́ком вы́шла та́
У ни́льских крокоди́лов пра́здник живота́

При этом перенос ударения на проклитику в таких случаях опционален, то есть вариант "за бо́рт" тоже возможен:

Матро́сы пры́гали за бо́рт
Во вла́сть кова́рных ча́р
Холо́дный жда́л в воде́ эско́рт
И ка́ждый получа́л

С глаголами есть похожая ситуация, причем она очень частотная в русском языке - словосочетания "не́ был", "не́ было".
Я не уверен, что в этом случае глагол вообще употребляется с ударением:

Где б не́ был он - со всех концо́в Земли́
До слу́ха доноси́лись пла́ч и сто́ны
И ре́ки там багро́вые текли́
И стра́х цари́л, и ги́бли миллио́ны

Есть также словосочетания типа "друг дру́га", в которых одно из слов теряет ударение, чтобы подогнать ритм под общий порядок:

Перепляса́ть друг дру́га нелегко́
Она́, смея́сь, как ба́бочка, порха́ет
А он барье́ров никаки́х не зна́ет
Взлета́ет в не́бо мо́щно, высоко́

Другой источник проблем - подвижность ударений в русском языке. С одной стороны, бывает много слов (причем высокочастотных), которые имеют разные ударения при совпадающей форме, так называемые омографы: та́я-тая́, мо́я-моя́ и т.д. В принципе правильный вариант можно выбирать, исходя из правила чередования ударных и безударных слогов. Но можно заметить, что обычно совпадающие в омографе слова относятся к разным частям речи (мо́я-моя́) или имеют разные морфологические признаки (ре́ки-реки́). Поэтому можно уменьшить углеродный след от генератора стихов, используя частеречную разметку и выбор нужного варианта ударения по его результатам.

Хуже дело обстоит со словами, которые допускают варианты ударения в рамках одной грамматической формы при сохранении семантики (тво́рог и творо́г) или имеют разный смысл, но практически неразрешимы грамматически (та́я-тая́). В этом случае поэтический транскриптор вынужден перебирать все варианты ударения. Обычно, кстати, их 2, но есть и уникальные слова, для которых приходится учитывать аж 3 варианта: на́чала - нача́ла - начала́.

Проверка рифмовки

Чтобы стихотворение звучало "плавно", мало соблюсти регулярный порядок чередования ударных и безударных слогов. Необходимо также обеспечить фонетическую сопоставимость последних слов в каждой строке, точнее - части слов, начиная с ударной гласной (см. клаузулы).

Важно понимать, что надо сравнивать не просто побуквенно заударные хвосты слов, а именно фонетические представления. Например, для слова "мяч" нужно учитывать, что буква "я" на самом деле выполняет 2 функции: смягчает предыдущую согласную, и сама произносится как "а". Поэтому "мяч" рифмуется со словом "грач". Аналогичные правила есть для букв е, ё, ю.

Также в заударных хвостах надо учитывать изменения безударных гласных, в частности "о" становится "а" (см. про это).

Из прочих частых ситуаций можно упомянуть произношение "-ться".
Результатом проверки рифмовки является как сам вердикт "есть рифмовка - нет рифмовки", так опознанная схема рифмовки: какие строки с какими рифмуются. В текущей версии опознаются следующие схемы рифмовки:

Самая частотная ABAB:

Портре́т на сто́лике стои́т
Глаза́, как - будто бы живы́е
А ма́ть печа́льная скорби́т
Все вспомина́я дни́ былы́е

Рубаи (а также "филатовский" размер) AABA:

Оди́н - еще́ не по́вод для кручи́ны
Теря́ть лицо́ досто́йно ли мужчи́ны
Но не ищи́ ты же́нщин средь причи́н
На том лице́ от же́нщин лишь морщи́ны

AABB:

Мне тру́дно жи́ть с тобо́ю вро́зь
В душе́... вся жи́знь - напереко́сь
Сердца́ не мо́гут вме́сте бы́ть
Мой ра́зум хо́чет вновь люби́ть

ABBA:

Не переда́ть сакра́льность э́ту
Там де́вять сла́вных мудрецо́в
Свобо́дных от земны́х око́в
Учи́ли нас добру́ и све́ту

Где используется поэтический транскриптор?

В основном ПТ используется в пайплайне подготовке данных для обучения моделей. Из огромной исходной кучи стихов, наскрапленных по рунету, он отбрасывает творения плохого качества - с плохим ритмом, без рифмовки. По факту, около 80% всех стихов уходит в шлак.

Те стихи, которые прошли проверку метрики и рифмовки, транскриптор размечает ударениями. Такая разметка поступает на вход генеративной модели при обучении, что и позволяет генерировать стихи с учетом фонетических закономерностей.

В инференсе, то есть при генерации стихов, например в телеграм-боте @verslibre, поэтический транскриптор ранжирует выдачу генеративки. Это позволяет отсеять некоторое количество генераций с дефектами. Хотя, в принципе, генеративная модель задумана как end-to-end, то есть она уже выдает сама по себе стихи без дополнительных подсказок по поводу рифм и ударений.

ударения, стихи, фонетика, русский язык, генеративные стихи

Previous post Next post
Up