Читать нас в Telegram
Иллюстратор: Женя Родикова

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

Не так просто. Во-первых, подобный алгоритм пропустит неточные рифмы, столь любимые поэтами XX и XXI веков. Другой проблемой станут слова, произношение которых в прошлом отличалось от современного. Таким образом, «наивный» метод поиска рифм не даст хороших результатов. 

Недостатки этого подхода были учтены в работе чешского стиховеда Петра Плехача (Petr Plecháč). В 2018 году ученый предложил свой способ поиска рифм, основанный на извлечении коллокаций и машинном обучении. Программа, написанная филологом, поддерживает семь языков: чешский, английский, французский, русский, немецкий, испанский, нидерландский.

В этой статье мы подробно расскажем о работе программы на примере ее первой версии, которая поддерживала только английский, французский и чешский языки. О ней Петр Плехач написал научную статью.

Материал для обучения RhymeTagger

Для обучения алгоритма необходим тренировочный датасет. Он собирается автоматически: из корпуса стихотворений соответствующего языка отбираются пары слов, которые программа распознает как рифмы. Как именно это происходит?

  1. Из стихотворений в корпусе извлекаются последние слова всех строк. Далее программа рассматривает их как обычный текст.
  1. Алгоритм ищет коллокации — пары слов, которые повторяются достаточно часто (хотя бы 4 раза во всем корпусе); при этом между потенциально рифмующимися словами должно быть не более 3 слов.
  2. Рассчитывается t-критерий Стьюдента для найденных пар. Он позволяет оценить, с какой точностью можно считать коллокации рифмами, а не случайными парами слов.
  3. Если значение t-критерия превышает пороговое значение, установленное автором программы, то обнаруженная пара слов попадает в тренировочный датасет, так как она с высокой вероятностью является рифменной.

Обучение алгоритма

У каждого слова в тренировочном датасете есть транскрипция — она была сделана для исходных корпусов стихотворных текстов с помощью существующих программ (KVĚTA для чешского, MaryTTS для английского и французского). 

Используя тренировочный датасет, состоящий из рифменных пар, RhymeTagger просчитывает вероятность того, что определенные звуки или наборы звуков рифмуются между собой. Чтобы сделать это, программа сначала извлекает из транскрипции звуки, которые отвечают за создание рифмы. Алгоритм, который выполняет эту операцию, работает так:

  1. из транскрипции убираются все звуки, предшествующие слогообразующему звуку [1] последнего ударного слога;
  2. если оставшаяся часть слова длиннее двух слогов, алгоритм убирает часть транскрипции, находящуюся до слогообразующего звука предпоследнего слога;
  3. затем удаляются все согласные звуки, находящиеся перед первой из оставшихся гласных;
  4. оставшаяся часть транскрипции слова разбивается на части: слогообразующие звуки и кластеры согласных; получившиеся наборы звуков программа записывает в обратном порядке (последний элемент транскрипции становится первым и т.д.).

Работа RhymeTagger

На основе данных, полученных при обучении, алгоритм может вычислить вероятность того, что некоторые два слова в корпусе рифмуются. Расчет вероятности включает несколько этапов. Опишем их на примере слов «розы» и «абрикосы». 

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

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

Исходные тексты стихотворений также нужны для работы алгоритма.

В результате такой обработки «розы» и «абрикосы» будут представлены, соответственно, наборами звуков: {о}, {з}, {ыэ}; {о}, {с}, {ыэ} ({ыэ} — это звук, близкий к {ы}, но имеющий призвук {э}; он произносится на месте буквы «ы», так как последний слог в данных словах не является ударным).  

Алгоритм рассчитывает вероятность того, что два слова рифмуются, основываясь на вероятности рифмовки звуков, занимающих одну и ту же позицию в обработанных транскрипциях исследуемых слов. В нашем примере программа будет высчитывать вероятность того, что рифмуются слова, у которых последний звук одинаковый — {ыэ}, предпоследние звуки — {с} и {з} соответственно, а третий с конца звук снова один и тот же: {о}.

Алгоритм работает следующим образом. Для каждой пары звуков, занимающих одинаковые позиции в представленных транскрипциях, выполняются вычисления:

  1. рассчитывается относительная частотность пар слов (рифм) в составе тренировочного датасета, в которых данные два звука занимают ту же позицию, что и в исследуемых словах; в нашем примере будет определена относительная частотность пар слов, в одном из которых на предпоследнем месте находится звук {с}, а в другом — {з};
  2. рассчитывается относительная частотность слов во всем необработанном корпусе стихотворений, где {с} занимает предпоследнее место;
  3. определяется относительная частотность слов в необработанном корпусе, где {з} занимает предпоследнее место;
  4. вычисляется вероятность того, что исследуемые слова рифмуются, основанная лишь на информации о предпоследнем звуке каждого из исследуемых слов; для этого используется формула:

При выполнении этих шагов препятствием может стать ограниченность тренировочного корпуса: в нем может не оказаться пары слов, где предпоследнюю позицию занимают звуки {з} и {с}. В таком случае действует другой алгоритм: программа проверяет, одинаковы ли в исследуемых словах звуки на интересующей нас позиции. Если они одинаковы, то вероятность рифмовки слов признается высокой — 90%. Если звуки разные (как в нашем примере), то вероятность считается очень низкой — 0.01%. 

Выполнив описанные выше шаги, программа вычисляет итоговую вероятность рифмовки исследуемых слов — на этот раз используя данные всех звуков. (Если слова представлены разным количеством звуков, то в более длинной транскрипции «лишние» звуки не учитываются.) Итоговое вычисление выполняется по формуле, которая для нашего примера будет выглядеть так: 

В зависимости от количества звуков в транскрипции (от двух до четырех), формула будет меняться. Для слов, в обработанной транскрипции которых осталось только два звука, выражение будет выглядеть так:

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

Разметка рифм

Алгоритм отметит пару строк в корпусе как рифмующиеся, если их последние слова отвечают двум условиям:

  1. не совпадают;
  2. вероятность рифмовки данной пары слов (рассчитанная по формуле выше) больше 95%.

Сами строки при этом должны находиться на определенном расстоянии друг от друга: между ними не должно быть более 3 строк.

Когда подводит транскрипция

Как быть со словами, автоматическая транскрипция которых выполняется неверно, потому что их произношение изменилось со временем? Петр Плехач предлагает ориентироваться на написание. Формула, по которой рассчитывается вероятность рифмовки таких слов, схожа с формулой для расчета вероятности рифмовки на основании информации об одном звуке (это первая формула в статье). Только вместо определенного звука программа ориентируется на последние три символа слова (триграмм). 

Как алгоритм определяет, в каких словах лучше учитывать триграммы, а не транскрипцию? Специального списка для этого, конечно, нет. Алгоритм размечает пары рифм на основании триграмм только в том случае, если ни одно из слов в паре не было признано рифмующимся на основании транскрипции.

Завершение обучения

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

Точность алгоритма

По результатам тестирования, которое провел автор программы, RhymeTagger смог найти более 95% рифм в корпусе стихотворений на чешском языке и более 85% — в корпусах поэзии на английском и французском. В целом, во всех трех корпусах алгоритм неверно определял рифмы (принимал за них не рифмующиеся слова) менее чем в 7% случаев. По оценке автора алгоритма, это очень хорошие результаты.

Тестируем инструмент

Как алгоритм работает на практике? Мы решили проверить на примере двух стихотворений — на русском и английском. Для этого мы написали свою программу, используя библиотеку Python, созданную Плехачем. Библиотека была опубликована в начале 2021 года, об этом писал Системный Блокъ. Библиотека поддерживает больше языков, чем инструмент, описанный в статье 2018 года. Были добавлены русский, немецкий, испанский и нидерландский.

Перейдем к примерам. Сможет ли RhymeTagger распознать рифмы в стихотворении Маяковского? Или ему помешает «Лесенка» — знаменитый способ записи стихов, которым пользовался поэт?

А вы могли бы?

Я сразу смазал карту будня,

плеснувши краску из стакана;

я показал на блюде студня

косые скулы океана.

На чешуе жестяной рыбы

прочел я зовы новых губ.

А вы

ноктюрн сыграть

могли бы

на флейте водосточных труб?

Согласно В. Н. Дядичеву [2], с формальной точки зрения это произведение состоит из двух четверостиший, хотя графическое деление на строфы и отсутствует. При этом третья строка второго четверостишия разделена на 3 части.

Программа верно определила рифмы в первых четырех строках — вывела схему, соответствующую перекрестной рифмовке. Однако во втором четверостишии деление третьей строки сбило алгоритм с толку. Настоящий тип рифмовки здесь также перекрестный; рифмуются строки, оканчивающиеся словами: «рыбы» — «могли бы», «губ» — «труб». Однако программа неправильно распознала один из наборов рифм: отметила, что строчка «А вы» входит в группу строк с рифмой «рыбы» — «могли бы». 

Тем не менее, в целом, RhymeTagger показал хороший результат: он смог узнать неточную рифму («рыбы» — «могли бы»).

Второе стихотворение, на материале которого мы протестировали RhymeTagger, — это 117-й сонет Шекспира («Accuse Me Thus: That I Have Scanted All»). На его примере можно проверить, работает ли распознавание рифм в словах, произношение которых изменилось со времени написания произведения (эти слова — «winds» и «love»).

Алгоритму удалось правильно определить схему рифмовки сонета: три четверостишия с перекрестной рифмой и две заключительных строки, рифмующиеся между собой. Это классическая форма шекспировского сонета [3]. 

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

Вы можете воспроизвести наш эксперимент и воспользоваться программой здесь. Для этого нужно иметь Google аккаунт.

Автор алгоритма

RhymeTagger — одно из многих достижений чешского ученого Петра Плехача. Он — очень известный в мировом сообществе цифровой стиховед (ученый, который разрабатывает и применяет цифровые методы в исследованиях поэзии). Плехач участвовал в создании Корпуса чешского стиха и в настоящее время работает над этим проектом. Также филолог занимается стилометрией, в том числе развивает идеи использования стихотворных признаков для определения авторства. Недавно Плехач выпустил про это целую книгу.

Среди стилометрических исследований Плехача — известная работа о «Генрихе VIII». С помощью машинного обучения ученый определил, какие строки в пьесе не принадлежат Шекспиру [4] [5]. 
В другой научной работе команда ученых, используя машинное обучение, раскрывает мистификацию — доказывает, что стихи поэта-декабриста Батенькова, обнаруженные в XX веке, являются подделкой.

Источники

Plecháč P. (2018) A Collocation-Driven Method of Discovering Rhymes (in Czech, English, and French Poetry). In: Fidler M., Cvrček V. (eds) Taming the Corpus. Quantitative Methods in the Humanities and Social Sciences. Springer, Cham.

[1] Слогообразующий звук — это звук, способный образовать слог. В русском языке такими звуками являются гласные. В чешском, например, слогообразующими являются также и сонорные («vlk» — «волк» на чешском).

[2] «А вы могли бы?» Википедия

[3] Сонет. Википедия

[4] Machine learning has revealed exactly how much of a Shakespeare play was written by someone else. MIT Technology Review

[5] Искусственный интеллект определил, какая часть пьесы «Генрих VIII» написана не Шекспиром. Habr.com