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]
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]