import nltk
import random
from nltk.corpus import movie_reviews
documents=[(list(movie_reviews.words(fileid)),category)
for category in movie_reviews.categories()
for fileid in movie_reviews.fileids(category)]
random.shuffle(documents)
#print(documents[1])
all_words=[]
for w in movie_reviews.words():
all_words.append(w.lower())
all_words=nltk.FreqDist(all_words)
Word_features = list(all_words.keys())[:3000]
def find_features(document):
words = set(document)
features=[]
for w in Word_features:
features[w]= (w in words)
return features
print((find_features(movie_reviews.words('neg/cv000_29416.txt'))))
featuresets = [(find_features(rev), category) for (rev,category) in documents]
Après la course, je reçois l'erreur
features[w]= (w in words)
TypeError: list indices must be integers, not str
S'il vous plaît, aidez-moi à le résoudre ...
La seule modification à apporter est que features
doit être initialisé en dict
({}
) Plutôt qu'en list
([]
), puis vous pouvez remplir son contenu.
Le TypeError
était dû au fait que Word_features
Est une liste de chaînes que vous tentiez d'indexer à l'aide d'une liste et les listes ne peuvent pas avoir d'index de chaîne.
features={}
for w in Word_features:
features[w] = (w in words)
Ici, les éléments présents dans Word_features
Constituent le keys
du dictionnaire, features
contenant des valeurs booléennes, True
selon que le même élément apparaît dans words
(qui contient des éléments uniques en raison de l'appel de set()
) et False
pour la situation vice-versa.
Vous avez essayé d'indexer une liste features
avec une chaîne et ce n'est pas possible avec python. Les indices de liste ne peuvent être que des entiers. Vous avez besoin d'un dictionary
.
Essayez d'utiliser un defaultdict
ce qui signifie que même si une clé n'est pas trouvée dans le dictionnaire, au lieu qu'un KeyError
soit jeté, une nouvelle entrée est créée
from collections import defaultdict
features = defaultdict()
for w in Word_features:
features[w] = [w in words]