web-dev-qa-db-fra.com

TypeError: les indices de liste doivent être des entiers, pas str (conversion booléenne en fait)

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 ...

5
RokiDGupta

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.

9
Nickil Maveli

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]
5
Raja Sattiraju