马尔可夫模型

2024-10-01 17:39:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须在语料库上运行马尔可夫0和1模型,并计算出概率最高的两个句子。 我的代码运行了,但结果总是0.0,并且它对标记有效,而不是对句子。在

代码如下:

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]

Tags: intruefordefcountwordtokenizenltk

热门问题