这是我的代码:
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 :(得分: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)