title: Why did NLTK NaiveBayes classifier misclassify one record?
body: <p>This is the first time I am building a sentiment analysis machine learning model using the nltk NaiveBayesClassifier in Python. I know it is too simple of a model, but it is just a first step for me and I will try tokenized sentences next time. </p>
  
  <p>The real issue I have with my current model is: I have clearly labeled the word 'bad' as negative in the training data set (as you can see from the 'negative_vocab' variable). However, when I ran the NaiveBayesClassifier on each sentence (lower case) in the list ['awesome movie', ' i like it', ' it is so bad'], the classifier mistakenly labeled 'it is so bad' as positive.   </p>
  
  <p><strong>INPUT:</strong></p>
  
  <pre><code>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() 
  </code></pre>
  
  <p><strong>OUTPUT:</strong></p>
  
  <pre><code>awesome movie is pos
  
  i like it is pos
  
  it is so bad is pos
  </code></pre>
  
  <p>To make sure the function 'word_feat(word)' iterates over each sentences instead of each word or letter, I did some diagnostic codes to see what is each element in 'word_feat(word)':</p>
  
  <pre><code>for word in words:
      print(word_feat(word))
  </code></pre>
  
  <p>And it printed out:</p>
  
  <pre><code>{'awesome movie': True}
  {' i like it': True}
  {' it is so bad': True} 
  </code></pre>
  
  <p>So it seems like the function 'word_feat(word)' is correct?</p>
  
  <p>Does anyone know why the classifier classified 'It is so bad' as positive? As mentioned before, I had clearly labeled the word 'bad' as negative in my training data. </p>