Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 13, 2014 15:02:03

BlackRabbit
Зарегистрирован: 2013-12-03
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Итерация по списку без пересечения

Дорогие друзья,

помогите, пожалуйста, исправить код. На входе имеем стихотворный текст типа:

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


В каждом стихе нужно выделить устойчивые пары слов (эта часть скрипта уже имеется).
Нужно, чтобы считало: , пропуская «может в», и то же самое с общим количеством пар: 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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version