Форум сайта python.su
Дорогие друзья,
помогите, пожалуйста, исправить код. На входе имеем стихотворный текст типа:
Я вас любил, любовь еще, быть может,
В душе моей угасла не совсем.
В каждом стихе нужно выделить устойчивые пары слов (эта часть скрипта уже имеется).
Нужно, чтобы считало: , пропуская «может в», и то же самое с общим количеством пар: 6 пар для первой строки, 5 пар для второй строки и т. д.
import os from math import log """Функции про логарифмы - для последующего подсчета устойчивости словосочетаний""" def logL(p,k,n): if p == 0: return (n - k) * log(1 - p) elif p == 1: return k * log(p) else: return k * log(p) + (n - k) * log(1 - p) def logLikehoodRatioBinormal(k1, n1, k2, n2): p1 = k1 / n1 p2 = k2 / n2 p = (k1 + k2) / (n1 + n2) return 2 * (logL(p1, k1, n1) + logL(p2, k2, n2) - logL(p, k1, n1) - logL(p, k2, n2)) """ОТКРЫВАЕМ ФАЙЛ И НАРЕЗАЕМ ЕГО НА СТИХИ - ПОЛУЧАЕТСЯ СПИСОК СТИХОВ""" fileObj = open('C:/Texts/Verses/1.txt', 'r+', encoding='utf-8') verseList = fileObj.readlines() """Задаем словари""" A = {} B = {} AB = {} N = 0 """ОБЪЯСНЯЕМ ПИТОНУ, КАК ИТЕРИРОВАТЬ ПО ПОЛУЧЕННОМУ СПИСКУ СТИХОВ И КАК ОТТУДА ИЗВЛЕКАТЬ ОТДЕЛЬНЫЕ СЛОВА""" """Вот тут непонятно, как написать код так, чтобы в качестве inp Питон брал последовательно по строке из verseList. И действительно ли программа берет слова в пределах отдельных стихов? Но ответ какой-то получается""" RUSSIAN_ALPHABET = set("йцукенгшщзхъфывапролджэячсмитьбюёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ") def clearWord(word): buff = [] for char in word: if char == "ё": buff.append("ё") elif char in RUSSIAN_ALPHABET or (char == "-" and len(buff) > 0): buff.append(char) return "".join(buff).lower() words = [] for verse in verseList: verse = verse.split() words.extend(clearWord(el) for el in verse if clearWord(el)) print(words) """Результат каждый раз - другой, хотя список words всегда один и тот же""" for verse in range(len(verseList)-1): pair = words[verse], words[verse + 1] try: AB[pair] += 1 except KeyError: AB[pair] = 1 try: A[pair[0]] += 1 except KeyError: A[pair[0]] = 1 try: B[pair[1]] += 1 except KeyError: B[pair[1]] = 1 N += 1 raitings = [] for pair in AB: ab = AB[pair] anotb = A[pair[0]] - ab notab = B[pair[1]] - ab notanotb = N-A[pair[0]] - B[pair[1]] + ab raitings.append((pair, logLikehoodRatioBinormal(k1 = ab, n1 = ab + anotb, k2 = notab, n2 = notab + notanotb))) raitings.sort(key = lambda x: x[1], reverse = True) for el in raitings[:20]: print(el)
Отредактировано BlackRabbit (Июнь 13, 2014 17:23:57)
Офлайн