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中的停用词。
注意:标记化功能可以很好地工作,可以将其单独用于任何文本输入。
谢谢
我的第一个猜测是,函数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]