2017-10-13 1 views
0

sklearnでいくつかの文章を分類したいと思います。文章はパンダのデータフレームに保存されます。開始するに異なるフィーチャディメンションを持つFeatureUnion

、私は文の長さを使用したい、それが機能としてTF-IDFベクトルですので、私は、このパイプラインを作成しました:

LengthAnalyzerを持つカスタム TransformerMixinある
pipeline = Pipeline([ 
    ('features', FeatureUnion([ 
     ('meta', Pipeline([ 
      ('length', LengthAnalyzer()) 
     ])), 
     ('bag-of-words', Pipeline([ 
      ('tfidf', TfidfVectorizer()) 
     ])) 
    ])), 
    ('model', LogisticRegression()) 

def transform(self, documents): 
     for document in documents: 
      yield len(document) 

したがって、TfidfVectorizerがn次元のリストを返す間、LengthAnalyzerは数値(1次元)を返します。

私はこれを実行しようとすると、私はこの機能の組み合わせを動作させるために行われなければならない何

ValueError: blocks[0,:] has incompatible row dimensions. Got blocks[0,1].shape[0] == 494, expected 1. 

を取得しますか?

+0

1つの数値を2次元の形状の配列に変換します。[1,1] –

+1

np.array(len(document))と同じです。reshape(-1,1)?同じエラー – Mirco

答えて

1

問題は、transform()で使用されているyieldに由来するようです。たぶんyieldのためにscipy hstackメソッドに報告された行の数は、documentsの実際のサンプル数の代わりに1です。

TfidfVectorizerから正しいデータが494行(サンプル)あるはずですが、LengthAnalyzerは1行しか報告していません。したがって、エラー。

あなたは

return np.array([len(document) for document in documents]).reshape(-1,1)

にそれを変更することができた場合、パイプラインが正常に収まります。

注: scikit-learn githubに関連する問題を見つけようとしましたが、失敗しました。あなたはこの問題をそこに投稿して、実際の使用方法のフィードバックを得ることができます。

+0

は、魅力のように動作します、ありがとう! – Mirco

関連する問題