Python 马尔可夫模型
我必须在语料库上运行Markov 0和1模型,并以最大概率计算两个句子。 我的代码运行,但结果始终为0.0,它适用于标记,而不是句子 代码如下:Python 马尔可夫模型,python,nltk,probability,markov,Python,Nltk,Probability,Markov,我必须在语料库上运行Markov 0和1模型,并以最大概率计算两个句子。 我的代码运行,但结果始终为0.0,它适用于标记,而不是句子 代码如下: def FrasiAccettabili(frasi, testoTokenizzato): frasiLunghe=[] frasiBuone=[] for frase in frasi: tokens=nltk.word_tokenize(frase) if len(tokens)>9: frasiLu
def FrasiAccettabili(frasi, testoTokenizzato):
frasiLunghe=[]
frasiBuone=[]
for frase in frasi:
tokens=nltk.word_tokenize(frase)
if len(tokens)>9:
frasiLunghe.append(frase)
for fraseBuona in frasiLunghe:
tokenBuoni=True
token=nltk.word_tokenize(fraseBuona)
for tok in token:
if testoTokenizzato.count(tok)<=2:
tokenBuoni=False
if tokenBuoni==True:
frasiBuone.append(fraseBuona)
return frasiBuone
def ProbabilitaFraseMarkov0(lunghezzaCorpus, testoTokenizzato, frasi):
frasiProbabilita=[]
probabilita=1.0
for frase in frasi:
tokens = nltk.word_tokenize(frase)
for tok in tokens:
probabilitaToken= testoTokenizzato.count(tok)*1.0/lunghezzaCorpus*1.0)
probabilita=probabilita*probabilitaToken
frasiProbabilita.append((frase, probabilita))
return frasiProbabilita
def ProbabilitaFraseMarkov1(lunghezzaCorpus, testoTokenizzato, frasi):
frasiProbabilita=[]
bigrammiCorpus = list(bigrams(testoTokenizzato))
for frase in frasi:
tokens=nltk.word_tokenize(frase)
probabilitaFrase=(testoTokenizzato.count(tokens[0])*1.0)/(lunghezzaCorpus*1.0)
bigrammiFrase=list(bigrams(tokens))
for bigramma in bigrammiFrase:
frequenzaBigramma=bigrammiCorpus.count(bigramma)
frequenzaPrimoElemento=testoTokenizzato.count(bigramma[0])
probabilitaBigramma=(frequenzaBigramma*1.0)/(frequenzaPrimoElemento)
probabilitaFrase=probabilitaFrase*probabilitaBigramma
frasiProbabilita.append((frase, probabilitaFrase))
return frasiProbabilita
def main(file1, file2):
fileInput1 = codecs.open(file1, "r", "utf-8")
fileInput2 = codecs.open(file2, "r", "utf-8")
raw1 = fileInput1.read()
raw2 = fileInput2.read()
sent_tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
frasi1 = sent_tokenizer.tokenize(raw1) #tokenizzazione
frasi2 = sent_tokenizer.tokenize(raw2)
frasiValideC1 = FrasiAccettabili(frasi1, tokensTotC1)
Markov0C1 = set(ProbabilitaFraseMarkov0(lunghezzaC1, frasiValideC1, tokensTotC1))
frasiOrdC1 = sorted(Markov0C1, key=lambda x:x[1], reverse=True)
fraseProbMAXC1 = frasiOrdC1[0]
frasiValideC2 = FrasiAccettabili(frasi2, tokensTotC2)
Markov0C2 = set(ProbabilitaFraseMarkov0(lunghezzaC2, frasiValideC2, tokensTotC2))
frasiOrdC2 = sorted(Markov0C2, key=lambda x:x[1], reverse=True)
fraseProbMAXC2 = frasiOrdC2[0]
Markov1C1 = set(ProbabilitaFraseMarkov1(lunghezzaC1, frasiValideC1, tokensTotC1))
frasiOrdinateC1 = sorted(Markov1C1, key=lambda x:x[1], reverse=True)
fraseProbMAX1C1 = frasiOrdinateC1[0]
Markov1C2 = set(ProbabilitaFraseMarkov1(lunghezzaC2, frasiValideC2, tokensTotC2))
frasiOrdinateC2 = sorted(Markov1C2, key=lambda x:x[1], reverse=True)
fraseProbMAX1C2 = frasiOrdinateC2[0]
def frasiacettabili(frasi,testoTokenizzato):
frasiLunghe=[]
frasiBuone=[]
对于frasi中的frase:
令牌=nltk.word\u令牌化(frase)
如果len(代币)>9:
frasiLunghe.append(frase)
对于frasiLunghe的fraseBuona:
tokenBuoni=True
token=nltk.word\u tokenize(fraseBuona)
对于tok in令牌:
如果testoTokenizzato.count(tok)你不小心写了一个程序,它可以在记号上工作,而不是在句子上工作?我想是的!因为当程序运行时,它总是以0.0的概率打印一个单词,而不是一个句子。