2017-07-19 5 views
2

ベクトラscikit-学ぶ私は、それがOKスタンドアロンで動作しますscikit-学ぶ彼らのexampleに基づくためスペイシーを使用してトークナイザ補題を書きました以下の通りです:スペイシーと

:私は、その後、 GridSearchCV実行をトークナイザのコンストラクタのスペイシー外をロードする際

from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.svm import SVC 
from sklearn.multiclass import OneVsRestClassifier 
from sklearn.pipeline import Pipeline 
from sklearn.grid_search import GridSearchCV 

wordvect = TfidfVectorizer(analyzer='word', strip_accents='ascii', tokenizer=LemmaTokenizer()) 
classifier = OneVsRestClassifier(SVC(kernel='linear')) 
pipeline = Pipeline([('vect', wordvect), ('classifier', classifier)]) 
parameters = {'vect__min_df': [1, 2], 'vect__max_df': [0.7, 0.8], 'classifier__estimator__C': [0.1, 1, 10]} 
gs_clf = GridSearchCV(pipeline, parameters, n_jobs=7, verbose=1) 

from sklearn.datasets import fetch_20newsgroups 
categories = ['comp.graphics', 'rec.sport.baseball'] 
newsgroups = fetch_20newsgroups(remove=('headers', 'footers', 'quotes'), shuffle=True, categories=categories) 
X = newsgroups.data 
y = newsgroups.target 
gs_clf = gs_clf.fit(X, y) 

### AttributeError: 'spacy.tokenizer.Tokenizer' object has no attribute '_prefix_re' 

エラーが表示されません。

  1. spacy.load('en')安全へのspacynlpオブジェクトです:

    しかし、これはGridSearchCVから私のn_jobsのすべてのは、アクセスして同じspacynlpオブジェクトを呼び出しますことを意味し、質問を残しており、これらのジョブの間で共有されますGridSearchCVの複数のジョブで使用されますか?

  2. これは、scikit-learnのトークナイザ内でspacyへの呼び出しを実装する正しい方法ですか?

答えて

3

グリッドの各パラメータ設定でSpacyを実行すると時間が無駄になります。メモリオーバーヘッドも重要です。すべてのデータをSpacyで一度実行してディスクに保存してから、事前に字形化されたデータを読み込む単純化されたベクトル化ツールを使用する必要があります。 tokenizeranalyserおよびpreprocessorのパラメータはTfidfVectorizerです。スタックオーバーフローにはカスタムベクタライザーを構築する方法を示す多くの例があります。

+0

これは良い点ですが、これは代わりにやるべきことかもしれません。しかし、私は最終的には、ハイパーパラメータグリッド検索の一部としてPOSCなどのさまざまなオプションでspaCyトークンを使用したいと思っています。 – tkja

+0

これも可能です。あなたのデータを '' {{"token": "cats"、 "lemma": "cat"}、{...}} 'のようなdictsのリストとして保存します。これは基本的にSpacyの文章をJSONに変換したものです。これを入力とし、トークンまたは補題のいずれかを出力するパラメータを持つパイプラインステップを作成します。トークン化はグリッド検索の一部です。 – mbatchkarov

関連する問題