2014-10-04 7 views
6

मेरे प्रोग्राम को पूरी तरह से प्रोफाइल करने के बाद, मैं यह निर्धारित करने में सक्षम हूं कि यह वेक्टरिज़र द्वारा धीमा हो रहा है।sklearn: एक वेक्टरिज़र को गति देने के लिए कैसे करें (उदाहरण के लिए Tfidfvectorizer)

मैं टेक्स्ट डेटा पर काम कर रहा हूं, और सरल टीएफआईडीएफ यूनिग्राम वेक्टरलाइजेशन की दो पंक्तियां कोड को निष्पादित करने के कुल समय का 99.2% ले रही हैं।

यहाँ एक runnable उदाहरण है (यह अपने डिस्क के लिए एक 3mb प्रशिक्षण फ़ाइल डाउनलोड करेगा अपना खुद का नमूना पर चलने के लिए 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 परिवर्तित करने की कोशिश की। सरणी लेकिन प्रदर्शन में कोई अंतर नहीं था।

+0

आप इसे http://codereview.stackexchange.com/ पर आजमा सकते हैं। – matsjoyce

उत्तर

10

हैरानगी, यह NLTK धीमी गति से किया जाता है कि क्या है:

>>> 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 का उपयोग कर, जैसे, द्वारा इस तेजी लाने के कर सकते हैं:

>>> 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 एक शिक्षण टूलकिट है । यह डिजाइन द्वारा धीमा है, क्योंकि इसे पठनीयता के लिए अनुकूलित किया गया है।

+0

यह पायथन 3.6 पर नहीं है :( – Hiding

संबंधित मुद्दे