Найти - Пользователи
Полная версия: Как Python научить читать стихи? Есть задачка
Начало » Центр помощи » Как Python научить читать стихи? Есть задачка
1 2 3
Shaman
Я бы закодировал текст в ритм, используя базу соответствий “слог-единица ритма”, а дальше бы пользовался алгоритмами распознавания образов/обработки сигналов. Так можно выделить и стихотворные строки и связанные словосочетания, хотя для последних более подошли бы алгоритмы на н-граммах.
BlackRabbit
Shaman
Я бы закодировал текст в ритм, используя базу соответствий “слог-единица ритма”, а дальше бы пользовался алгоритмами распознавания образов/обработки сигналов. Так можно выделить и стихотворные строки и связанные словосочетания, хотя для последних более подошли бы алгоритмы на н-граммах.

К сожалению, не понял ни слова…
Нет, от меня требуется только подправить имеющийся код, нацелив Python на поиск внутри отдельных строк. Принципиально менять метод не нужно. Мне казалось, нужно 1) в блок, где начинается чтение файла, вписать дополнительные параметры, разбить текст на строки (например, введя соотвествующую переменную), 2) ограничить поиск отдельными строками.
py.user.next
BlackRabbit
Хорошо, абстрагируемся от конкретного текста и представим, что они есть, тем более в былинах повторы слов могут быть вполне. Меня интересует сам принцип, понимаете.

В этом тексте работай для выявления алгоритма.

Вот этот фрагмент.
Как по морю, морю по синему
Бегут-побегут тридцать кораблей,
Тридцать кораблей — един Сокол-корабль
Самого Садка, гостя богатого.
А все корабли что соколы летят,
Сокол-корабль на море стоит.

Что ты пытаешься из него выделить?
BlackRabbit
Окей. В начальном скрипте уже имеется алгоритм, который устанавливает условный “рейтинг” наиболее повторяемых (ключевых) слов. Только он их ищет по всему тексту.
Мне нужно чтобы скрипт на входе разбивал текст на стихотворные строки и делал такой рейтинг для слов внутри отдельных строк. Может, задание выглядит несколько бессмысленным, но, пожалуйста, помогите разобраться с кодом.

А в примере будут повторяться внутри отдельной строки слова:

Как по морю, морю по синему
Бегут-побегут тридцать кораблей,
Тридцать кораблей — един Сокол-корабль
Самого Садка, гостя богатого.
А все корабли что соколы летят,
Сокол-корабль на море стоит.


Следовательно, у них “рейтинг” будет выше.

Спасибо.
py.user.next
BlackRabbit
А в примере будут повторяться внутри отдельной строки слова:
Там ещё слово “по” повторяется.

BlackRabbit
В начальном скрипте уже имеется алгоритм, который устанавливает условный “рейтинг” наиболее повторяемых (ключевых) слов.
Во-первых, он не очень грамотно написан.
Во-вторых, то, что ты описываешь, с тем скриптом не сходится.
В-третьих, сначала придумывается алгоритм, а затем он записывается на подходящем языке, а не наоборот.

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

Вот входная строка.
Как по морю, морю по синему

Запиши результат, который должен получиться после её обработки.
BlackRabbit
Окей. Попробую объяснить. Идея просто в том, что когда считаем пары слов, нужно чтобы программа считывала только те пары, которые встречаются внутри одной строки. Например, если у нас есть строки

Я вас любил, любовь еще, быть может,
В моей душе угасла не совсем.


Нужно считать: “я вас, вас любил … быть может, в моей, моей душе …”, пропуская «может в», и то же самое с общим количеством пар: 6 пар для первой строки, 5 пар для второй строки и т.п. Надо просто разбить текст на строки и по очереди запускать алгоритм подсчета пар для каждой строки.
TroSer
может здесь найдете полезное?
BlackRabbit
Да, возможно, а как же будет выглядеть код? Можно вариант?
py.user.next
import re
import itertools
 
text = """
Как по морю, морю по синему
Бегут-побегут тридцать кораблей,
Тридцать кораблей — един Сокол-корабль
Самого Садка, гостя богатого.
А все корабли что соколы летят,
Сокол-корабль на море стоит.
"""
 
def convert_to_pairs(text):
    out = []
    for line in text.splitlines():
        words = re.findall(r'\w+', line)
        if words:
            pairs = list(pairwise(words))
            out.append(pairs)
    return out
 
def pairwise(seq):
    a, b = itertools.tee(seq, 2)
    next(b)
    return zip(a, b)
 
out = convert_to_pairs(text)
out

>>> out
[[('Как', 'по'), ('по', 'морю'), ('морю', 'морю'), ('морю', 'по'), ('по', 'синему')], [('Бегут', 'побегут'), ('побегут', 'тридцать'), ('тридцать', 'кораблей')], [('Тридцать', 'кораблей'), ('кораблей', 'един'), ('един', 'Сокол'), ('Сокол', 'корабль')], [('Самого', 'Садка'), ('Садка', 'гостя'), ('гостя', 'богатого')], [('А', 'все'), ('все', 'корабли'), ('корабли', 'что'), ('что', 'соколы'), ('соколы', 'летят')], [('Сокол', 'корабль'), ('корабль', 'на'), ('на', 'море'), ('море', 'стоит')]]
>>>

BlackRabbit
пропуская «может в»
Это выбирается после разбиения.
BlackRabbit
О, спасибо за вариант! Но у меня не срабатывает. Выдает пустоту. А как мне сделать, чтобы это все проделывалось с открываемым текстом из файла
with open('c:\Texts\File1', 'r', encoding = 'utf-8') as inp:
? Мне кажется, нужно просто изменить немного начальный код.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB