web-dev-qa-db-fra.com

CountVectorizer: AttributeError: L'objet 'numpy.ndarray' n'a pas d'attribut 'inférieur'

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'
10
ashu

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())
13
Warren Weckesser

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.

7
ashu

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'>
0
Max Kleiner