该算法看起来非常简单,但我唯一的参考是维基百科,我发现各种博客有点令人困惑。
我将其设置为对文档进行分类。我没有使用NLTK内置的朴素贝叶斯分类器,因为我不了解如何定义要训练的功能。
我的设置是我使用NLTK来标记文档,我使用POS标记来清除专有名词和形容词,将这些收集在该文档的单词列表中,然后我返回并制作一个"主参考矢量"来自每个文件的这些名词和形容词(基本上是所有这些词语的组合)并分配一个"参考向量":一个位置词向量,表示1或0是否该词位于主要那个位置参考向量出现在本文档中。
群集是一个(可以猜测)包含文档列表的对象。等等。
代码:
class NaiveBayesClassifier(object):
def __init__(self):
self.ready=false
def get_training_clusters(self,clusters,keywords):
self.num_clusters = len(clusters)
self.class_prob = [] #p(class)
num_docs = 0
self.prob_var_class = [] # = p(var | class)
self.ref_length = len(clusters[0].docs[0].ref_vector)
for i in range (0,self.ref_length):
self.var_total_prob.append(0)
for i in range(0,self.num_clusters): #over clusters
self.class_prob.append(len(clusters[i].docs))
num_docs = num_docs + self.class_prob[i]
class_var_prob = [] # = p(var | class)
self.prob_var_class.append([])
for z in range (0,ref_length):
class_var_prob[i].append(0)
for j in range(0,self.class_prob[i]): #over docs in clusters
for k in range(0,self.ref_length): #over variables in individual docs
class_var_prob[k] = class_var_prob[k] + clusters[i].docs[j].ref_vector[k]
for k in range(0,self.class_prob[i]): #over docs in clusters
var_prob = class_var_prob[i][k] / self.class_prob[i] #total for variable i / size
self.prob_var_class.append((1-var_prob,var_prob)) # [ p(~var | class), p(var | class) ]
for i in range(0,self.num_clusters):
self.class_prob[i] = self.class_prob[i] / num_docs
def classify(self,thedoc):
high_score = -1
winner = -1
for i in range (0,self.num_clusters):
product = self.class_prob[i]
for j in range (0,self.ref_length):
product = product * self.prob_var_class[i][j][thedoc.ref_vector[j]]
if high_score < product:
high_score = product
winner = i
return winner # winner = argmax(p(class(x)) * product(p(var(i) | class(x)))
是的,这就是很多代码。我特别感兴趣的是: