2016-04-22 50 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