2016-04-22 53 views
0

下面是我的代碼。如何通過單字區分雙字符對的頻率?

from __future__ import division 
import nltk 
import re 

f = open('C:/Python27/brown_A1_half.txt', 'rU') 
w = open('C:/Python27/brown_A1_half_Out.txt', 'w') 

#to read whole file using read() 

filecontents = f.read() 
from nltk.tokenize import sent_tokenize 
sent_tokenize_list = sent_tokenize(filecontents) 

for sentence in sent_tokenize_list: 
    sentence = "Start " + sentence + " End" 
    tokens = sentence.split() 
    bigrams = (tuple(nltk.bigrams(tokens))) 
    bigrams_frequency = nltk.FreqDist(bigrams) 
    for k,v in bigrams_frequency.items(): 
     print k, v 

然後打印結果是「(bigrams),它的頻率」。這裏,我想要的是每個bigram對爲 ,以第一個出現的單字頻率除以二進制頻率。 (例如,如果有一個bigram('red','apple')並且其頻率爲「3」,那麼我想將它除以'red'的頻率)。 這是爲了獲得MLE概率,即「MLE概率=(w1,w2)/(w1)的計數」的計數。幫我PLZ ...

回答

0

您可以添加在for循環以下(打印後K,V):

number_unigrams = tokens.count(k[0]) 
prob = v/number_unigrams 

這應該給你的每個二元的MLE概率。

+0

非常感謝。我可以再問兩個問題......?(我希望這不是違反這個網站的規則..)(1)如何根據最高頻率對k,v值進行排序? (2)第二,我要總結整個v值來做bigram的whlole計數... –

+0

(1)要按頻率排序值,我不要不知道另一種解決方案,而是將所有頻率值複製到列表中並對其進行排序。你可以在你的循環中執行'freq_list.append(v)',然後調用'freq_list.sort()'。 (2)遍歷該列表並將值添加到sum變量(也可以在同一個循環中完成)。我不知道它是否違反規則,我自己也很新:D – divandc