программируем рифмы по трём последним буквам строк
Что такое созвучие трёх последних букв?
В русском стихосложении рифма часто основывается на совпадении звуков в конце слов, обычно — от ударного гласного и до конца слова. Часто говорят о созвучии последних трёх букв (или звуков) строки, чтобы определить, рифмуется она или нет.
Какие буквы в конце слова учитываются?
В русском языке рифмуют обычно:
гласные звуки после ударения (т.е. ударный гласный и все последующие звуки до конца слова),
и согласные звуки после ударного гласного.
Часто анализируют последние 2-3 звука (или буквы), чтобы определить рифму.
Алгоритм анализа трёх последних букв (звуков):
Определить ударение в слове (или в строке стиха). Рифма начинается с ударного гласного.
Выделить звуки от ударного гласного до конца слова. Обычно это 2-4 звука.
Взять последние 3 буквы (или звука) этого отрезка — это часть, которая должна совпадать в рифмующихся словах.
Проверить характер согласных:
В русском языке согласные могут быть звонкими/глухими, мягкими/твёрдыми.
В рифмах обычно допускается совпадение по звучанию, а не по написанию (например, звонкие и глухие согласные не всегда считаются одинаковыми).
Мягкость согласных важна (мягкие и твёрдые согласные различаются).
Позиции трёх последних букв:
Первая из трёх — обычно ударный гласный (или ближайший к ударению гласный звук).
Вторая и третья — согласные (или гласные, если слово заканчивается на гласный).
Часто рифмуется именно сочетание ударного гласного + последующих согласных.
Пример:
Слова: "гора" и "вода"
Ударный гласный — "о".
Последние три буквы: "ора" и "ода".
Звуки: [о-р-а] и [о-д-а].
Согласные "р" и "д" различны, значит рифма неполная.
Повторяемость и чередование
В рифмах часто повторяются одни и те же согласные и гласные в тех же позициях.
Если согласные в конце слова чередуются (например, звонкий/глухой парный согласный), то рифма считается неполной.
В позициях последние три буквы обычно фиксированы: ударный гласный + 1-2 согласных.
Итог
Три последние буквы (или звука) — это ударный гласный и последующие согласные.
Рифма требует совпадения этих звуков.
В позиции первая из трёх — ударный гласный, вторая и третья — согласные (или гласные, если слово заканчивается на гласный).
Чередование согласных допускается редко, обычно считается ошибкой для точной рифмы.
Если нужно, могу помочь написать конкретный алгоритм на программном языке или более подробно разобрать примеры.
мне нужно это на питоне сделать
то есть у меня много фраз стихов
файл строки.txt
я ввожу новую фразу
и программа если такой строки нет добавляет её в файл
а затем выводит 20 строк которые с ней рифмуются
из нашего файла
Понял задачу — нужно:
Хранить строки стихов в файле строки.txt.
При вводе новой строки:
Если её нет в файле — добавить.
Найти и вывести 20 строк из файла, которые с ней рифмуются по созвучию трёх последних букв (с учётом ударения и правил рифмы).
Как реализовать
Основная сложность — правильное выделение рифмы (созвучия) в конце строки.
Для упрощения возьмём приближённый метод:
Возьмём последнее слово строки.
Определим ударный гласный
( здесь — упрощённо, можно считать ударным последний гласный).
Возьмём от ударного гласного до конца слова — последние 3 буквы (если меньше — все).
Сравним эти части для рифмы.
Для более точного определения ударения можно использовать библиотеку pymorphy2 с дополнениями, но для простоты — возьмём последний гласный.
Пример кода:
import os
VOWELS = "аеёиоуыэюя"
def get_rhyme_part(word):
word = word.lower()
# Найти последний ударный гласный — для упрощения возьмём последний гласный
for i in range(len(word)-1, -1, -1):
if word[i] in VOWELS:
# Возьмём от этого гласного до конца слова
rhyme = word[i:]
# Возьмём последние 3 буквы рифмы (или меньше, если слово короткое)
return rhyme[-3:]
return word[-3:] # если гласных нет, взять последние 3 буквы
def get_last_word(line):
# Удалим знаки препинания в конце
line = line.strip().lower()
for ch in ",.!?;:":
if line.endswith(ch):
line = line[:-1]
words = line.split()
if not words:
return ""
return words[-1]
def lines_rhyme(line1, line2):
w1 = get_last_word(line1)
w2 = get_last_word(line2)
r1 = get_rhyme_part(w1)
r2 = get_rhyme_part(w2)
return r1 == r2
def load_lines(filename):
if not os.path.exists(filename):
return []
with open(filename, encoding='utf-8') as f:
return [line.strip() for line in f if line.strip()]
def save_line(filename, line):
with open(filename, 'a', encoding='utf-8') as f:
f.write(line + '\n')
def main():
filename = 'строки.txt'
lines = load_lines(filename)
new_line = input("Ввод строки стиха: ").strip()
if new_line not in lines:
save_line(filename, new_line)
lines.append(new_line)
# Найти 5 рифмующихся строк
rhymes = []
for line in lines:
if line == new_line:
continue
if lines_rhyme(new_line, line):
rhymes.append(line)
if len(rhymes) >= 20:
break
print("\nСтроки, рифмующиеся с вашей:")
if rhymes:
for r in rhymes:
print(r)
else:
print("Рифмующихся строк не найдено.")
if __name__ == "__main__":
main()
Как это работает
Загружаются строки из файла строки.txt.
Пользователь вводит новую строку.
Если её нет — добавляем.
Для рифмы берём последние 3 буквы от последнего гласного в последнем слове.
Выводим до 20 строк из файла, которые рифмуются с новой.
Ограничения и улучшения
Ударение определяется очень грубо (последний гласный).
Можно подключить словари ударений.
Рифма определяется по буквам, а не по звукам (можно улучшить с помощью фонетической транскрипции).
Можно расширить поиск по более сложным правилам.
Если нужно — могу помочь улучшить алгоритм с использованием библиотек для русского языка.
**
Введите строку стиха:
наверно это всё не просто
Строки, рифмующиеся с вашей:
это всё порой быть может просто
А я вспоминаю лишь время то
Хоть может быть это и странно
Душой без остатка, желанно
В них понять уже не так всё просто
но найти исток души не поздно
говоря создателю спасибо
Вдруг проясняет всё нежданно
и всё состряпано так ловко
Какое странное жеманство
души нелепое коварство
Там где всё кажется нелепо
забудь про что шептало небо
О том что с нашим миром стало
познав в душе всё что ей надо
Им всё понять не так и просто
Как всё забвению подобно
что проникает в мысли словно
и вновь понять ей нелегко
когда так небо высоко
не всё свершилось то что было
так светят искренне понятно
миг постигает многократно
Выпьют горькое вино
Жди. И с ними заодно
Всем смертям назло
Скажет: — Повезло
Как свежий воздух- солнце- небо
Чтобы подняв былинку в небо
Роднит все души наши - небо
и словно бренное безумство
её призыв - страстей блаженство
любви неведомой пространство
меняет время колдовство
что знает мира естество
дано понять всё превосходство
святое время благородство
то непомерное блаженство
Встречи и прощанья - это так не ново
Вознесся пышно, горделиво
Вскочил Евгений; вспомнил живо
Земной лишь веры волшебство
всё может жизни естество
Полнощных стран краса и диво
О это вечное коварство
Святая блажь- в ней всё не ново
И это всё не безрассудство
Он прошлый ужас; торопливо
меняют мира естество
Зачем душа рождает слово
Введите строку стиха:
душу я хочу расшевелить
Строки, рифмующиеся с вашей:
Лишь молодость может жизнь так любить
не может бег времён нарушить
и будет вечность лишь молить
когда так хочет просто жить
по другому нам как жить
нужно просто жизнь любить
чтоб просто так людей не мучить
всё может в душах изменить
способна свет на мир пролить
путь к душам хочет сократить
ничто не может изменить
судьбы невольной жизни нить
Игру нельзя остановить
как всё можно изменить
Его не можем упустить
Нельзя сей дар предвосхитить
Что учат нас как нужно жить
Познавая - учит жить
Ведь жизнь молитвой не измерить
Он должен был себе доставить
Может каждый полюбить
Нельзя ход времени замедлить
Ничто не может изменить
Нам помогая души сблизить
Что мог бы бог ему прибавить
Но можно счастье подарить
Ведь мыслей суть не утаить
Что просто так не изменить
Который учит жизнь любить
Ведь дар целить и может ранить
Без сожалений чтобы жить
Его нельзя остановить
Нас учит жизнь как нужно жить
Готовы в бой всегда вступить
Нельзя сей дар предвосхитить
Нам нет причины ворошить
Вершины что нас учат жить
Чтоб души все от зла очистить
чтоб душа могла творить
За ухабами ходить
Что мы должны боготворить
чтобы каждый знал как жить
Чтоб суть Вселенной изменить
Мир созерцая чтобы жить
всё то что можем мы исправить
Мы рождены чтоб строить, жить
Свети чтоб каждый мог поверить
жизнь наша стоит чтобы жить
словно с богом говорить
что не всем дано открыть
как нам это всё забыть
Понял - здесь нужно добавить проверку ритма —
чтобы рифмующиеся строки имели одинаковую чётность или нечётность
количества гласных букв строки
# Как добавить проверку ритма
Посчитать количество гласных в каждой строке.
Проверить, совпадает ли чётность количества гласных у новой строки и у строки из файла.
Выводить только те строки, у которых совпадает ритм (чётность гласных) и есть рифма.
# Обновлённый код с учётом ритма
```python
import os
VOWELS = "аеёиоуыэюя"
def count_vowels(line):
line = line.lower()
return sum(ch in VOWELS for ch in line)
def get_rhyme_part(word):
word = word.lower()
for i in range(len(word)-1, -1, -1):
if word[i] in VOWELS:
rhyme = word[i:]
return rhyme[-3:]
return word[-3:]
def get_last_word(line):
line = line.strip().lower()
for ch in ",.!?;:":
if line.endswith(ch):
line = line[:-1]
words = line.split()
if not words:
return ""
return words[-1]
def lines_rhyme(line1, line2):
w1 = get_last_word(line1)
w2 = get_last_word(line2)
r1 = get_rhyme_part(w1)
r2 = get_rhyme_part(w2)
return r1 == r2
def load_lines(filename):
if not os.path.exists(filename):
return []
with open(filename, encoding='utf-8') as f:
return [line.strip() for line in f if line.strip()]
def save_line(filename, line):
with open(filename, 'a', encoding='utf-8') as f:
f.write(line + '\n')
def main():
filename = 'строки.txt'
lines = load_lines(filename)
new_line = input("Введите новую строку стиха: ").strip()
if new_line not in lines:
save_line(filename, new_line)
lines.append(new_line)
new_line_vowels_count = count_vowels(new_line)
new_line_parity = new_line_vowels_count % 2
rhymes = []
for line in lines:
if line == new_line:
continue
if lines_rhyme(new_line, line):
if (count_vowels(line) % 2) == new_line_parity:
rhymes.append(line)
if len(rhymes) >= 5:
break
print("\nСтроки, рифмующиеся и совпадающие по ритму:")
if rhymes:
for r in rhymes:
print(r)
else:
print("Рифмующихся строк с совпадающим ритмом не найдено.")
if __name__ == "__main__":
main()
```
Что изменилось
Добавлена функция `count_vowels` для подсчёта гласных
При поиске рифмующихся строк проверяется, совпадает ли чётность количества гласных с новой строкой.
Выводятся только строки с совпадающей рифмой и ритмом
Если нужно, могу помочь сделать более точный подсчёт ударений или сложный ритм, но для начала этого достаточно.
модель сказала что это самое известное
стихотворение Сергея Есенина
Не жалею, не зову, не плачу,
Всё пройдет, как с белых яблонь дым.
Увяданья золотом охваченный,
Я не буду больше молодым.
Ты теперь не так уж будешь биться,
Сердце, тронутое холодком,
И страна берёзового ситца
Не заманит шляться босиком
Дух бродяжий! Ты всё реже, реже
Расшевеливаешь пламень уст.
О, моя утраченная свежесть,
Буйство глаз и половодье чувств.
Я теперь скупее стал в желаниях,
Жизнь моя, иль ты приснилась мне?
Словно я весенней гулкой ранью
Проскакал на розовом коне
Тихо шепчет осень в золотом уборе,
Листья падают, словно сны на землю
Ветер нежно гладит старую дорогу,
Где когда-то юность шла без сожаленья
Сердце тихо бьется в ритме прошедших дней,
Помнит радость, помнит боль и светлые мечты
Но теперь я знаю — в жизни нет потерь,
Каждый миг — как песня, что звучит в тиши
Вечер опускается, звезды загораются,
Тени прошлого мягко растворяются
В каждом вздохе — память, в каждом взгляде — свет,
Жизнь — как река, что в море утекает вслед
Пусть же сердце бьется в тишине и покое,
Пусть не гаснет в нем свет надежды и мечты
В каждом дне — своя святая доля,
И в прощанье — радость новых высот и высот
Свидетельство о публикации №125073106064