首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据值对MLE概率进行排序?

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

Stack Overflow用户
提问于 2016-04-22 15:14:51
回答 2查看 157关注 0票数 1

这是我的密码:

代码语言:javascript
复制
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)来排列。

代码语言:javascript
复制
("red", "apple") 0.083222
("brown", "apple") 0.073222

就像这样。我不知道如何为这个结果应用排序函数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-22 16:24:12

通常,将数据以正确的格式(获取所需的列)作为一步,然后作为一个单独的步骤打印出来,而不是尝试将所有数据合并到一个循环中是有帮助的。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-04-22 15:16:59

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

代码语言:javascript
复制
sorted(bi_freq.items(), key = lambda (k, v) : v, reverse = True)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36797539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档