4.5.3 测试算法:根据现实情况修改分类器
4.5.4 准备数据:文档词袋模型
词集模型:将每个词的出现与否作为一个特征。
词袋模型:每个词在文档中出现不止一次,这可能意味着包含该词是否出现在文档中所不能表达的某种信息,记录每个词出现的次数。
相应代码及解释如下:
'''
函数功能:判断待分类的文本向量,属于哪个类别(0,1)的概率大
输入:待分类的向量,类别0下各特征的概率向量,类别1下各特征的概率向量,类别1的概率
输出:待分类向量属于的类别
函数思想:见书上
'''
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
p1 = sum(vec2Classify * p1Vec) + log(pClass1)
p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
if p1 > p0:
return 1
else:
return 0
'''
函数功能:便利函数,封装对文本进行分类的所有操作
'''
def testingNB():
listOPosts,listClasses = loadDataSet()#加载训练文本集和对应标签向量
myVocabList = createVocabList(listOPosts)#根据训练文本集获取对应的词汇表
trainMat = []#存放训练文本向量
for postinDoc in listOPosts:#依次将训练文本通过setOfWords2Vec函数,转化为文本向量
trainMat.append(setOfWords2Vec(myVocabList,postinDoc))
p0V,p1V,pAb = trainNB0(trainMat,listClasses)#得到该训练文本向量集中的各种概率
#进行测试
testEntry = ['love', 'my', 'dalmation']#创建待分类文本
thisDoc = array(setOfWords2Vec(myVocabList,testEntry))#得到待分类文本对应的文本向量
result = classifyNB(thisDoc,p0V,p1V,pAb)#计算该文本向量在哪个类别中的概率最大
print(result)#打印分类结果
'''
函数功能:词袋模型。
即和函数setOfWords2Vec()功能相似。
都是将某个文档根据词汇表,转换为文档向量。
不同的是setOfWords2Vec统计词条是否出现,bagOfWords2VecMN统计词条出现的次数
'''
def bagOfWords2VecMN(vocabList, inputSet):
returnVec = [0] * len(vocabList)#初始化输出向量,和词汇表等长,元素为0
#然后依次读取输入文档中的每个词,判断该词是否在词汇表中出现
for word in inputSet:
if word in vocabList:
returnVec[vocabList.index(word)] += 1# 若在词汇表中出现,则找到该词在词汇表中的位置,累积加1
return returnVec