实现 | 朴素贝叶斯模型算法研究与实例分析

实现 | 朴素贝叶斯模型算法研究与实例分析
(白宁超 2018年9月4日09:03:21)

导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果。所以很受欢迎,对于朴素贝叶斯的学习,本文首先介绍理论知识即朴素贝叶斯相关概念和公式推导,为了加深理解,采用一个维基百科上面性别分类例子进行形式化描述。然后通过编程实现朴素贝叶斯分类算法,并在屏蔽社区言论、垃圾邮件、个人广告中获取区域倾向等几个方面进行应用,包括创建数据集、数据预处理、词集模型和词袋模型、朴素贝叶斯模型训练和优化等。然后结合复旦大学新闻语料进行朴素贝叶斯的应用。最后,大家熟悉其原理和实现之后,采用机器学习sklearn包进行实现和优化。由于篇幅较长,采用理论理解、案例实现、sklearn优化三个部分进行学习。(本文原创,转载必须注明出处:朴素贝叶斯模型算法研究与实例分析)

目录

理论 | 朴素贝叶斯模型算法研究与实例分析

实现 | 朴素贝叶斯模型算法研究与实例分析

深度 | 朴素贝叶斯模型算法研究与实例分析

案例场景1: 屏蔽社区留言板的侮辱性言论

项目概述

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

本案例开发流程如下:

  1. 收集数据: 可以是文本数据、数据库数据、网络爬取的数据、自定义数据等等
  2. 数据预处理: 对采集数据进行格式化处理,文本数据的格式一致化,网络数据的分析抽取等,包括中文分词、停用词处理、词袋模型、构建词向量等。
  3. 分析数据: 检查词条确保解析的正确性,根据特征进行模型选择、特征抽取等。
  4. 训练算法: 从词向量计算概率
  5. 测试算法: 根据现实情况修改分类器
  6. 使用算法: 对社区留言板言论进行分类

收集数据

本案例我们采用自定义的数据集,我们选择6条社区评论,然后进行数据处理后以list形式存储在文档列表postingList中。其中每个词代表一个特征。将每条评论进行分类(即1代表侮辱性文字,0代表非侮辱文字)存在在类别列表classVec中。最后返回数据集和类标签。代码实现如下:

'''创建数据集:单词列表postingList, 所属类别classVec''' 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 

代码分析:postingList列表存储6条评论信息,classVec列表存储每条信息类别(1代表侮辱性文字,0代表非侮辱文字)。最后返回文档列表和类别列表。

数据预处理

数据预处理包括对样本进行分词、词性筛选、停用词处理等,最后形成规范化干净的数据样本。由于本案例收集数据时默认进行了数据预处理,所以本节不在介绍(复旦新闻语料文本分类案例会详细介绍)。目前,我们采集的数据还是文本类型,计算机还不能直接处理,需要将文本数据转化成词向量进行处理。这里面需要获取特征的词汇集合(如果暂时不理解,先看看代码实现,下面会进行形式化描述)。其实现过程如下:

'''获取所有单词的集合:返回不含重复元素的单词列表''' def createVocabList(dataSet):     vocabSet = set([])     for document in dataSet:         vocabSet = vocabSet | set(document)  # 操作符 | 用于求两个集合的并集     # print(vocabSet)     return list(vocabSet) 

代码分析:方法参数dataSet即加载数据集返回的文档列表。vocabSet是定义的不重复的数据集合。然后for循环对文档列表每条数据进行遍历处理,将不重复的词汇添加到vocabSet中,最终形成整个文档的词汇集,然后以list形式返回。

上面的方法已经获取了整个文档词汇集合,接着构建数据矩阵,代码实现如下:

'''词集模型构建数据矩阵''' def setOfWords2Vec(vocabList, inputSet):     # 创建一个和词汇表等长的向量,并将其元素都设置为0     returnVec = [0] * len(vocabList)     # 遍历文档中的所有单词,如果出现了词汇表中的单词,则将输出的文档向量中的对应值设为1     for word in inputSet:         if word in vocabList:             returnVec[vocabList.index(word)] = 1         else:             print("单词: %s 不在词汇表之中!" % word)     # print(returnVec)     return returnVec 

代码分析:本方法提供两个参数分别是整个训练文档词汇集(即全部训练文档6条评论不重复的单词集合),输入的数据列表。以整个词汇集等长的0向量。我们遍历输入数据列表,如果词特征在词汇集则标记1,不在词汇集保持为0.最后返回词向量矩阵。

与词集模型对应的,有个词袋模型。两者都是构建词向量,只是方式不一样,词袋模型也是推荐使用的词向量化方法,其实现如下:

'''文档词袋模型构建数据矩阵''' def bagOfWords2VecMN(vocabList, inputSet):     returnVec = [0] * len(vocabList)     for word in inputSet:         if word in vocabList:             returnVec[vocabList.index(word)] +
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信