《机器学习实战》之使用朴素贝叶斯进行文档分类

机器学习的一个重要应用就是文档的自动分类。在文档分类中,整个文档(如一封电子邮件)
是实例,而电子邮件中的某些元素则构成特征。虽然电子邮件是一种会不断增加的文本,但我们同
样也可以对新闻报道、用户留言、政府公文等其他任意类型的文本进行分类。我们可以观察文档中
出现的词,并把每个词的出现或者不出现作为一个特征,这样得到的特征数目就会跟词汇表中的词
目一样多。朴素贝叶斯是上节介绍的贝叶斯分类器的一个扩展,是用于文档分类的常用算法。

朴素贝叶斯的一般过程
(1) 收集数据:可以使用任何方法。本章使用RSS源
(2) 准备数据:需要数值型或者布尔型数据。
(3) 分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好。
(4) 训练算法:计算不同的独立特征的条件概率。
(5) 测试算法:计算错误率。
(6) 使用算法:一个常见的朴素贝叶斯应用是文档分类。可以在任意的分类场景中使用朴
素贝叶斯分类器,不一定非要是文本。
def loadDataSet():
    postingList=[["my","dog","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
def createVocabList(dataSet):
    vocabSet=set([])
    for document in dataSet:
        vocabSet=vocabSet|set(document)
    return list(vocabSet)
def setOfWords2Vec(vocabList,inputSet):
    returnVec=[0]*len(vocabList)
    for word in inpitSet:
        if word in vocabList:
            returnVec[vocabList.index(word)]=1
        else:
            print("the word:%d is not in my Vocabulary!" % word)
    return returnVec

词表到向量的转换函数。

  • loadDataSet()创建一些实验样本。
  • createVocabList()创建一个无重复词表。
  • setOfWords2Vec()输入参数为词汇表及某个文档,输出为文档向量,向量的每一个元素为1或者0

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

该函数的伪代码:

计算每个类别中的文档数目

对每篇训练文档:

             对每个类别:

                    如果词条出现在文档中->增加该词条的计数值

                 增加所有词条的计数值

           对每个类别:

                    对每个词条:

                    将该词条的数目除以总词条数目得到条件概率

            返回每个类别的条件概率

代码实现:

def trainNB0(trainMatrix,trainCategory):
    numTrainDocs=len(trainMatrix)
    numWords=len(trainCategory)
    pAbusive=sum(trainCategory)/float(numTrainDocs)
    p0Num=np.zeros(numWords);p1Num=np.zeros(numWords)
    p0Denom=0.0;p1Denom=0.0
    for i in range(numTrainDocs):
        if trainCategory[i]==1:
            p1Num+=trainMatrix[i]
            p1Denom+=sum(trainMatrix[i])
        else:
            p0Num+=trainMatrix[i]
            p0Denom+=sum(trainMatrix[i])
    p1Vect=p1Num/p1Denom
    p0Vect=p0Num/p0Denom
    return p0Vect,p1Vect,pAbusive

朴素贝叶斯分类函数

《机器学习实战》之使用朴素贝叶斯进行文档分类_第1张图片

四个输入:要分类的向量vec2Classify以及使用函数trainNB0()计算得到的三个概率。

准备数据:文档词袋模型

朴素贝叶斯词袋模型:

def bagOfWords2VecMN(vocabList,inputSet):
    returnVec=[0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)+=1
    return returnVec

以上代码结束,这样分类器就已经构建完成!!!!可以使用其过滤垃圾邮件

 

你可能感兴趣的:(人工智能)