web-dev-qa-db-ja.com

AttributeError:下位が見つかりません。 scikit-learnでCountVectorizerでパイプラインを使用する

私はそのようなコーパスを持っています:

_X_train = [ ['this is an dummy example'] 
      ['in reality this line is very long']
      ...
      ['here is a last text in the training set']
    ]
_

およびいくつかのラベル:

_y_train = [1, 5, ... , 3]
_

パイプラインとグリッド検索を次のように使用したいと思います。

_pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
    ('reg', SGDRegressor())
])


parameters = {
    'vect__max_df': (0.5, 0.75, 1.0),
    'tfidf__use_idf': (True, False),
    'reg__alpha': (0.00001, 0.000001),
}

grid_search = GridSearchCV(pipeline, parameters, n_jobs=1, verbose=1)

grid_search.fit(X_train, y_train)
_

これを実行すると、_AttributeError: lower not found_というエラーが表示されます。

このエラーに関する質問を検索して見つけました ここ 、テキストがトークン化されていないことに問題があると思いました(使用していたので、頭の爪に当たったように聞こえました)入力データとしてのリストのリスト。各リストには1つの途切れのない文字列が含まれていました)。

私はこの理論をテストするために素早く汚いトークナイザーを作り上げました:

_def my_tokenizer(X):
    newlist = []
    for alist in X:
        newlist.append(alist[0].split(' '))
    return newlist
_

これは想定されていることを実行しますが、CountVectorizerの引数で使用すると:

_pipeline = Pipeline([
    ('vect', CountVectorizer(tokenizer=my_tokenizer)),
_

...何も起こらなかった場合と同じエラーが発生します。

パイプラインのCountVectorizerをコメントアウトすることで、エラーを回避できることに気づきました。これは奇妙なことです...最初に変換するデータ構造がなければ、TfidfTransformer()を使用できるとは思いませんでした...この場合はカウントのマトリックスです。

なぜこのエラーが発生し続けるのですか?実際、このエラーが何を意味するのかを知っておくといいでしょう! (テキストを小文字などに変換するためにlowerが呼び出されましたか?スタックトレースを読み取ってもわかりません)。私はパイプラインを誤用していますか...それとも、問題は本当にCountVectorizerだけの引数の問題ですか?

アドバイスをいただければ幸いです。

8
Matt O'Brien

データセットの形式が間違っているため、 "str、unicode、またはfileオブジェクトのいずれかを生成するイテラブル" をCountVectorizerのfit関数に渡す必要があります(またはパイプラインに渡す必要はありません)。 (コードのように)テキストを含む他の反復可能オブジェクトに対して反復可能ではありません。あなたの場合、リストは反復可能であり、メンバーが文字列であるフラットリストを渡す必要があります(別のリストではありません)。

つまり、データセットは次のようになります。

X_train = ['this is an dummy example',
      'in reality this line is very long',
      ...
      'here is a last text in the training set'
    ]

この例を見てください。非常に便利です。 テキスト特徴の抽出と評価のためのサンプルパイプライン

6
Ibraim Ganiev