2017-09-26 47 views
1

我有一個列表理解,一旦添加'not in stop'方法就不會排序。基本上,當我包含這個NLTK的停用詞時,我以前的排序功能已經失效。任何人都可以指出我做錯了什麼?排序的鍵值lambda無效

我現在已經在代碼中包含了所有內容以供參考。

編輯:

from nltk import word_tokenize 
from nltk.corpus import stopwords 
import string 

stop = stopwords.words('english') + list(string.punctuation) 
f = open('review_text_all.txt', encoding="utf-8") 
raw = f.read().lower().replace("'", "").replace("\\", "").replace(",", 
"").replace("\ufeff", "") 

tokens = nltk.word_tokenize(raw) 

bgs = nltk.bigrams(tokens) 

fdist = nltk.FreqDist(bgs) 
for (k,v) in sorted(fdist.items(), key=lambda x: (x[1] not in stop), 
reverse=True): 
    print(k,v) 

這裏是我的結果W/'不停止'

('or', 'irish') 3 
('put', 'one') 1 
('was', 'repealed') 1 
('please', '?') 6 
('contact', 'your') 2 
('wear', 'sweats') 1 

沒有 '不停止'

('white', 'people') 4362 
('.', 'i') 3734 
('in', 'the') 2880 
('of', 'the') 2634 
('to', 'be') 2217 
('all', 'white') 1778 

,你可以看到排序作品,但只有一次,我刪除'不停止'

+2

是什麼'fdist',什麼是你想要的有序輸出?包含最少的示例 –

+1

請發佈您的輸入和期望的輸出。 – Ajax1234

+0

要排序還是要過濾列表?因爲按照布爾條件進行排序幾乎肯定不會產生您期望的結果。 – Guillaume

回答

4

key參數the sorted method是一個函數,它可以讓你告訴python對哪個鍵(與列表項相關的屬性/值)進行排序。

在你的情況,你的函數會返回真或假....這是不是真的好值進行排序:)

編輯:

從我瞭解你想要什麼實現,您需要在排序之前(或之後)添加一個filter method,這將從列表中刪除您的「停用詞」列表中的項目。

事情是這樣的:

for (k,v) in sorted(filter(lambda x: (x[1] not in stop), fdist.items()), key=lambda x: x[1], reverse=True): 
    print(k,v) 
+0

它的工作,但不完全是我需要的方式。它按鍵排序,但實際上我需要從最高到最低排序值。 – M4cJunk13

+0

@ M4cJunk13我用(我認爲)正確的比較方法更新了我的答案(用單詞的幻數頻率表示) –

+0

完美,它工作!非常感謝。我仍然試圖更好地理解使用lambda表達式。 – M4cJunk13