2013-01-12 43 views
3

我有一个包含8000个字符串(stop_words)的列表以及一串由数百万个单词组成的各种长度的100,000个字符串。我正在使用该函数标记100,000字符串,并从列表stop_words中排除非字母数字标记和标记。从Python中的另一个列表中排除一个列表中的项目的有效方法

def tokenizer(text): 

     return [stemmer.stem(tok.lower()) for tok in nltk.word_tokenize(text)/ 
     if tok.isalpha() and tok.lower() not in stop_words] 

我已经使用600个字符串测试了这段代码,它需要60秒。如果我删除的条件,排除禁用词它将采用相同的600串

def tokenizer(text): 

     return [stemmer.stem(tok.lower()) for tok in nltk.word_tokenize(text)/ 
     if tok.isalpha()] 

我希望有排除从其他列表中的一个列表中找到的项目进行更有效的方式1秒。

我很感激任何帮助或建议

感谢

+0

尝试'设置'排除类似的项目。 'set(list1).difference(list2)'[see](http://docs.python.org/2/library/sets.html) – Developer

回答

3
  • stop_words一组,由于checking membership in a set是O(1), 而在列表中检查成员为O(N)。
  • 致电lower()text(一次)而不是lower()每个 令牌两次。

stop_words = set(stop_words) 
def tokenizer(text): 
    return [stemmer.stem(tok) for tok in nltk.word_tokenize(text.lower()) 
      if tok.isalpha() and tok not in stop_words] 

由于访问本地变量是不是找了合格的名称更快,你也可以通过使nltk.word_tokenizestemmer.stem地方获得一点速度:

stop_words = set(stop_words) 
def tokenizer(text, stem = stemmer.stem, tokenize = nltk.word_tokenize): 
    return [stem(tok) for tok in tokenize(text.lower()) 
      if tok.isalpha() and tok not in stop_words] 

stemtokenize的默认值设置为一次当时tokenizer功能是定义为。在tokenizer内,stemtokenize是局部变量。通常这种微型优化并不重要,但由于您要求100K次,所以它可能会对您有所帮助。

+0

谢谢,这在我的测试中再次获得了第二名。 – bradj

5

stop_words一组,这样查找是O(1)替代。

stop_words = set(('word1', 'word2', 'word3')) 
+0

谢谢 - 这是一个更快的方法 – bradj

0

使用装置:

{x for x in one_list} - other_list 

但是它消除重复和排序,所以如果它的事项,你需要别的东西。

+0

谢谢,虽然在这种情况下,我确实需要保持谦虚态度 – bradj

相关问题