朴素贝叶斯的中心思想,在于利用各类别在训练样本中的分布以及类别中各特征元素的分布,计算后验概率,使用极大似然法判断测试样本所属。出于该原理,使用该算法实现文本分类的局限性较多,例如训练集中各类样本的比例不能相差过大,比例较大的样本类别会获得更高的划分可能性;其次,该算法假设词与词之间相互独立,共享权重,忽视了词与词之间的关联性,面临共指消解 (同一实体不同表述) 的问题,因此只能用于诸如垃圾邮件识别的简单分类。
以下代码来自郑捷所著《NLP汉语自然语言处理,原理与实践》:
import numpy as np
class NaiveBayes(object):
'''
算法原理:
- 训练
i.借用TF-IDF中TF的概念生成词频矩阵TF
ii.计算各个分类的边缘概率P(yi)
iii.计算各个分类的后验词频分布P(x|yi)
- 预测
i.计算测试词频TF
ii.对每个分类计算TF*P(x|yi)*P(yi),以最大项作为预测类别
'''
def __init__(self):
self.train = [] #训练集
self.label = [] #训练集标签
self.vocab = [] #词集
self.tf = None #TF矩阵(row:训练集数量 col:词集词频)
self.idf = None #IDF向量(词集长度)
self.prob = {
} #P(yi)
self.con_prob = None #P(x|yi) (row:类别 col:词集词频)
def fit(self,train,label):
'''导入训练集,生成算法参数'''
assert isinstance(train,list)
assert isinstance(label,list)
assert len(train) == len(label)
self.train += train
self.label += label
vocab = set()
[vocab.add(word) for text in train for word in text]; #将词语导入词集<