使用Python进行文本分类(二)测试算法:根据实际情况修改分类器、准备数据:文档词袋模型

使用Python进行文本分类(二)
测试算法:根据实际情况修改分类器

TabError: Inconsistent use of tabs and spaces in indentation

解决方法:
这个错误是说你用了tab键作缩进了,
因为在python不像C/C++里用大括号来区分程序块,而是用缩进
所以缩进很重要你把Tab都换成空格就好了

def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):#这个函数就是测试你输入的vec2Classify向量根据贝叶斯概率是否属于侮辱性语言
    p1 = sum(vec2Classify * p1Vec) + log(pClass1)#根据贝叶斯那个概率计算公式,就是先把所有p(wi|ci)先相乘就是
    #就是所有词出现的概率相乘,这个vec2Classify向量在函数testingNB是经过处理的,这里log+其实就是概率公式的*
    p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
    if p1 > p0:
        return 1
    else:
        return 0

def testingNB():
    listOPosts,listClasses = loadDataSet()
    myVocabList = createVocabList(listOPosts)#createVocabList将输入文档的不重复词创建为一个列表,myVocabList就还是之前那32个词组成的数组吧
    trainMat=[]
    for postinDoc in listOPosts:
        trainMat.append(setOfWords2Vec(myVocabList,postinDoc))#这里是建立了一个新数组来存放经过setOfWords2Vec处理的myVocabList
        #就是每一行32个词汇出现没出现,trainMat=[]应该是6x32的数组吧
    p0V,p1V,pAb = trainNB0(trainMat,listClasses)
    testEntry = ['love', 'my', 'dalmation']#第一个测试向量
    thisDoc = array(setOfWords2Vec(myVocabList,testEntry))#之前说的vec2Classify向量在函数testingNB是经过处理的就是指这里
    #现在myVocabList就是那32个词汇,setOfWords2Vec把 testEntry 由文本转换为01010的一个向量
    #thisDoc就是1x32的数组,这就可以解释上边
    print(testEntry, 'classified as:',classifyNB(thisDoc,p0V,p1V,pAb))
    testEntry = ['stupid', 'garbage']#第二个测试向量 vec2Classify * p1Vec这个操作了,就是计算我们要测试的这个词条每个词出现,不行了,我也有些乱了,下面说
    thisDoc = array(setOfWords2Vec(myVocabList,testEntry))
    print(testEntry, 'classified as:',classifyNB(thisDoc,p0V,p1V,pAb))

该怎么理解这个乘法呢?vec2Classify * p1Vec
testEntry = [‘stupid’, ‘garbage’]
这是myVocabList
[‘is’, ‘flea’, ‘help’, ‘cute’, ‘food’, ‘stop’, ‘ate’, ‘stupid’, ‘how’, ‘not’, ‘maybe’, ‘take’, ‘steak’, ‘has’, ‘dalmation’, ‘worthless’, ‘quit’, ‘problems’, ‘garbage’, ‘love’, ‘dog’, ‘my’, ‘to’, ‘him’, ‘posting’, ‘buying’, ‘mr’, ‘licks’, ‘I’, ‘so’, ‘park’, ‘please’]
那么testEntry
thisDoc[7]=thisDoc[18]=1 其它都是0
p1Vect = p1Num/p1Denom
就是在已知文档是否为侮辱性文档的情况下,32个词汇中 每个词汇出现的次数 /32个词汇出现的总次数
sum(thisDoc*p1Vec)其实就是thisDoc[7](stupid出现的概率)+thisDoc[18](garbage出现的概率)
在log中是加,实际上是乘(这里要是把公式打出来可能效果更好,无奈不会再这个编辑器插入数学公式)
因此,就可以理解
p1 = sum(vec2Classify * p1Vec) + log(pClass1)
p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
用来判断这个词条是否是侮辱性语言了

准备数据:文档词袋模型
我们将每个词的出现与否作为一个特征,这可以被描述为词集模型。
如果一个词在文档中出现不止一次,这可能意味着包含该词是否出现在文档中所不能表达的某种信息,这种方法被称为词袋模型。
第一眼没看懂,第二眼嗯 断句嘛
如果一个词在文档中出现不止一次 意味着某种信息,什么信息呢,(该词是否出现在文档中)所不能表达的信息。
因为词集模式不能表达的信息,所以建立了词袋模型。
setOfWords2Vec(vocabList, inputSet):#输入为词汇表及文档,判断词汇表中每个词是否在文档中出现过
setOfWords2Vec对应的就是建立了一个词集模型
bagOfWords2VecMN对应的就是建立了一个词袋模型

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

当遍历inputSet中的每个词时,如果这个词在vocabList中出现过,就遍历到这个词在returnVec中对应的位置加1,这时,每个词对应的将会是它在这个inoutSet出现过几次

猜你喜欢

转载自blog.csdn.net/qq_42799920/article/details/81321290
今日推荐