机器学习机器学习实战贝叶斯

4-1节 朴素贝叶斯|准备数据:从文本中构建词向量|机器学习实战

2018-08-20  本文已影响90人  努力奋斗的durian

文章原创,最近更新: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]

3.相关知识点

知识点1:集合操作符


知识点2: 建立空的集合

上一篇下一篇

猜你喜欢

热点阅读