Классификатор nltk naivebayes для классификации текста

В следующем коде я знаю, что мой классификатор naivebayes работает правильно, потому что он правильно работает на trainset1, но почему он не работает на trainset2? Я даже попробовал это на двух классификаторах, один из TextBlob, а другой напрямую из nltk.

from textblob.classifiers import NaiveBayesClassifier
from textblob import TextBlob
from nltk.tokenize import word_tokenize
import nltk

trainset1 = [('I love this sandwich.', 'pos'),
('This is an amazing place!', 'pos'),
('I feel very good about these beers.', 'pos'),
('This is my best work.', 'pos'),
("What an awesome view", 'pos'),
('I do not like this restaurant', 'neg'),
('I am tired of this stuff.', 'neg'),
("I can't deal with this", 'neg'),
('He is my sworn enemy!', 'neg'),
('My boss is horrible.', 'neg')]

trainset2 = [('hide all brazil and everything plan limps to anniversary inflation plan initiallyis limping its first anniversary amid soaring prices', 'class1'),
         ('hello i was there and no one came', 'class2'),
         ('all negative terms like sad angry etc', 'class2')]

def nltk_naivebayes(trainset, test_sentence):
    all_words = set(word.lower() for passage in trainset for word in word_tokenize(passage[0]))
    t = [({word: (word in word_tokenize(x[0])) for word in all_words}, x[1]) for x in trainset]
    classifier = nltk.NaiveBayesClassifier.train(t)
    test_sent_features = {word.lower(): (word in word_tokenize(test_sentence.lower())) for word in all_words}
    return classifier.classify(test_sent_features)

def textblob_naivebayes(trainset, test_sentence):
    cl = NaiveBayesClassifier(trainset)
    blob = TextBlob(test_sentence,classifier=cl)
    return blob.classify() 

test_sentence1 = "he is my horrible enemy"
test_sentence2 = "inflation soaring limps to anniversary"

print nltk_naivebayes(trainset1, test_sentence1)
print nltk_naivebayes(trainset2, test_sentence2)
print textblob_naivebayes(trainset1, test_sentence1)
print textblob_naivebayes(trainset2, test_sentence2)

Вывод:

neg
class2
neg
class2

Хотя test_sentence2 явно принадлежит class1.


person jesus_fc33    schedule 06.09.2016    source источник


Ответы (1)


Я предполагаю, что вы понимаете, что вы не можете ожидать, что классификатор изучит хорошую модель только с 3 примерами, и что ваш вопрос больше направлен на то, чтобы понять, почему он делает это в этом конкретном примере.

Вероятная причина, по которой это происходит, заключается в том, что наивный байесовский классификатор использует вероятность предыдущего класса. То есть вероятность neg vs pos, независимо от текста. В вашем случае 2/3 примеров отрицательные, поэтому априорное значение составляет 66% для отрицательных и 33% для положительных. Положительные слова в вашем единственном положительном примере — «годовщина» и «взлет», которых вряд ли будет достаточно, чтобы компенсировать эту вероятность предыдущего класса.

В частности, имейте в виду, что расчет вероятностей слов включает различные функции «сглаживания» (например, в каждом классе будет log10(Частота терминов + 1), а не log10(Частота терминов), чтобы предотвратить слишком сильное влияние низкочастотных слов. результаты классификации, деления на ноль и т. д. Таким образом, вероятности «годовщины» и «взлета» не равны 0,0 для отрицательных и 1,0 для положительных, в отличие от того, что вы могли ожидать.

person Pascal Soucy    schedule 06.09.2016