这是我的密码:
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就像这样。我不知道如何为这个结果应用排序函数。
发布于 2016-04-22 16:24:12
通常,将数据以正确的格式(获取所需的列)作为一步,然后作为一个单独的步骤打印出来,而不是尝试将所有数据合并到一个循环中是有帮助的。
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)发布于 2016-04-22 15:16:59
你只需要在v上排序而不是在(v, k)上排序
sorted(bi_freq.items(), key = lambda (k, v) : v, reverse = True)https://stackoverflow.com/questions/36797539
复制相似问题