第一个问题,抱歉,如果我搞砸了。
我正在进行一项涉及超过90个标签的1600个独特文本文档的分类项目。其中许多文档都是研究论文,因此您可以想象这个功能集非常庞大 - 超过一百万。
我的问题是矢量化正在永远。我知道,根据我的数据,它不会很快,但是花费的时间变得不切实际。我从this question的第一个答案中得到了建议,而且它似乎没有帮助 - 我想象回答者建议的优化已经被纳入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-gram特征,但除此之外我还没有确定还有什么可做的。
答案 0 :(得分:0)
1600文本文档并不是那么大,所以它应该快得多。有人建议:
1)要对您的代码进行分析,请使用cProfile and ptats。您将看到哪些确切的步骤很慢。
2)n-gram具有巨大的复杂性。双克通常都没问题,三克开始非常麻烦。使用更智能的"解。为什么不是gensim phraser? 3)使用in
运算符并不能很好地处理列表(因为它测试列表的每个元素),但是对集合很好(因为底层的哈希函数)。您应该将字符串(如string.punctuation
)视为列表。只需将其转换为一组。
4)如果可以的话,将你的tokenize
函数(token
上的多个循环)分解。
5)如果速度不够快,请使用多线程。