sklearn: So beschleunigen Sie einen Vektorisierer (z. B. Tfidfvectorizer)

achdem ich mein Programm gründlich analysiert habe, konnte ich feststellen, dass es vom Vectorizer verlangsamt wir

Ich arbeite an Textdaten, und zwei Zeilen der einfachen tfidf-Unigramm-Vektorisierung beanspruchen 99,2% der Gesamtzeit, die der Code für die Ausführung benötigt.

Hier ist ein ausführbares Beispiel (dies lädt eine 3-MB-Trainingsdatei auf Ihre Festplatte herunter; lassen Sie die urllib-Teile weg, um sie in Ihrem eigenen Beispiel auszuführen):

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

Ich habe versucht, die Liste zu konvertierenX_train in ein np.array aber es gab keinen Unterschied in der Leistung.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage