CountVectorizer:AttributeError:' numpy.ndarray'对象没有属性' lower'

时间:2014-10-14 17:48:39

标签: python numpy scikit-learn text-classification

我有一个一维数组,每个元素都有大字符串。我正在尝试使用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'

4 个答案:

答案 0 :(得分:13)

检查mealarray的形状。如果fit_transform的参数是一个字符串数组,则它必须是一维数组。 (也就是说,mealarray.shape必须采用(n,)形式。)例如,您将获得&#34; no属性&#34;如果mealarray的形状为(n, 1),则会出错。

您可以尝试类似

的内容
data = vectorizer.fit_transform(mealarray.ravel())

答案 1 :(得分:7)

得到了我的问题的答案。 基本上,CountVectorizer将列表(带有字符串内容)作为参数而不是数组。这解决了我的问题。

答案 2 :(得分:0)

更好的解决方案是显式调用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'>

答案 3 :(得分:0)

该错误应足以消除该错误。检查您的数据框或系列是否具有非字符串类型的元素。另外,请特别检查是否有任何nan值。