¿Por qué el clasificador NLTK NaiveBayes clasificó erróneamente un registro?

Esta es la primera vez que estoy construyendo un modelo de aprendizaje automático de análisis de sentimientos utilizando el nltk NaiveBayesClassifier en Python. Sé que es un modelo demasiado simple, pero es solo un primer paso para mí e intentaré oraciones simbólicas la próxima vez.

El verdadero problema que tengo con mi modelo actual es: he etiquetado claramente la palabra 'malo' como negativo en el conjunto de datos de entrenamiento (como se puede ver en la variable 'negative_vocab'). Sin embargo, cuando ejecuté el NaiveBayesClassifier en cada oración (minúscula) en la lista ['película increíble', 'me gusta', 'es tan malo'], el clasificador erróneamente etiquetó 'es tan malo' como positivo.

ENTRADA:

import nltk.classify.util
from nltk.classify import NaiveBayesClassifier
from nltk.corpus import names

positive_vocab = [ 'awesome', 'outstanding', 'fantastic', 'terrific', 'good', 'nice', 'great', ':)' ]
negative_vocab = [ 'bad', 'terrible','useless', 'hate', ':(' ]
neutral_vocab = [ 'movie','the','sound','was','is','actors','did','know','words','not','it','so','really' ]

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

positive_features_1 = [(word_feats(positive_vocab), 'pos')]
negative_features_1 = [(word_feats(negative_vocab), 'neg')]
neutral_features_1 = [(word_feats(neutral_vocab), 'neu')]

train_set = negative_features_1 + positive_features_1 + neutral_features_1

classifier = NaiveBayesClassifier.train(train_set) 

# Predict
neg = 0
pos = 0
sentence = "Awesome movie. I like it. It is so bad"
sentence = sentence.lower()
words = sentence.split('.')

def word_feat(word):
    return dict([(word,True)])
#NOTE THAT THE FUNCTION 'word_feat(word)' I WROTE HERE IS DIFFERENT FROM THE 'word_feat(words)' FUNCTION I DEFINED EARLIER. THIS FUNCTION IS USED TO ITERATE OVER EACH OF THE THREE ELEMENTS IN THE LIST ['awesome movie', ' i like it', ' it is so bad'].

for word in words:
    classResult = classifier.classify(word_feat(word))
    if classResult == 'neg':
        neg = neg + 1
    if classResult == 'pos':
        pos = pos + 1
    print(str(word) + ' is ' + str(classResult))
    print() 

SALIDA:

awesome movie is pos

i like it is pos

it is so bad is pos

Para asegurarme de que la función 'word_feat (word)' itera sobre cada oración en lugar de cada palabra o letra, hice algunos códigos de diagnóstico para ver qué es cada elemento en 'word_feat (word)':

for word in words:
    print(word_feat(word))

Y se imprime:

{'awesome movie': True}
{' i like it': True}
{' it is so bad': True} 

Entonces, ¿parece que la función 'word_feat (word)' es correcta?

¿Alguien sabe por qué el clasificador clasificó 'Es tan malo' como positivo? Como se mencionó anteriormente, claramente había etiquetado la palabra 'malo' como negativo en mis datos de entrenamiento.

Respuestas a la pregunta(4)

Su respuesta a la pregunta