web-dev-qa-db-ja.com

CountVectorizer:AttributeError: 'numpy.ndarray' object has no attribute 'lower'

各要素に大きな文字列を含む1次元配列があります。テキストデータを数値ベクトルに変換するためにCountVectorizerを使用しようとしています。ただし、次のエラーが表示されます。

AttributeError: 'numpy.ndarray' object has no attribute 'lower'

mealarrayには、各要素に大きな文字列が含まれています。そのようなサンプルは5000個あります。以下に示すようにこれをベクトル化しようとしています:

vectorizer = CountVectorizer(
    stop_words='english',
    ngram_range=(1, 1),  #ngram_range=(1, 1) is the default
    dtype='double',
)
data = vectorizer.fit_transform(mealarray)

完全なスタックトレース:

File "/Library/Python/2.7/site-packages/sklearn/feature_extraction/text.py", line 817, in fit_transform
    self.fixed_vocabulary_)
  File "/Library/Python/2.7/site-packages/sklearn/feature_extraction/text.py", line 748, in _count_vocab
    for feature in analyze(doc):
  File "/Library/Python/2.7/site-packages/sklearn/feature_extraction/text.py", line 234, in <lambda>
    tokenize(preprocess(self.decode(doc))), stop_words)
  File "/Library/Python/2.7/site-packages/sklearn/feature_extraction/text.py", line 200, in <lambda>
    return lambda x: strip_accents(x.lower())
AttributeError: 'numpy.ndarray' object has no attribute 'lower'
11
ashu

mealarrayの形状を確認してください。 fit_transform の引数が文字列の配列である場合、それは1次元配列でなければなりません。 (つまり、mealarray.shape(n,)の形式でなければなりません。)たとえば、mealarray(n, 1)のような形状を持っている場合、「属性なし」エラーが発生します。

あなたは何かを試すことができます

data = vectorizer.fit_transform(mealarray.ravel())
15

私の質問に対する答えを得ました。基本的に、CountVectorizerはリスト(文字列の内容を含む)を配列ではなく引数として受け取ります。それで問題は解決しました。

7
ashu

より良い解決策は、明示的な呼び出しpandas seriesで、それにCountVectorizer()を渡すことです。

>>> tex = df4['Text']
>>> type(tex)
<class 'pandas.core.series.Series'>
X_train_counts = count_vect.fit_transform(tex)

次は機能せず、フレームではなくシリーズです

>>> tex2 = (df4.ix[0:,[11]])
>>> type(tex2)
<class 'pandas.core.frame.DataFrame'>
1
Max Kleiner

エラーは、バグを取り除くのに十分なはずです。データフレームまたはシリーズに非文字列型要素があるかどうかを確認してください。また、nan値があるかどうかを具体的に確認してください。

0
Rohith.