如何根据值对MLE概率进行排序?

时间:2016-04-22 15:14:51

标签: python

这是我的代码:

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
像这样。我不知道如何为这个结果应用排序功能。

2 个答案:

答案 0 :(得分:0)

您只需要对v进行排序,而不是(v, k)

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

答案 1 :(得分: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)