2017-09-26 56 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