【朴素贝叶斯算法】{2} —— 构建朴素贝叶斯文档分类器

本文介绍了如何使用朴素贝叶斯算法进行文档分类,详细讲解了从文本中提取特征、计算概率、训练算法以及测试算法的步骤。通过构建词向量、计算条件概率,并解决概率为0和下溢出问题,实现了一个简单的文档分类器。
摘要由CSDN通过智能技术生成
机器学习的一个重要应用就是文档的自动分类。

在文档分类中,整个文档(如一封电子邮件)是实例,而文档中的某些元素则构成特征。我们可以观察文档中出现的词,把每个词的出现或者不出现作为一个特征,这样得到的特征数目就会跟词汇表中的词目一样多。

朴素贝叶斯是贝叶斯分类器的一个扩展,是用于文档分类的常用算法。

朴素贝叶斯算法大致步骤
  1. 收集数据:可以使用任何方法。如RSS源。
  2. 准备数据:数值型或布尔型数据。
  3. 分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好。
  4. 训练算法:计算不同的独立特征的条件概率。
  5. 测试算法:计算错误率。
  6. 使用算法:常用于文档分类。可以在任意分类问题中使用朴素贝叶斯分类器,不一定是文本。

要得到好的概率分布,就需要足够的数据样本,假定样本数为 N N N

由统计学知,如果每个特征需要 N N N 个样本,那么对于 10 10 10 个特征将需要 N 10 N^{10} N10个样本,对于 1000 1000 1000 个特征将需要 N 1000 N^{1000} N1000个样本。可以看到,所需要的样本数会随着特征数目增大而迅速增长。

如果特征之间相互独立,那么样本数就可以从 N 1000 N^{1000} N1000减少到 1000 ∗ N 1000*N 1000N

所谓独立( independence )指的是统计意义上的独立,即一个特征出现的可能性与它和其他特征相邻没有关系。

例如,假设单词 bacon 出现在 unhealthy 后面与出现在 delicious 后面的概率相同。
当然,其实 bacon 常常出现在 delicious 附近,而很少出现在 unhealthy 附近,这个假设正是朴素贝叶斯分类器中朴素(naive)一词的含义。
朴素贝叶斯分类器中的另一个假设是,每个特征同等重要。
尽管上述假设存在一些小的瑕疵,但朴素贝叶斯的实际效果却很好。


如何从文本中获取特征?

要从文本中获取特征,需要先拆分文本。具体如何做呢?

这里的特征是来自文本的词条(token),一个词条是字符的任意组合。可以把词条想象为单词,也可以使用非单词词条,如URL、IP地址或者任意其他字符串。然后将每一个文本片段表示为一个词条向量,其中值为1表示词条出现在文档中,0表示词条未出现。

在网络社区,我们要屏蔽不适当的言论,因此要构建一个快速过滤器,如果某条发言使用了负面或者侮辱性的语言,就将该发言标识为内容不当。对此问题建立两个类别:侮辱类和非侮辱类,使用1和0分别表示。


一、准备数据:从文本中构建词向量

我们把文本看成单词向量或者词条向量。考虑出现在所有文档中的所有单词,再决定将哪些词汇集合,然后将每一篇文档转换为词汇表上的向量。

def loadDataSet() :
	postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], 
                 ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
                 ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
                 ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
                 ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
                 ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
    classVec = [0, 1, 0, 1, 0, 1] # 1代表侮辱性词汇,0代表不是
    return postingList, classVec 

loadDataSet函数 创建了一些实验样本。该函数返回的第一个变量是进行词条切分后的文档集合。
loadDataset函数 返回的第二个变量是一个类别标签的集合。

这些标注信息用于训练程序以便自动检测不适当发言。


def createVocabList(dataSet):
    vocabSet = set([]) # 创建一个空集
    for document in dataSet:               
        vocabSet = vocabSet | set(document) # 取并集
    return list(vocabSet)

createVocablist函数 创建一个文档中出现的不重复词的列表,使用了Python的set数据类型。将词条列表输给set构造函数,set就会返回一个不重复词表。

首先,创建一个空集,然后将每篇文档返回的新词集合添加到该集合中。操作符 ∣ | 用于求
两个集合的并集,这也是一个按位或 ( O R ) (OR) (OR) 操作符。

在数学符号表示上,按位或操作与集合求并操作使用相同记号。


# 文档词集模型
def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0] * len(vocabList) # 创建一个其中所含元素都为0的向量
    # 遍历每个词条
    for word in inputSet: 
        # 如果词条存在于词汇表中,则置1
        if word in vocabList: 
        	returnVec[vocabList.index(word)] = 1 
        else:
        	print("the word: %s is not in my Vocabulary!" % word)
    return returnVec # 返回文档向量

获得词汇表后,便可以使用 setOfWords2Vec函数,该函数的输入参数为词汇表及某个文档,输出的是文档向量,向量的每一元素为1或0,分别表示词汇表中的单词在输入文档中是否出现。

首先创建一个和词汇表等长的向量,并将其元素都设置为0。接着,遍历文档中的所有单词,如果出现了词汇表中的单词,则将输出的文档向量中的对应值设为1。


二、训练算法:从词向量计算概率

知道了如何将一组单词转换为一组数字后,我们看看如何使用这些数字计算概率。
现在已知一个词是否出现在一篇文档中,也知道该文档所属的类别。

重写贝叶斯准则,将之前的 x 、 y x、y xy 替换为 w w

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值