第一个问题,对不起,如果我搞砸了。
我正在进行一个分类项目,其中涉及90个标签以上的1600个独特的文本文档。这些文档中有许多是研究论文,因此您可以想象该功能集非常大 - 超过一百万。
我的问题是矢量化正在永远。我知道鉴于我的数据,这不会很快,但是它花费的时间变得不切实际。我从这个问题的第一个答案中接受了建议,但它似乎没有帮助 - 我想象了答案者建议已经纳入Scikit -Learn的优化。
这是我的代码,使用调整后的词干矢量函数:
%%timeit
vect = StemmedCountVectorizer(min_df=3, max_df=0.7, max_features=200000, tokenizer=tokenize,
strip_accents='unicode', analyzer='word', token_pattern=r'w{1,}',
ngram_range=(1, 3), stop_words='english')
vect.fit(list(xtrain) + list(xvalid))
xtrain_cv = vect.transform(xtrain)
xvalid_cv = vect.transform(xvalid)
Tokenizer参考此功能:
stemmer = SnowballStemmer('english')
def stem_tokens(tokens, stemmer):
stemmed = []
for item in tokens:
stemmed.append(stemmer.stem(item))
return stemmed
def tokenize(text):
tokens = nltk.word_tokenize(text)
tokens = [i for i in tokens if i not in string.punctuation]
tokens = [i for i in tokens if all(j.isalpha() or j in string.punctuation for j in i)]
tokens = [i for i in tokens if '/' not in i]
stems = stem_tokens(tokens, stemmer)
return stems
%%timeit
报告:
24min 16s ± 28.2 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
有什么显然会让我放慢的东西吗?任何明显的低效率都将很高兴知道。我正在考虑将我的n-gram范围减少到(1,2),因为我认为我没有太多有用的3-gra功能,但是除此之外,我不确定该怎么办。
1600文本文档并不那么大,因此应该更快。一些建议:
1)要介绍您的代码,请使用CPROFILE和PTAT。您会看到哪些确切的步骤很慢。
2)n-gram具有巨大的复杂性。Bi-gram通常可以,二元格开始非常繁琐。使用"智能"解决方案。为什么不给Gensim语言器?
3)使用 in
操作员在列表方面做得不好(因为它测试了列表的每个元素),但与集合(因为基础哈希函数)非常有用。您应该将字符串(例如string.punctuation
)视为列表。只需将其转换为一组即可。
4)如果可以的话,将tokenize
功能(token
上的多个循环)分解。
5)如果它不够快,请使用多线程。