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.