2016-04-22 125 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)排序看起來不適合我想要的東西。我想排序概率本身。 –

相關問題