1. ホーム
  2. python

[解決済み] AttributeError: low not found; scikit-learnのCountVectorizerでPipelineを使用する。

2022-02-07 10:26:54

質問

このようなコーパスを持っています。

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とGridSearchを使いたいと思います。

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 は、テキストを小文字に変換するために呼び出されたのでしょうか?スタックトレースを読んでもわからない)。私はPipelineの使い方を間違えているのでしょうか...それとも、本当に問題は CountVectorizer を単独で使用することはできますか?

何かアドバイスがあれば、ぜひお願いします。

解決方法は?

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

つまり、あなたのデータセットは次のようなものです。

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

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