sklearn: Cómo acelerar un vectorizador (por ejemplo, Tfidfvectorizer)

Después de realizar un perfil completo de mi programa, he podido señalar que el vectorizador lo está ralentizando.

Estoy trabajando en datos de texto, y dos líneas de vectorización tfidf unigram simple ocupan el 99.2% del tiempo total que tarda el código en ejecutarse.

Aquí hay un ejemplo ejecutable (esto descargará un archivo de entrenamiento de 3mb en su disco, omita las partes de urllib para ejecutar en su propia muestra):

#####################################
# 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) 

Traté de convertir la listaX_train en una matriz np. pero no hubo diferencia en el rendimiento.

Respuestas a la pregunta(1)

Su respuesta a la pregunta