CountVectorizer花费的时间太长,无法进行fit_transform

问题描述 投票:0回答:1
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中的停用词。

注意:标记化功能可以很好地工作,可以将其单独用于任何文本输入。

谢谢

python machine-learning scikit-learn nlp nltk
1个回答
1
投票

我的第一个猜测是,函数stopwords.words()在每次调用时都会做一些繁重的工作。也许,您可以尝试将其缓存。 lemmatizer也是如此:只调用一次构造函数可以大大加快代码的速度。

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]
© www.soinside.com 2019 - 2024. All rights reserved.