CountVectorizer: AttributeError: объект 'numpy.ndarray' не имеет атрибута 'lower'
У меня есть одномерный массив с большими строками в каждом из элементов. Я пытаюсь использовать 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'
Ответы
Ответ 1
Проверьте форму mealarray
. Если аргумент fit_transform
является массивом строк, он должен быть одномерным. (То есть, mealarray.shape
должен иметь вид (n,)
.) Например, вы получите ошибку "no attribute", если mealarray
имеет такую форму, как (n, 1)
.
Вы можете попробовать что-то вроде
data = vectorizer.fit_transform(mealarray.ravel())
Ответ 2
Получил ответ на мой вопрос.
В принципе, CountVectorizer принимает списки (со строковым содержимым) как аргумент, а не массив. Это решило мою проблему.
Ответ 3
Лучшим решением является явный вызов серии pandas и передача ей 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'>
Ответ 4
Ошибка должна быть достаточной, чтобы избавиться от ошибки. Проверьте, есть ли у вашего dataframe или серии элемент не строкового типа. Кроме того, обязательно проверьте, есть ли какие-либо значения nan
.