Найти - Пользователи
Полная версия: Помогите, плиз, соединить части кода
Начало » Центр помощи » Помогите, плиз, соединить части кода
1
BlackRabbit
Продолжаю мучения с моим кодом подсчета устойчивых словосочетаний в стихотворных строках.
Чтобы скрипт заработал, нужно соединить две части скрипта: а) мое начало и б) продолжение из другого кода, который искал результат по всему тексту. Заранее спасибо. Вот код:

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()
words = []
A = {}
B = {}
AB = {}
N = 0
"""Нужно, чтобы каждый элемент в списке verseList нарезался на слова и с ними  работал следующий код как с элементами words"""
for i in verseList:
    words.extend(i in verseList.split())
print(words)
for i in range(len(words) - 1):
    pair = words[i], words[i + 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)
run
Хотел предложить тебе вариант, как мне кажеться более правильный.
Нарезку слов в предложении делать с помощью регулярных выражений.
Затем их нормализовывать с помощью pymorphy2 или mystem от яндекса.
import pymorphy2
morph = pymorphy2.MorphAnalyzer()
p=morph.parse(word1)
# смотреть доки
И пихать в словарь или в базу где будешь вести счетчик каждого устойчивого словосочетания.
Привожу код (может и корявый, но работает), кторый кромсает предложения на слова и словосочетания. Регулярное выражение можно поизощеренне придумать (тестер http://www.regexr.com/v1/)
import re
r2=re.compile(u'([A-Za-zА-Яа-я]{4,100})')
def MakeGramms(ng,deltaw,t):
# t - предложение
    #deltaw=7 # макисмальное количество символов между словами при котором слова объединяются в словосочетание
    #ng=2 # кол-во слов в словосочеттании 1,2,3,4,5 ...
    global r2
    sl=0
    lt=len(t)
    res=[]
    n=0
    while sl<lt:
        try:            
            line=r2.search(t,sl)
        except:
            print t
        if line:
            sl=line.end()            
            res.append([line.group(0),line.start(),line.end(),n])
            n=n+1
        else:
            break
    ls=len(res)
    last=0
    curr=0
    line=''
    allgramm=[]
    for i in res:
        gramm=[]
        ok=1
        curr=last
        while ok and curr+1<ls:        
            if len(gramm)<ng: # добавляем слово в грамм
                if not gramm:
                    gramm.append(i)
                    ok=1
                else:
                    curr=curr+1                
                    if res[curr][1]-gramm[-1][2]<deltaw:
                        gramm.append(res[curr])                     
                        ok=1
                    else:
                        gramm=[]                    
                        ok=0
            else:
                allgramm.append(gramm)
                ok=0
        last=last+1
    return(allgramm)
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