Tôi đang cố gắng thêm vào đường dẫn của tôi trong NLP với sklearn.thêm hỗ trợ gốc để 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)) ])
Khi sử dụng đường ống này với Bộ đếm ngược của sklearn hoạt động. Và nếu tôi tạo thủ công các tính năng như thế này thì nó cũng hoạt động.
vectorizer = StemmedCountVectorizer(stemmer)
vectorizer.fit_transform(X)
tfidf_transformer = TfidfTransformer()
X_tfidf = tfidf_transformer.fit_transform(X_counts)
EDIT:
Nếu tôi cố đường ống này trên Notebook IPython của tôi nó sẽ hiển thị [*] và không có gì xảy ra. Khi tôi nhìn vào thiết bị đầu cuối của tôi, nó mang lại cho lỗi này:
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'
Ví dụ
Dưới đây là ví dụ hoàn chỉnh
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)
Nếu bạn loại bỏ bắt nguồn từ các thông số nó hoạt động nếu không nó không hoạt động.
CẬP NHẬT:
Vấn đề có vẻ là trong quá trình song song bởi vì khi tháo n_jobs = -1 vấn đề biến mất.
điều này dường như là một vấn đề với dưa chuột và lột xác. nếu bạn đặt 'stemming' trong mô-đun được nhập, ví dụ, nó sẽ được giải thích một cách đáng tin cậy hơn. – joeln
Bạn có thể vui lòng cung cấp một ví dụ hoặc một liên kết để hiểu những gì bạn đã nói không? Làm thế nào để đặt 'bắt nguồn' trong mô-đun đã nhập? Bởi vì không có sự song song, GridSearch khá chậm với một vài tham số để điều chỉnh. – dooms
Đối với những gì nó có giá trị, tôi có thể chạy ví dụ hoàn chỉnh của bạn mà không có một vấn đề. Nhưng những gì tôi có nghĩa là để di chuyển mã cho 'stemming' thành' myutils.py' chẳng hạn, và sử dụng 'từ myutils import stemming'. – joeln