2016-03-23 27 views
8

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.

+0

đ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

+0

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

+0

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

Trả lời

1

Bạn có thể thử:

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

và loại bỏ các phương pháp __init__.

+0

Nó không hoạt động (cung cấp cho cùng một lỗi) và tôi cần thuộc tính gốc. – dooms

+0

Bạn có thể cung cấp thêm thông tin về lỗi được in không? Ví dụ: ngắt dòng nào? – Till

+0

Tôi đang sử dụng GridSearch với n_jobs = -1 để song song công việc. – dooms

14

Bạn có thể chuyển số có thể gọi là analyzer tới hàm tạo CountVectorizer để cung cấp trình phân tích tùy chỉnh. Điều này dường như làm việc cho tôi.

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

In ra:

(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

= {'vect__analyzer': ['word', bắt nguồn]} Sử dụng tham số này để tìm kiếm lỗi cung cấp lỗi: AttributeError: đối tượng 'module' không có thuộc tính 'bắt nguồn' – dooms

6

Tôi biết tôi là hơi muộn trong đăng câu trả lời của tôi. Nhưng ở đây, trong trường hợp ai đó vẫn cần được giúp đỡ.

Tiếp theo là phương pháp sạch để thêm Stemmer ngôn ngữ để đếm vectorizer bằng cách ghi đè 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') 

Bạn có thể thoải mái gọi fittransform chức năng của lớp CountVectorizer trên đối tượng vectorizer_s bạn

Các vấn đề liên quan