sklearn: Как ускорить векторизатор (например, Tfidfvectorizer)

После тщательного профилирования моей программы я смог определить, что она замедляется векторизатором.

Я работаю с текстовыми данными, и две строчки простой векторизации tfidf unigram занимают 99,2% от общего времени, которое требуется для выполнения кода.

Вот исполняемый пример (он загрузит 3-мегабайтный обучающий файл на ваш диск, пропустите части urllib для запуска на собственном примере):

#####################################
# 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, но не было никакой разницы в производительности.

Ответы на вопрос(1)

Ваш ответ на вопрос