0
def word_feats(words): 
    return dict([(word, True) for word in words]) 

for tweet in negTweets: 
    words = re.findall(r"[\w']+|[.,!?;]", tweet) #splits the tweet into words 
    negwords = [(word_feats(words), 'neg')] #tag the words with feature 
    negfeats.append(negwords) #add the words to the feature list 
for tweet in posTweets: 
    words = re.findall(r"[\w']+|[.,!?;]", tweet) 
    poswords = [(word_feats(words), 'pos')] 
    posfeats.append(poswords) 

negcutoff = len(negfeats)*3/4 #take 3/4ths of the words 
poscutoff = len(posfeats)*3/4 

trainfeats = negfeats[:negcutoff] + posfeats[:poscutoff] #assemble the train set 
testfeats = negfeats[negcutoff:] + posfeats[poscutoff:] 

classifier = NaiveBayesClassifier.train(trainfeats) 
print 'accuracy:', nltk.classify.util.accuracy(classifier, testfeats) 
classifier.show_most_informative_features() 

Je reçois l'erreur suivante lors de l'exécution de ce code ...Python NLTK Classifier.train (trainfeats) ... ValueError: besoin de plus de 1 valeur pour déballer

File "C:\Python27\lib\nltk\classify\naivebayes.py", line 191, in train 

for featureset, label in labeled_featuresets: 

ValueError: need more than 1 value to unpack 

L'erreur vient de la ligne classifier = NaiveBayesClassifier.train (trainfeats) et je ne sais pas pourquoi. J'ai fait quelque chose comme ça avant, et mon train de train semble être dans le même format qu'alors ... un exemple du format est listé ci-dessous ...

[[({'moi': Vrai, 'af ': Vrai,' ceci ': Vrai,' joie ': Vrai,' haut ': Vrai,' narguilé ': Vrai,' obtenu ': Vrai},' pos ')]]

quelle autre valeur est ma trainfeats besoin de créer le classificateur? souligné texte

+1

Vous avez deux ensembles de parenthèses entre parenthèses: une liste dont le seul élément est une liste dont le seul élément est un tuple. Ce tuple contient un dictionnaire et une chaîne. Peut-être avez-vous trop d'enveloppes, alors le déballage ne voit qu'un seul objet. – Prune

Répondre

1

Le commentaire par @Prune a raison: Votre labeled_featuresets doit être une séquence de paires (listes à deux éléments ou tuples): Une caractéristique dict et une catégorie pour chaque point de données. Au lieu de cela, chaque élément de votre trainfeats est une liste contenant un élément: Un tuple de ces deux choses. Perdez les crochets dans les deux boucles de création de fonctionnalités et cette partie devrait fonctionner correctement. Par exemple,

negwords = (word_feats(words), 'neg') 
negfeats.append(negwords) 

Deux choses: Pensez à utiliser nltk.word_tokenize() au lieu de faire votre propre tokens. Et vous devriez randomiser l'ordre de vos données d'entraînement, par ex. avec random.scramble(trainfeats).

+0

Bonne valeur ajoutée; Merci! – Prune