Теория рифмы

  1. Рифмуются не буквы, а звуки. Каждое слово транскрибируется по правилам Международного фонетического алфавита IPA. Поэтому "Снится"(sʲɪˈnʲit͡sə)/ "синица"(ˈsʲnʲit͡sːə) - это близкая рифма.
  2. Для подбора рифм имеют значение:
    • ударный гласный.
    • все звуки после него.
    • согласный перед ним, если таковой в наличии. Например, в слове "колесо" алгоритм учитывает только [-со].
    • позиция звука, которая считается от ударного гласного. В паре "дом" / "ком", "о" - позиция 1, "д" и "к" занимают позицию 0, а звуки "м" позицию 2.
  3. Пара "облако" / "о'кала" имеет большинство одинаковых звуков, которые, однако, располагаются на разных позициях. Поэтому данная пара квалифицируется не как рифма, а как созвучие (ассонанс + консонанс).
  4. Отношения между созвучными словами описываются рифмическими паттернами. Например, слова "рог", "пирог", "сырок", "урок" имеют один и тот же паттерн: ('same_cons', 'same_stressed', 'same_cons').
  5. В рифмованных словах звуки имеют свои созвучные пары, которые я обозначаю следующими символами:
    • same_cons = тот же самый согласный на той же позиции в обоих словах: "дом" - "ком": "м" на позиции 2: ('any_cons', 'same_stressed', 'same_cons').
    • same_stressed_v = тот же самый ударный гласный "о" на позиции 1.
    • near_stressed = гласная и её йотированная пара, как о - ё в словах "дом" - "проём": ('any_cons', 'near_stressed', 'same_cons').
    • same_v = тождественная гласная на соответствующих позициях, как финальная 'а' в паре "кобра" - "вобла"; ('any_cons', 'same_stressed', 'same_cons', 'any_cons', 'same_v').
    • voice = звонкий/ глухой согласный, который соответствует глухому/ звонкому в другом слове: например, "к" и "г" в паре "конь" - "огонь": ('voice', 'same_stressed', 'same_cons').
    • palatal = мягкий/ твердый согласный, который соответствует твердому/ мягкому: "боль" - "бейсбол"; ('same_cons', 'same_stressed', 'palat').
    • any_v = любой гласный, например, последние звуки в паре "кепка" - "скрепку"; ('any_cons', 'same_stressed', 'same_cons', 'same_cons', 'any_v').
    • any_cons = любой согласный на тех же позициях: "конь" - "кот"; ('same_cons', 'same_stressed', 'any_cons').
    • no_sound = пропущенный звук на соответствующей позиции: "дом" - "дзюдо", 'м' - звук, пропущенный в конце второго слова: ('same_cons', 'same_stressed', 'no_sound').
    • add_sound = добавленный звук: в паре "дом" - "гнедому", звук 'у' добавлен: ('same_cons', 'same_stressed', 'same_cons', 'add_sound').
    • add_init_cons = звук, добавленный перед ударным гласным: "ом" - "альбом": ('add_init_cons', 'same_stressed', 'same_cons').
    • no_init_cons = звук, удалённый перед ударным гласным, пример, реверсивный предыдущему: "дом" - "ом": ('no_init_cons', 'same/_stressed', 'same_cons')
  6. Степень рифмического соответствия - это континуум, в котором ухо само решает, где слова еще гармонируют друг с другом, а где уже нет.
  7. Каждому рифмованному слову присваивается штраф, который учитывает близость-дальность рифмических пар, описанных выше. Наибольший штраф снимается за добавление или пропуск звука, чуть меньший - any_v, any_cons, наименьший - за полное соответствие (same_v, same_cons). Средний штраф, соответственно, получают такие соотношения, как near_stressed, voice, palatal. Элемент паттерна add_init_cons и его реверс no_init_cons, при котором к ударному гласному добавляется/ отнимается предшествующий согласный, имеет особое значение - за него штраф дается, но минимальный.
    • 0 - "время"/ "бремя": ('same_cons', 'same_stressed', 'same_cons', 'same_v') - полное совпадение всех звуков, нулевой штраф.
    • 1 - "конь"/ "огонь": ('voice', 'same_stressed', 'same_cons') - согласные перед ударным гласным соотносятся как глухой "к" и звонкий "г".
    • 5 - "вода"/ "воздал": ('same_cons', 'same_stressed', 'add_sound') - в конце второго слова добавлен звук "л"; штраф существенно выше, и рифма уже звучит как более далёкая.
    • 6 - "вода"/ "атак": ('voice', 'same_stressed', 'add_sound') - согласные, предшествующие ударному гласному, соотносятся как звонкий "д" - глухой "т", плюс ко второму слову добавлен звук "к". Рифма достаточно далекая, соответственно и штраф большой.
    • 8 - "о'трок"/ "водок": ('add_init_cons', 'same_stressed', 'voice', 'no_sound', 'same_v', 'same_cons') - пара с ещё более далёкой рифмой, где большую роль играет уже не собственно рифмическая гравитация, а созвучность гласных и согласных в пределах целого слова. Добавлен согласный "в", предшествующий ударному гласному, "т" и "д" соотносятся как глухой/ звонкий, пропущен звук "р".
  8. Степень созвучия вычисляется по формуле, которая учитывает ряд факторов, прежде всего, наличие в слове ассонансов/ консонансов, а также длину слова. Если для расчёта рифмической дистанции между словами во внимание берётся позиция звуков, то для созвучности это не имеет значения. Кроме того, алгоритм поиска рифм отсекает все звуки, которые предшествуют ударному гласному, и, если есть, предшествующему согласному, в то время как для поиска созвучий берётся всё слово целиком. Как следствие, наиболее интересные созвучия встречаются в словах, в которых ударение падает на дальний от конца слог, которые получают далёкий балл рифмической несхожести и близкий балл в континууме ассонанс-консонанс.
    • штраф: 11, созвучность: 1 - "беженец"/ "невеже" - ('any_cons', 'same_stressed', 'same_cons', 'same_v', 'no_sound', 'no_sound').
    • штраф: 13, созвучность: 1 - "олово"/ "отлов" - ('any_cons', 'same_stressed', 'same_cons', 'same_v', 'no_sound', 'no_sound').
    • штраф - 11, созвучность - 1 - "творчество" / "отрочество" - ('add_init_cons', 'same_stressed', 'no_sound', 'same_cons', 'no_sound', 'same_cons', 'same_v', 'same_cons', 'same_cons', 'same_cons', 'same_v').

Aлгоритм для поставновки ударений

В основе алгоритма:

Вначале алгоритм ищет слово в базе данных, которая включает 422 821 cловарных позиций. Если слово отсутствует, тогда подключается нейросеть. Точность нейросети - 79,5%. Данный показатель обусловлен спецификой ударения в русском языке, которое отчасти имеет стохастический характер.

Проект на GitHub с описанием на английском.

Aлгоритм для транскрибирования

В основе алгоритма:

  • авторская база данных, созданная путем парсинга русского раздела en.wiktionary.org. База данных включает 422 821 cловарных позиций.
  • авторская нейросеть. Точность нейросети - 99,96%. Данный показатель обусловлен aбсолютным соответствием букв и звуков в любой фонетической системе.

Алгоритм выполняет транскрибирование по правилам Международного фонетического алфавита IPA.

Примеры транскрипций:

  • молоко' / məlˠɐˈko
  • ё'ж / ijɵʂ
  • челове'к / t͡ɕɪlˠɐˈvʲek

Проект на GitHub c описанием на английском.

Первый открытый алгоритм для подбора рифм

  • В основе: en.wiktionary.org, две авторские нейросети:
    • для постановки ударения.
    • для транскрипции русских слов в международный фонетический алфавит.
  • Технологический стек: Python, Keras, Django, JS, html, css, docker, git, vim.
  • python package на GitHub, а также документация на английском.

Автор теории рифм, алгоритма и разработчик проекта: Евгений Проскуликов