J'ai un tableau unidimensionnel avec de grandes chaînes dans chacun des éléments. J'essaie d'utiliser un CountVectorizer
pour convertir les données de texte en vecteurs numériques. Cependant, j'obtiens une erreur en disant:
AttributeError: 'numpy.ndarray' object has no attribute 'lower'
mealarray
contient de grandes chaînes dans chacun des éléments. Il y a 5000 de tels échantillons. J'essaie de vectoriser ceci comme indiqué ci-dessous:
vectorizer = CountVectorizer(
stop_words='english',
ngram_range=(1, 1), #ngram_range=(1, 1) is the default
dtype='double',
)
data = vectorizer.fit_transform(mealarray)
Le stacktrace complet:
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'
Vérifiez la forme de mealarray
. Si l'argument de fit_transform
est un tableau de chaînes, il doit s'agir d'un tableau unidimensionnel. (C'est-à-dire que mealarray.shape
doit être de la forme (n,)
.) Par exemple, vous obtiendrez l'erreur "pas d'attribut" si mealarray
a une forme telle que (n, 1)
.
Vous pouvez essayer quelque chose comme
data = vectorizer.fit_transform(mealarray.ravel())
J'ai eu la réponse à ma question. En gros, CountVectorizer prend des listes (avec le contenu d'une chaîne) sous forme d'argument plutôt que de tableau. Cela a résolu mon problème.
Une meilleure solution consiste à appeler explicitement la série pandas et à la passer à CountVectorizer ():
>>> tex = df4['Text']
>>> type(tex)
<class 'pandas.core.series.Series'>
X_train_counts = count_vect.fit_transform(tex)
La prochaine ne fonctionnera pas, parce que c'est un cadre et NON en série
>>> tex2 = (df4.ix[0:,[11]])
>>> type(tex2)
<class 'pandas.core.frame.DataFrame'>