[英]Efficient method to exclude items in one list from another list in Python
我有一个包含8000个字符串(stop_words)的列表,以及一个包含各种长度的100,000个字符串的列表,这些字符串运行到数百万个单词。 我正在使用该函数来标记100,000个字符串,并从列表stop_words中排除非字母数字标记和标记。
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个字符串上需要1秒钟
def tokenizer(text):
return [stemmer.stem(tok.lower()) for tok in nltk.word_tokenize(text)/
if tok.isalpha()]
我希望有一种更有效的方法可以从另一个列表中排除一个列表中的项目。
我很感激任何帮助或建议
谢谢
使stop_words
成为一组,以便查找为O(1)。
stop_words = set(('word1', 'word2', 'word3'))
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_tokenize
和stemmer.stem
local更快,您也可以获得一些速度:
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]
stem
和tokenize
的默认值在定义 tokenizer
函数时设置一次 。 在tokenizer
内部, stem
和tokenize
是局部变量。 通常这种微优化并不重要,但由于你将tokenizer
称为100K次,它可能对你有所帮助。
使用集:
{x for x in one_list} - other_list
但是它会删除重复和排序,所以如果重要,你需要别的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.