文章原创,最近更新:2018-08-20
学习参考链接:第4章 基于概率论的分类方法:朴素贝叶斯
本章节的主要内容是:
重点介绍项目案例1:屏蔽社区留言板的侮辱性言论:准备数据:从文本中构建词向量的代码
。
1.朴素贝叶斯项目案例介绍:
项目案例1:
屏蔽社区留言板的侮辱性言论
项目概述:
构建一个快速过滤器来屏蔽在线社区留言板上的侮辱性言论。如果某条留言使用了负面或者侮辱性的语言,那么就将该留言标识为内容不当。对此问题建立两个类别: 侮辱类和非侮辱类,使用 1 和 0 分别表示。
朴素贝叶斯 工作原理:
提取所有文档中的词条并进行去重
获取文档的所有类别
计算每个类别中的文档数目
对每篇训练文档:
对每个类别:
如果词条出现在文档中-->增加该词条的计数值(for循环或者矩阵相加)
增加所有词条的计数值(此类别下词条总数)
对每个类别:
对每个词条:
将该词条的数目除以总词条数目得到的条件概率(P(词条|类别))
返回该文档属于每个类别的条件概率(P(类别|文档的所有词条))
开发流程:
- 收集数据: 可以使用任何方法
- 准备数据: 从文本中构建词向量
- 分析数据: 检查词条确保解析的正确性
- 训练算法: 从词向量计算概率
- 测试算法: 根据现实情况修改分类器
- 使用算法: 对社区留言板言论进行分类
数据集介绍
这个数据集是我们自己构造的词表.
2.准备数据:从文本中构建词向量的代码
打开文本编辑器,创建一个叫 bayes.py的新文件,然后将下面的代码添加到文件中。
#用自定义函数loadDataSet创建实验文档样本
def loadDataSet():
"""
创建数据集
:return: 文档包含单词的列表postingList, 分类标签列表classVec
"""
#用列表postingList创建文档列表
postingList = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], #[0,0,1,1,1......]
['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创建标签,1代表侮辱性文字,0代表正常言论
classVec = [0, 1, 0, 1, 0, 1]
# 返回文档列表postingList及标签classVec
return postingList, classVec
def createVocabList(dataSet):
"""
获取所有单词的集合
:param dataSet: 数据集
:return: 所有单词的集合(即不含重复元素的单词列表)
"""
vocabSet = set()
for document in dataSet:
# 操作符 | 用于求两个集合的并集
vocabSet=set(document)|vocabSet
return list(vocabSet)
def setOfWords2Vec(vocabList, inputSet):
"""
遍历查看该单词是否出现,出现该单词则将该单词置1,否则该单词置0
:param vocabList: 所有单词集合列表
:param inputSet: 输入数据集
:return: 匹配列表[0,1,0,1...],其中 1与0 表示词汇表中的单词是否出现在输入的数据集中
"""
# 创建一个和词汇表vocabList等长的向量returnVec,向量中每一元素都为0
returnVec = [0]*len(vocabList)# [0,0......]
#用变量word遍历输入文档inputSet中的所有单词
for word in inputSet:
# 如果单词在词汇表vocabList中
if word in vocabList:
# 则将输出文档向量中的值设为1
returnVec[vocabList.index(word)]=1
else:
# 否则输出“单词不在词汇表中”,%用作格式化字符串
print("the word:%s is not in my Vocabulary!"% word)
# 返回文档向量returnVec
return returnVec
调用函数loadDataSet()创建实验文档样本,返回的文档列表及标签赋值给listOPosts,listClasses,输出可以看到已经创建了文档列表listOPosts.
listOPosts,listClasses =loadDataSet()
listOPosts
Out[73]:
[['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']]
调用函数createVocabList()创建一个包含之前创建的文档listOPosts中所有不重合词汇的列表myVocabList,输出词汇列表myVocabList看下,可以发现没有重复的词汇。
myVocabList = createVocabList(listOPosts)
myVocabList
Out[75]:
['is',
'licks',
'how',
'dalmation',
'my',
'cute',
'worthless',
'maybe',
'mr',
'stupid',
'help',
'problems',
'ate',
'quit',
'garbage',
'buying',
'steak',
'him',
'I',
'take',
'dog',
'flea',
'to',
'stop',
'please',
'food',
'park',
'has',
'not',
'posting',
'so',
'love']
调用函数setOfWords2Vec(),输入参数为词汇表myVocabLis及文档listOPosts[0]时,输出文档向量returnVec中每一元素为1或者0,表示词汇表 myVocabLis中的单词在文档listOPosts[0]中是否出现,listOPosts[0]可以理解为斑点犬网站留言板中出现的第一句话“my dog has flea problems,help please”。
setOfWords2Vec(myVocabList, listOPosts[0])
Out[76]:
[0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
1,
1,
0,
0,
0,
0,
0,
0,
0,
0,
1,
1,
0,
0,
1,
0,
0,
1,
0,
0,
0,
0]