2016-03-23 9 views
8

NLP'de sklearn ile boru hattım için stemming eklemeyi deniyorum.CountVectorizer (sklearn) 'ye kaynak desteği ekleyin

from nltk.stem.snowball import FrenchStemmer 

stop = stopwords.words('french') 
stemmer = FrenchStemmer() 


class StemmedCountVectorizer(CountVectorizer): 
    def __init__(self, stemmer): 
     super(StemmedCountVectorizer, self).__init__() 
     self.stemmer = stemmer 

    def build_analyzer(self): 
     analyzer = super(StemmedCountVectorizer, self).build_analyzer() 
     return lambda doc:(self.stemmer.stem(w) for w in analyzer(doc)) 

stem_vectorizer = StemmedCountVectorizer(stemmer) 
text_clf = Pipeline([('vect', stem_vectorizer), ('tfidf', TfidfTransformer()), ('clf', SVC(kernel='linear', C=1)) ]) 

Bu boru hattını skvearn CountVectorizer ile kullanırken çalışır. Ve eğer bunun gibi özellikleri elle oluşturursam da çalışır.

vectorizer = StemmedCountVectorizer(stemmer) 
vectorizer.fit_transform(X) 
tfidf_transformer = TfidfTransformer() 
X_tfidf = tfidf_transformer.fit_transform(X_counts) 

DÜZENLEME: Ben ipython Notebook bu boru hattını denerseniz

o [*] ve hiçbir şey olmuyor görüntüler. İşte

Eğer parametrelerden kaynaklanan kaldırırsanız

from sklearn.pipeline import Pipeline 
from sklearn import grid_search 
from sklearn.svm import SVC 
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer 
from nltk.stem.snowball import FrenchStemmer 

stemmer = FrenchStemmer() 
analyzer = CountVectorizer().build_analyzer() 

def stemming(doc): 
    return (stemmer.stem(w) for w in analyzer(doc)) 

X = ['le chat est beau', 'le ciel est nuageux', 'les gens sont gentils', 'Paris est magique', 'Marseille est tragique', 'JCVD est fou'] 
Y = [1,0,1,1,0,0] 

text_clf = Pipeline([('vect', CountVectorizer()), ('tfidf', TfidfTransformer()), ('clf', SVC())]) 
parameters = { 'vect__analyzer': ['word', stemming]} 

gs_clf = grid_search.GridSearchCV(text_clf, parameters, n_jobs=-1) 
gs_clf.fit(X, Y) 

aksi işliyor tam örnektir

Process PoolWorker-12: 
Traceback (most recent call last): 
    File "C:\Anaconda2\lib\multiprocessing\process.py", line 258, in _bootstrap 
    self.run() 
    File "C:\Anaconda2\lib\multiprocessing\process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Anaconda2\lib\multiprocessing\pool.py", line 102, in worker 
    task = get() 
    File "C:\Anaconda2\lib\site-packages\sklearn\externals\joblib\pool.py", line 360, in get 
    return recv() 
AttributeError: 'module' object has no attribute 'StemmedCountVectorizer' 

Örnek: Benim terminalde baktığımızda, bu hata veriyor çalışmıyor

UPDATE:

sorun n_jobs = -1 yok sorun çıkarırken, çünkü paralelleştirme sürecinde olduğu gibi.

def build_analyzer(self): 
    analyzer = super(CountVectorizer, self).build_analyzer() 
    return lambda doc:(stemmer.stem(w) for w in analyzer(doc)) 

ve __init__ yöntemini kaldırmak:

+0

bu bir sorun gibi görünüyor dekapaj ve unpickling kapsamı ile. Örneğin, içe aktarılmış bir modülde 'stemming 'yazarsanız, daha güvenilir bir şekilde çıkarılacaktır. – joeln

+0

Lütfen ne dediğinizi anlamak için bir örnek veya bir link verebilir misiniz? Bir ithal modülde 'stemming' nasıl yazılır? Çünkü paralelleştirme olmadan GridSearch, ayarlanacak birkaç parametreyle oldukça yavaştır. – dooms

+0

Değeri için tam bir örneğini sorun olmadan çalıştırabilirim. Ama kastettiğim kod, 'stemming' kodunu myutils.py 'ye taşımak ve' myutils import stemming 'sözcüğünü kullanmaktır. – joeln

cevap

1

Deneyebilirsin.

+0

O çalışmıyor (aynı hata vermek) ve sözcük kökü ayırıcı niteliği gerekiyor. – dooms

+0

Yazdırılan hata hakkında daha fazla bilgi verebilir misiniz? Örneğin hangi satır kırılır? Ben n_jobs bir GridSearch kullanıyorum – Till

+0

= -1 işi paralel hale. – dooms

14

Özel bir analizör sağlamak için olarak bir callable'ı CountVectorizer yapıcısına iletebilirsiniz. Bu benim için çalışıyor gibi görünüyor.

from sklearn.feature_extraction.text import CountVectorizer 
from nltk.stem.snowball import FrenchStemmer 

stemmer = FrenchStemmer() 
analyzer = CountVectorizer().build_analyzer() 

def stemmed_words(doc): 
    return (stemmer.stem(w) for w in analyzer(doc)) 

stem_vectorizer = CountVectorizer(analyzer=stemmed_words) 
print(stem_vectorizer.fit_transform(['Tu marches dans la rue'])) 
print(stem_vectorizer.get_feature_names()) 

Baskılar dışarı:

(0, 4) 1 
    (0, 2) 1 
    (0, 0) 1 
    (0, 1) 1 
    (0, 3) 1 
[u'dan', u'la', u'march', u'ru', u'tu'] 
+0

parametreler = { 'vect__analyzer': [ 'kelimesi, kaynaklanan]} gridsearch parametre olarak kullanarak hata verir: AttributeError: 'modülü' nesnesi özniteliği 'kaynaklanan' var – dooms

6

ben biraz geç benim Yanıt göndererek içindeyim biliyorum. Ama burada, birinin hala yardıma ihtiyacı varsa.

takiben en temiz yaklaşım Özgürce vectorizer_s nesnenin üzerinde CountVectorizer sınıfının fit ve transform işlevleri çağırabilir build_analyser()

from sklearn.feature_extraction.text import CountVectorizer 
import nltk.stem 

french_stemmer = nltk.stem.SnowballStemmer('french') 
class StemmedCountVectorizer(CountVectorizer): 
    def build_analyzer(self): 
     analyzer = super(StemmedCountVectorizer, self).build_analyzer() 
     return lambda doc: ([french_stemmer.stem(w) for w in analyzer(doc)]) 

vectorizer_s = StemmedCountVectorizer(min_df=3, analyzer="word", stop_words='french') 

geçersiz kılarak vectorizer saymak dil stemmer eklemektir