3

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

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.

ответ

3

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^