加快sklearn中的矢量化

时间:2017-11-22 14:39:45

标签: python machine-learning scikit-learn

第一个问题,抱歉,如果我搞砸了。

我正在进行一项涉及超过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特征,但除此之外我还没有确定还有什么可做的。

1 个答案:

答案 0 :(得分:0)

1600文本文档并不是那么大,所以它应该快得多。有人建议:

1)要对您的代码进行分析,请使用cProfile and ptats。您将看到哪些确切的步骤很慢。

2)n-gram具有巨大的复杂性。双克通常都没问题,三克开始非常麻烦。使用更智能的"解。为什么不是gensim phraser

3)使用in运算符并不能很好地处理列表(因为它测试列表的每个元素),但是对集合很好(因为底层的哈希函数)。您应该将字符串(如string.punctuation)视为列表。只需将其转换为一组。

4)如果可以的话,将你的tokenize函数(token上的多个循环)分解。

5)如果速度不够快,请使用多线程。