В 2018 году был разработан метод автоматической разметки рифм. В 2021 его автор представил RhymeTagger — общедоступную библиотеку на Python , которая позволяет вам анализировать рифмовку стихотворения. Рассказываем, как работает инструмент, и тестируем его на лесенках от Маяковского
Иллюстратор: Женя Родикова
Автоматический поиск рифм — задача, казалось бы, несложная в современном мире. Компьютер умеет переводить текст в его звуковое представление (как можно догадаться по общению с Siri или Алисой). Значит, программа может проанализировать последние звуки в строках и, ориентируясь на них, найти все рифмы?
Не так просто. Во-первых, подобный алгоритм пропустит неточные рифмы, столь любимые поэтами XX и XXI веков. Другой проблемой станут слова, произношение которых в прошлом отличалось от современного. Таким образом, «наивный» метод поиска рифм не даст хороших результатов.
Недостатки этого подхода были учтены в работе чешского стиховеда Петра Плехача (Petr Plecháč). В 2018 году ученый предложил свой способ поиска рифм, основанный на извлечении коллокаций и машинном обучении. Программа, написанная филологом, поддерживает семь языков: чешский, английский, французский, русский, немецкий, испанский, нидерландский.
В этой статье мы подробно расскажем о работе программы на примере ее первой версии, которая поддерживала только английский, французский и чешский языки. О ней Петр Плехач написал научную статью.
Для обучения алгоритма необходим тренировочный датасет. Он собирается автоматически: из корпуса стихотворений соответствующего языка отбираются пары слов, которые программа распознает как рифмы. Как именно это происходит?
У каждого слова в тренировочном датасете есть транскрипция — она была сделана для исходных корпусов стихотворных текстов с помощью существующих программ (KVĚTA для чешского, MaryTTS для английского и французского).
Используя тренировочный датасет, состоящий из рифменных пар, RhymeTagger просчитывает вероятность того, что определенные звуки или наборы звуков рифмуются между собой. Чтобы сделать это, программа сначала извлекает из транскрипции звуки, которые отвечают за создание рифмы. Алгоритм, который выполняет эту операцию, работает так:
На основе данных, полученных при обучении, алгоритм может вычислить вероятность того, что некоторые два слова в корпусе рифмуются. Расчет вероятности включает несколько этапов. Опишем их на примере слов «розы» и «абрикосы».
Для работы программы тексты стихотворений, которые нужно исследовать, должны быть обработаны следующим образом:
Исходные тексты стихотворений также нужны для работы алгоритма.
В результате такой обработки «розы» и «абрикосы» будут представлены, соответственно, наборами звуков: {о}, {з}, {ыэ}; {о}, {с}, {ыэ} ({ыэ} — это звук, близкий к {ы}, но имеющий призвук {э}; он произносится на месте буквы «ы», так как последний слог в данных словах не является ударным).
Алгоритм рассчитывает вероятность того, что два слова рифмуются, основываясь на вероятности рифмовки звуков, занимающих одну и ту же позицию в обработанных транскрипциях исследуемых слов. В нашем примере программа будет высчитывать вероятность того, что рифмуются слова, у которых последний звук одинаковый — {ыэ}, предпоследние звуки — {с} и {з} соответственно, а третий с конца звук снова один и тот же: {о}.
Алгоритм работает следующим образом. Для каждой пары звуков, занимающих одинаковые позиции в представленных транскрипциях, выполняются вычисления:
При выполнении этих шагов препятствием может стать ограниченность тренировочного корпуса: в нем может не оказаться пары слов, где предпоследнюю позицию занимают звуки {з} и {с}. В таком случае действует другой алгоритм: программа проверяет, одинаковы ли в исследуемых словах звуки на интересующей нас позиции. Если они одинаковы, то вероятность рифмовки слов признается высокой — 90%. Если звуки разные (как в нашем примере), то вероятность считается очень низкой — 0.01%.
Выполнив описанные выше шаги, программа вычисляет итоговую вероятность рифмовки исследуемых слов — на этот раз используя данные всех звуков. (Если слова представлены разным количеством звуков, то в более длинной транскрипции «лишние» звуки не учитываются.) Итоговое вычисление выполняется по формуле, которая для нашего примера будет выглядеть так:
В зависимости от количества звуков в транскрипции (от двух до четырех), формула будет меняться. Для слов, в обработанной транскрипции которых осталось только два звука, выражение будет выглядеть так:
Самую длинную формулу, для четырех звуков, представить себе нетрудно.
Алгоритм отметит пару строк в корпусе как рифмующиеся, если их последние слова отвечают двум условиям:
Сами строки при этом должны находиться на определенном расстоянии друг от друга: между ними не должно быть более 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 веке, являются подделкой.
[1] Слогообразующий звук — это звук, способный образовать слог. В русском языке такими звуками являются гласные. В чешском, например, слогообразующими являются также и сонорные («vlk» — «волк» на чешском).
[2] «А вы могли бы?» Википедия
[3] Сонет. Википедия
[5] Искусственный интеллект определил, какая часть пьесы «Генрих VIII» написана не Шекспиром. Habr.com
Компания Google представила много новых ИИ-продуктов, а модель GPT опровергла известную математическую гипотезу Пала Эрдёша — рассказываем, что произошло в мире ИИ за последнее время
Facebook* и Instagram* будут сканировать фото и видео, чтобы находить детей, которые скрыли свой возраст
Можно ли заниматься NLP, если при словах «производная» и «матрица» хочется закрыть ноутбук? Да — если изучать математику не абстрактно, а через реальные задачи. Объясняем, какие разделы действительно нужны джуну,…