2014-10-04 10 views
6

Programımı iyice belirledikten sonra, vektörleştirici tarafından yavaşlatıldığını saptadım.sklearn: Bir vektörleştirici nasıl hızlandırılır (örn. Tfidfvectorizer)

Metin verileri üzerinde çalışıyorum ve iki satırlık basit tfidf unigram vektörü, kodun yürütülmesi için gereken toplam sürenin% 99.2'sini alıyor. İşte

katedilebilen bir örnektir (bu, sizin diske bir 3mb eğitim dosyasını indirip kendi örnek üzerinde çalıştırmak için urllib parçaları ihmal edecek):

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

Bir np içine listesini X_train dönüştürme çalıştı. dizi ama performansta bir fark yoktu.

+0

Bunu http://codereview.stackexchange.com/ adresinde deneyebilirsiniz. – matsjoyce

cevap

10

Nitekim, NLTK yavaş olduğunu var:

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

Sen, örneğin PyStemmer Kartopu Stemmer bir akıllı uygulama kullanarak bu hızlandırabilir:

>>> 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 bir öğretim aracıdır . Tasarımla yavaş, çünkü okunabilirlik için optimize edildi.

+0

Bu Python 3.6 :(üzerinde değil – Hiding