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