CountVectorizer 花费的时间太长 fit_transform

CountVectorizer takes too long to fit_transform

def tokenize(text):
    text = re.sub('[^a-zA-Z0-9]', ' ', text)
    words = word_tokenize(text)
    lemmatizer = WordNetLemmatizer()
    words = [lemmatizer.lemmatize(w.lower().strip()) for w in words if w not in stopwords.words()]
    return words

pipeline = Pipeline([
('vect', CountVectorizer(tokenizer=tokenize)),
#     ('tfidf', TfidfTransformer()),
#     ('clf', MultiOutputClassifier(RandomForestClassifier()))
])

鉴于上面的代码,CountVectorizer 需要很长时间(运行 60 分钟但它没有完成)来适应但是如果我删除行 if w not in stopwords.words() 它只需要 5 分钟来适应,什么可以是此代码的问题和可能的解决方案。我正在使用 nltk.corpus.

中的停用词

注意:tokenize 函数工作正常,单独用于任何文本输入。

谢谢

我的第一个猜测是 stopwords.words() 函数在每次调用时都做了一些繁重的工作。 也许,你可以尝试缓存它。词形还原器也是如此:只调用一次构造函数可以显着加快代码速度。

stop_set = set(stopwords.words())
lemmatizer = WordNetLemmatizer()

def tokenize(text):
    text = re.sub('[^a-zA-Z0-9]', ' ', text)
    words = word_tokenize(text)
    words = [lemmatizer.lemmatize(w.lower().strip()) for w in words if w not in stop_set]
    return words 

根据我的经验,它甚至可以帮助缓存词形还原函数,例如

from functools import lru_cache

stop_set = set(stopwords.words())
lemmatizer = WordNetLemmatizer()

@lru_cache(maxsize=10000)
def lemmatize(word):
    return lemmatizer.lemmatize(w.lower().strip())

def tokenize(text):
    text = re.sub('[^a-zA-Z0-9]+', ' ', text)
    words = [lemmatize(w) for w in word_tokenize(text)]
    return [w for w in words if w not in stop_set]