首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sklearn:如何提高向量化器的速度(例如Tfidfvectorizer)

sklearn:如何提高向量化器的速度(例如Tfidfvectorizer)
EN

Stack Overflow用户
提问于 2014-10-05 02:12:35
回答 1查看 9.9K关注 0票数 10

在彻底分析了我的程序之后,我已经能够准确地指出它正在被向量化器减慢。

我正在处理文本数据,两行简单的tfidf单字向量化占用了代码执行总时间的99.2%。

以下是一个可运行的示例(这将下载一个3mb的训练文件到您的磁盘,省略urllib部分以在您自己的示例上运行):

代码语言:javascript
复制
#####################################
# Loading Data
#####################################
import urllib
from sklearn.feature_extraction.text import TfidfVectorizer
import nltk.stem  
raw = urllib.urlopen("https://s3.amazonaws.com/hr-testcases/597/assets/trainingdata.txt").read()
file = open("to_delete.txt","w").write(raw)
###
def extract_training():
    f = open("to_delete.txt")
    N = int(f.readline())
    X = []
    y = []
    for i in xrange(N):
        line  = f.readline()
        label,text =  int(line[0]), line[2:]
        X.append(text)
        y.append(label)
    return X,y
X_train, y_train =  extract_training()    
#############################################
# Extending Tfidf to have only stemmed features
#############################################
english_stemmer = nltk.stem.SnowballStemmer('english')

class StemmedTfidfVectorizer(TfidfVectorizer):
    def build_analyzer(self):
        analyzer = super(TfidfVectorizer, self).build_analyzer()
        return lambda doc: (english_stemmer.stem(w) for w in analyzer(doc))

tfidf = StemmedTfidfVectorizer(min_df=1, stop_words='english', analyzer='word', ngram_range=(1,1))
#############################################
# Line below takes 6-7 seconds on my machine
#############################################
Xv = tfidf.fit_transform(X_train) 

我尝试将列表X_train转换为np.array,但在性能上没有差别。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-06 17:04:19

不出所料,NLTK速度很慢:

代码语言:javascript
复制
>>> tfidf = StemmedTfidfVectorizer(min_df=1, stop_words='english', analyzer='word', ngram_range=(1,1))
>>> %timeit tfidf.fit_transform(X_train)
1 loops, best of 3: 4.89 s per loop
>>> tfidf = TfidfVectorizer(min_df=1, stop_words='english', analyzer='word', ngram_range=(1,1))
>>> %timeit tfidf.fit_transform(X_train)
1 loops, best of 3: 415 ms per loop

您可以通过使用雪球词干分析器的更智能的实现来加速这一过程,例如PyStemmer

代码语言:javascript
复制
>>> import Stemmer
>>> english_stemmer = Stemmer.Stemmer('en')
>>> class StemmedTfidfVectorizer(TfidfVectorizer):
...     def build_analyzer(self):
...         analyzer = super(TfidfVectorizer, self).build_analyzer()
...         return lambda doc: english_stemmer.stemWords(analyzer(doc))
...     
>>> tfidf = StemmedTfidfVectorizer(min_df=1, stop_words='english', analyzer='word', ngram_range=(1,1))
>>> %timeit tfidf.fit_transform(X_train)
1 loops, best of 3: 650 ms per loop

NLTK是一个教学工具包。它在设计上很慢,因为它针对可读性进行了优化。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26195699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档