Ich versuche stemming zu meiner Pipeline in NLP mit sklearn hinzuzufügen.hinzufügen Stemming-Unterstützung zu CountVectorizer (sklearn)
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)) ])
Wenn Sie diese Pipeline mit dem CountVectorizer von sklearn verwenden, funktioniert es. Und wenn ich die Funktionen manuell erstelle, funktioniert das auch.
vectorizer = StemmedCountVectorizer(stemmer)
vectorizer.fit_transform(X)
tfidf_transformer = TfidfTransformer()
X_tfidf = tfidf_transformer.fit_transform(X_counts)
EDIT:
Wenn ich diese Pipeline auf meinem IPython Notebook versuchen zeigt es die [*] und nichts passiert. Als ich in meinem Terminal aussehen, gibt es diesen Fehler:
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'
Beispiel
Dies ist die komplette Beispiel
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)
Wenn Sie aus den Parametern ergeben entfernen funktioniert es sonst funktioniert nicht.
UPDATE:
Das Problem scheint in der Parallelisierung Prozess zu sein, weil, wenn n_jobs Entfernen = -1 das Problem verschwinden.
dies scheint ein Problem zu sein mit Beizen und Entkeimen. Wenn Sie zum Beispiel 'stemming' in ein importiertes Modul einfügen, wird es zuverlässiger unpickled. – joeln
Könnten Sie bitte ein Beispiel oder einen Link angeben, um zu verstehen, was Sie gesagt haben? Wie wird 'stemming' in ein importiertes Modul eingefügt? Denn ohne die Parallelisierung ist die GridSearch ziemlich langsam mit einigen Parametern zu tunen. – dooms
Für was es wert ist, kann ich Ihr komplettes Beispiel ohne Problem ausführen. Aber was ich meinte ist, den Code für 'stemming' zum Beispiel in' myutils.py' zu verschieben und 'from myutils import stemming' zu verwenden. – joeln