各要素に大きな文字列を含む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'
mealarray
の形状を確認してください。 fit_transform
の引数が文字列の配列である場合、それは1次元配列でなければなりません。 (つまり、mealarray.shape
は(n,)
の形式でなければなりません。)たとえば、mealarray
が(n, 1)
のような形状を持っている場合、「属性なし」エラーが発生します。
あなたは何かを試すことができます
data = vectorizer.fit_transform(mealarray.ravel())
私の質問に対する答えを得ました。基本的に、CountVectorizerはリスト(文字列の内容を含む)を配列ではなく引数として受け取ります。それで問題は解決しました。
より良い解決策は、明示的な呼び出し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'>
エラーは、バグを取り除くのに十分なはずです。データフレームまたはシリーズに非文字列型要素があるかどうかを確認してください。また、nan
値があるかどうかを具体的に確認してください。