web-dev-qa-db-fra.com

AttributeError: l'objet 'list' n'a pas d'attribut 'copy'

J'ai l'extrait de code suivant

classifier = NaiveBayesClassifier.train(train_data)
#classifier.show_most_informative_features(n=20)
results = classifier.classify(test_data)

et l'erreur apparaît dans la ligne suivante

results = classifier.classify(test_data)

erreur:

Traceback (most recent call last):
  File "trial_trial.py", line 46, in <module>
    results = classifier.classify(test_data)
  File "c:\Users\Amr\Anaconda\lib\site-packages\nltk\classify\naivebayes.py", line 88, in classify
    return self.prob_classify(featureset).max()
  File "c:\Users\Amr\Anaconda\lib\site-packages\nltk\classify\naivebayes.py", line 94, in prob_classify
    featureset = featureset.copy()
AttributeError: 'list' object has no attribute 'copy'

Je pense à étendre la liste des classes de base en python et ajouter une fonction de copie mais je ne suis pas expert en python et je ne sais pas comment résoudre ce problème .

10
Amr Ragab

Les classificateurs NLTK fonctionnent avec ensembles de fonctionnalités; ceux-ci sont toujours donnés sous forme de dictionnaires avec des noms d'entités mappés à une valeur. Vous passez plutôt une liste, donc vous ne produisez pas de fonctionnalités selon la documentation NLTK. Le code attend simplement un dictionnaire Python et les dictionnaires Python ont une méthode .copy()).

Voir le chapitre du didacticiel NLTK sur Apprendre à classer le texte :

Le dictionnaire renvoyé, connu sous le nom de ensemble de fonctionnalités , mappe les noms des fonctionnalités à leurs valeurs. Les noms de fonctionnalité sont des chaînes sensibles à la casse qui fournissent généralement une brève description lisible par l'homme de la fonctionnalité, comme dans l'exemple 'last_letter'. Les valeurs d'entité sont des valeurs de types simples, telles que des booléens, des nombres et des chaînes.

Voir également la section Featuresets de la documentation de l'API NLTK Classify :

Les entités décrivant un jeton sont encodées à l'aide d'un "ensemble de fonctionnalités", qui est un dictionnaire qui mappe de "noms d'entités" à "valeurs d'entités". Les noms de fonctionnalité sont des chaînes uniques qui indiquent quel aspect du jeton est codé par la fonctionnalité.

Vous n'avez pas partagé le type d'objets que contient la liste train_data; s'il s'agit de dictionnaires feature set, vous souhaitez utiliser classify_many() à la place:

results = classifier.classify_many(test_data)

Cette méthode le fait prend une liste, mais chaque élément doit toujours être un ensemble de fonctionnalités valide.

2
Martijn Pieters

La méthode list.copy ne fonctionne pas à la fois dans python 2.x et python 3.x, je me demande pourquoi elle est toujours dans la documentation. Pour atteindre les résultats de la copie d'une liste, utilisez le mot-clé de la liste:

fruits = ['banana', 'cucumber', 'Apple', 'water mellon']
my_fruits = list(fruits)

En option, vous pouvez copier une liste en la découpant:

my_fruits_copy = fruits[:]
28
Shemogumbe