我有一个包含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()]
我希望有一种更有效的方法可以从另一个列表中排除一个列表中的项目。
我很感激任何帮助或建议
由于
答案 0 :(得分:5)
使stop_words
成为一组,以便查找为O(1)。
stop_words = set(('word1', 'word2', 'word3'))
答案 1 :(得分: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_tokenize
和stemmer.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]
stem
和tokenize
的默认值在tokenizer
函数定义时设置为一次。在tokenizer
内,stem
和tokenize
是局部变量。通常这种微优化并不重要,但是因为你打电话tokenizer
100K次,它可能对你有所帮助。
答案 2 :(得分:0)
使用套装:
{x for x in one_list} - other_list
然而,它会删除重复和排序,所以如果重要,你需要别的东西。