使用nltk python NaiveBayesClassifier的问题,我一直得到相同的概率输入正确吗?

时间:2014-12-06 18:20:13

标签: python classification nltk text-classification

所以如果你愿意的话,我正在为一个项目“家庭作业”工作,但它的作用是它需要动漫名称和流派,如果它们是相关或不相关的,我正在尝试用它来构建一个NaiveBayesClassifier然后我想传递一些类型,并告诉我它是否相关或不相关我目前有以下内容:

import nltk
trainingdata =[({'drama': True, 'mystery': True, 'horror': True, 'psychological': True}, 'relevant'), ({'drama': True, 'fantasy': True, 'romance': True, 'adventure': True, 'science fiction': True}, 'unrelevant')]
classifier = nltk.classify.naivebayes.NaiveBayesClassifier.train(trainingdata)
classifier.classify({'Fantasy': True, 'Comedy': True, 'Supernatural': True})
prob_dist = classifier.prob_classify(anime)
print "relevant " + str(prob_dist.prob("relevant"))
print "unrelevant " + str(prob_dist.prob("unrelevant"))

我目前有:

size of training array:110
the relevant length 57
the unrelevant length 53

我收到的一些结果:

relevant Tantei Opera Milky Holmes TD
input data passed to classify: {'Mystery': True, 'Comedy': True, 'Super': True, 'Power': True}
relevant 0.518018018018
unrelevant 0.481981981982

relevant Juuou Mujin no Fafnir
input data passed to classify :{'Romance': True, 'Fantasy': True, 'School': True}
relevant 0.518018018018
unrelevant 0.481981981982

所以看起来它没有正确读取我的数据,如57/110 = .518018 但我不确定我做错了什么......

我看着这个 nltk NaiveBayesClassifier training for sentiment analysis

我觉得我正在做得正确..我唯一没做的就是指定键中找不到的每个特定键。那有关系吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

有些背景,OP的目的是为此目的构建分类器:https://github.com/alejandrovega44/CSCE-470-Anime-Recommender

首先,有几个方法论问题,我称之为你所谓的东西。

培训数据应该是您用于任务的原始数据,即位于https://raw.githubusercontent.com/alejandrovega44/CSCE-470-Anime-Recommender/naive2/py/UserAnime2的json文件

您在问题中的数据结构应称为要素向量,即:

({'drama': True, 'mystery': True, 'horror': True, 'psychological': True}, 'relevant')
({'drama': True, 'fantasy': True, 'romance': True, 'adventure': True, 'science fiction': True}, 'unrelevant')

示例代码中训练集中的功能:

'drama'
'mystery'
'horror'
'psychological'
'fantasy',
'romance', 
'adventure',
'science fiction'

但是示例代码中测试集中的功能是:

'Fantasy'
'Comedy'
'Supernatural'
'Mystery'
'Comedy'
'Super'
'Power'
'Romance'
'Fantasy'
'School'

由于字符串区分大小写,因此测试数据中的所有功能都不会出现在训练数据中。因此,对于二进制类,分配的默认概率为50%-50%,即:

import nltk
feature_vectors =[
({'drama': True, 'mystery': True, 'horror': True, 'psychological': True}, 'relevant'), 
({'drama': True, 'fantasy': True, 'romance': True, 'adventure': True, 'science fiction': True}, 'unrelevant')]
classifier = nltk.classify.naivebayes.NaiveBayesClassifier.train(feature_vectors)
prob_dist = classifier.prob_classify({'Fantasy': True, 'Comedy': True, 'Supernatural': True})
print "relevant " + str(prob_dist.prob("relevant"))
print "unrelevant " + str(prob_dist.prob("unrelevant"))

[OUT]:

relevant 0.5
unrelevant 0.5

即使您提供相同的文件但具有大写功能,分类器也不会知道,例如:

import nltk
feature_vectors =[
({'drama': True, 'mystery': True, 'horror': True, 'psychological': True}, 'relevant'), 
({'drama': True, 'fantasy': True, 'romance': True, 'adventure': True, 'science fiction': True}, 'unrelevant')]
classifier = nltk.classify.naivebayes.NaiveBayesClassifier.train(feature_vectors)

doc1 = {'drama': True, 'mystery': True, 'horror': True, 'psychological': True}
prob_dist = classifier.prob_classify(doc1)
print "relevant " + str(prob_dist.prob("relevant"))
print "unrelevant " + str(prob_dist.prob("unrelevant"))
print '----'
caps_doc1 = {'Drama': True, 'Mystery': True, 'Horror': True, 'Psychological':True }
prob_dist = classifier.prob_classify(caps_doc1)
print "relevant " + str(prob_dist.prob("relevant"))
print "unrelevant " + str(prob_dist.prob("unrelevant"))
print '----'

[OUT]:

relevant 0.964285714286
unrelevant 0.0357142857143
----
relevant 0.5
unrelevant 0.5
----

如果没有提供更多详细信息和更好的示例代码进行调试,这就是我们可以帮助解决的问题。 =(