Форум сайта python.su
Продолжаю мучения с моим кодом подсчета устойчивых словосочетаний в стихотворных строках.
Чтобы скрипт заработал, нужно соединить две части скрипта: а) мое начало и б) продолжение из другого кода, который искал результат по всему тексту. Заранее спасибо. Вот код:
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)
Отредактировано BlackRabbit (Июнь 14, 2014 23:28:47)
Офлайн
Хотел предложить тебе вариант, как мне кажеться более правильный.
Нарезку слов в предложении делать с помощью регулярных выражений.
Затем их нормализовывать с помощью pymorphy2 или mystem от яндекса.
import pymorphy2
morph = pymorphy2.MorphAnalyzer()
p=morph.parse(word1)
# смотреть доки
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)
Офлайн