朴素贝叶斯分类文本

朴素贝叶斯分类文本

内容来自https://cuijiahua.com/blog/2017/11/ml_4_bayes_1.html这位大佬的博客,我这里记录一些我以开始没有懂得地方和看过的心得
在这不过多介绍朴素贝叶斯的概念,具体可查李航老师的统计学习方法

首先是数据集的分类(文本列表)

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]  

可以看到上述一共有6句话,将每句话拆分成一个个单词放在一个数组中,classVec表示的是上述的文本中哪段文本时有恶意和无恶意的(0无,1有)

接下来创建词汇表

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

通过创建一个空的列表,向其中添加不重复的词汇,最后得到以下结果,我们就叫他词汇表,

 ['ate', 'problems', 'how', 'quit', 'help', 'is', 'steak', 'has', 'food', 'dog', 'take', 'buying', 'park', 'love', 'not', 'worthless', 'garbage', 'dalmation', 'to', 'so', 'please', 'my', 'flea', 'maybe', 'him', 'licks', 'stupid', 'cute', 'I', 'stop', 'posting', 'mr']

接下来就是文本列表向词汇表转化,我们叫他(转化表)

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

这段代码的基本意思就是创建一个新的所含元素都为0的向量,然后遍历一段文本,如果文本出现在了词汇表里,那么在词汇表相应的位置将0改成1,这里计算的是单个文本,需要有个函数整合一下。这个转化表在后面的用处很大,他也是最后用到了贝叶斯函数的地方,这个表格最后是这样的

 [[0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0], 
   [1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1], 
   [0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]]

获得转化表之后,我们将利用他计算出每个单词的恶意程度(概率也可以这么说)
接下来我们需要做的就是去将所有没有恶意的转化表向量(转化表和文本表一样,只是换了一种表达方式)加在一起(列表0,2,4行相加)得到总的没有恶意的一个词汇表的内容(我没有整理给大家大概看一下)

p1Num
 [0. 0. 0. 0. 1. 0. 0. 0. 1. 0. 1. 0. 1. 0. 1. 1. 0. 0. 3. 1. 2. 1. 1. 0.
 0. 0. 1. 2. 0. 0. 1. 1.]

然后算出他的sum(sum是总的没有恶意的词汇的统计数量,就是上述代码中p1Num列表元素的和),总的有恶意的词汇表也同上(列表1,3,5行相加)。
最后用上述的***列表/sum***就能够得到每个单词的恶意与非恶意的概率,进而,进行一个分类。

你可能感兴趣的:(朴素贝叶斯分类文本)