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]
După rulare, primesc eroarea
features[w]= (w in words)
TypeError: list indices must be integers, not str
Vă rog să mă ajutați să o rezolv…
Singura modificare care trebuie făcută este că features
trebuie să fie inițializat la un dict
({}
) în loc de un list
([]
), iar apoi se va putea completa conținutul său.
Adresa TypeError
a fost pentru că word_features
este o listă de șiruri de caractere pe care ați încercat să le indexați folosind o listă, iar listele nu pot avea indici de șiruri de caractere.
features={}
for w in word_features:
features[w] = (w in words)
Aici, elementele prezente în word_features
constituie keys
de dicționar, features
care conțin valori booleene, True
în funcție de faptul că același element apare sau nu în words
(care deține elemente unice datorită apelării lui set()
) și False
pentru situația inversă.
- Chiar ar trebui să adăugați de ce, modificarea este atât de minimalistă, încât nimeni nu o va vedea, dacă nu este deja conștient de eroare. Așa că mai bine adăugați un text descriptiv. – > .
- @ Wolf: Este greșeala mea. Am fost puțin grăbit și, prin urmare, nu am putut oferi explicația necesară. – > .
- Subliniați
dict
șilist
, , dar acest lucru nu este automat sinonim cu{}
și[]
pentru utilizatorii care nu cunosc python… – > .
Ați încercat să indexați o listă features
cu un șir de caractere și acest lucru nu este posibil cu python. Indicii listelor pot fi doar numere întregi. Ceea ce aveți nevoie este un dictionary
.
Încercați să utilizați un defaultdict
ceea ce înseamnă că, chiar dacă o cheie nu se găsește în dicționar, în loc de un KeyError
este aruncat, se creează o nouă intrare
from collections import defaultdict
features = defaultdict()
for w in word_features:
features[w] = [w in words]
You can also try
— de ce „de asemenea”, la ce alternativă te referi? Cea mai simplă soluție? 😉 – > .- Întrebarea a primit deja un răspuns înainte de a putea să o trimit pe a mea. Deci, cuvântul „de asemenea” – > .
- Da, dar poate că răspunsul deja dat este slab (chiar cred asta): aruncând o bucată de cod și spunând încercați asta nu este de ajutor, vezi comentariul meu. Aș sugera să încorporați soluția evidentă a problemei în răspunsul dvs. și să spuneți mai multe cuvinte despre greșeala pe care a făcut-o OP. O altă alternativă este să faci un link către răspuns (dar nu prea sugerez asta aici). – > .
features
ar trebui să fie o listă sau un dict ? – > Por polku.