python:使用朴素贝叶斯分类来分类文档

时间:2014-11-22 03:24:51

标签: python algorithm

该算法看起来非常简单,但我唯一的参考是维基百科,我发现各种博客有点令人困惑。

我将其设置为对文档进行分类。我没有使用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)))

是的,这就是很多代码。我特别感兴趣的是:

  1. 我计算了doc在特定类中的概率
  2. 我创建了一个单词出现在特定类的文档中的概率列表,
  3. 分类时,我会返回一个类的概率的最大值乘以出现或未出现在该类中的单词的所有概率的乘积。

0 个答案:

没有答案