2016-04-22 83 views
0

这里是我的代码:如何根据数值对MLE概率进行排序?

bigrams = tuple(nltk.bigrams(tokens)) 
bi_freq = nltk.FreqDist(bigrams) 
bigram_count = 0 
for k,v in sorted(bi_freq.items(), key = lambda (k, v) : (v, k), reverse = True): 
    number_unigrams = tokens.count(k[0]) 
    MLE_Prob = v/number_unigrams 
    bigram_count += v 
    print k, MLE_Prob 

但结果不按MLE_Prob值。这意味着,排序'v'的值是徒劳的(也许这是理所当然的事情)。 我想要的是,MLE_Prob应根据频率及其匹配的'k'值(即bigram)进行排列。

("red", "apple") 0.083222 
("brown", "apple") 0.073222 

这样这样。我不知道如何对这个结果应用排序功能。

回答

0

通常是很有帮助的数据放在正确的格式(得到你想要的列)为一步到位,然后打印出来作为一个单独的一步,而不是尝试将所有内容组合到一个循环中。

from __future__ import print_function 

bigrams = tuple(nltk.bigrams(tokens)) 
bi_freq = nltk.FreqDist(bigrams) 

# Calculate data here 
mle_probs = {k: v/tokens.count(k[0]) 
      for k, v in bi_freq.iteritems()} 
bigram_count = sum(bi_freq.itervalues()) 

# Then display it, sorted 
for k, v in sorted(mle_probl, key=lambda x: x[1], reverse=True): 
    print(k, v) 
+0

我得到一个属性错误,元组对象没有属性'iteritems':(,但appriciate你的建议。 –

+0

@YounginNa:这就是为什么你不应该复制代码...它可能有错误,我已经修复了错误,我想。 –

0

你只需要排序v而不是(v, k)

sorted(bi_freq.items(), key = lambda (k, v) : v, reverse = True) 
+0

按v排序并不会导致我想要的结果。 MLE_prob = v/number_unigrams。所以按v或k或(k,v)或(v,k)排序看起来不适合我想要的东西。我想排序概率本身。 –

相关问题