资源简介
使用Python3.5实现贝叶斯完成文本分类,代码中有详细的解释
代码片段和文件信息
#coding=utf-8
from numpy import *
#文本转化为词向量
def loadDataSet():#创建一个实验样本
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 = [010101] #1表示侮辱类,0表示不属于
return postingListclassVec #词条切分后的分档和类别标签
#包含所有文档 不含重复词的列表list
def createVocabList(dataSet):
vocabSet=set([])#创建空集,set是返回不带重复词的list
for document in dataSet:
vocabSet=vocabSet|set(document) #创建两个集合的并集
return list(vocabSet)#输出不重复的元素
#判断某个词条在文档中是否出现-词集模型
def setOfWords2Vec(vocabList inputSet):#参数为词汇表和某个文档
returnVec = [0]*len(vocabList)#创建一个所含有的元素都为0 的向量
for word in inputSet:#遍历文档中所有的单词,如果出现词汇表中的单词,则将输出的文档向量中的对应值设为1
if word in vocabList:
returnVec[vocabList.index(word)] = 1#index函数在字符串里找到字符第一次出现的位置模型
else: print(“the word: %s is not in my Vocabulary!“ % word)#返回文档向量 表示某个词是否在输入文档中出现过 1/0
return returnVec #输入中的元素在词汇表时,词汇表相应位置为1,否则为0
#高级词袋模型,判断词出现次数
def bagOfWords2VecMN(vocabListinputSet):
returnVec = [0] * len(vocabList)
for word in inputSet:
if word in vocabList:
returnVec[vocabList.index(word)] += 1#文档的词袋模型 每个单词可以出现多次
else:
print(“the word: %s is not in my Vocabulary!“ % word) # 返回文档向量 表示某个词是否在输入文档中出现过 1/0
return returnVec
#朴素贝叶斯分类训练函数-得到每个特征的条件概率-从词向量计算概率
def trainNB0(trainMatrixtrainCategory):#输入的文档信息和标签
#trainMatrix:文档矩阵
#trainCategory:每篇文档类别标签
numTrainDocs=len(trainMatrix) #文档数目
numWords=len(trainMatrix[0])
pAbusive=sum(trainCategory)/float(numTrainDocs) #文档中属于侮辱类的概率,等于1才能算,0是非侮辱类
#p0Num=zeros(numWords); p1Num=zeros(numWords)
#p0Denom=0.0;p1Denom=0.0
p0Num = ones(numWords)#避免一个概率值为0,最后的乘积也为0
p1Num = ones(numWords)#避免一个概率值为0,最后的乘积也为0
p0Denom = 2.0#分母初始化为2
p1Denom = 2.0
for i in range(numTrainDocs):#遍历每个文档
#if else潜在遍历类别,共2个类别
if trainCategory[i]==1: #一旦某个词出现在某个文档中出现(出现为1,不出现为0)
p1Num+=trainMatrix[i] #该词数加1
p1Denom+=sum(trainMatrix[i]) #文档总词数加1
else: #另一个类别
p0Num+=trainMatrix[i]
p0Denom+=sum(trainMatrix[i])
# p1Vect = p1Num / p1Denom
# p0Vect = p0Num / p0Denom
p1Vec = log(p1Num / p1Denom)
p0Vec = log(p0Num / p0Denom)#避免下溢出或者浮点数舍入导致的错误-下溢出是由非常多很小的数相乘得到的
return p0Vec p1Vec pAbusive #返回p0Vec,p1Vec都是矩阵,对应每个词在文档总体中出现概率,pAb对应文档属于1的概率
#朴素贝叶斯分类器-给定词向量 判断类别
def classifyNB(vec2Classifyp0Vecp1VecpClass1):
#第一个参数为01组合二分类矩阵,对应词汇表各个词是否出现
#p0Vecp1VecpClass1:分别对应trainNB0计算得到的3个概率
p1=sum(vec2Classify*p1Vec)+log(pClass1)
p0=sum(vec2Classify*p0Vec)+log(1.0-pClass1)
if p1>p0:
return 1
else: return
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-08-24 08:34 bayes\
文件 10531 2017-08-24 10:25 bayes\bayes.py
目录 0 2017-08-24 08:34 bayes\email\
目录 0 2017-08-24 08:34 bayes\email\ham\
文件 141 2017-05-15 17:44 bayes\email\ham\1.txt
文件 82 2017-05-15 17:44 bayes\email\ham\10.txt
文件 122 2017-05-15 17:44 bayes\email\ham\11.txt
文件 172 2017-05-15 17:44 bayes\email\ham\12.txt
文件 164 2017-05-15 17:44 bayes\email\ham\13.txt
文件 162 2017-05-15 17:44 bayes\email\ham\14.txt
文件 522 2017-05-15 17:44 bayes\email\ham\15.txt
文件 90 2017-05-15 17:44 bayes\email\ham\16.txt
文件 454 2017-05-15 17:44 bayes\email\ham\17.txt
文件 168 2017-05-15 17:44 bayes\email\ham\18.txt
文件 151 2017-05-15 17:44 bayes\email\ham\19.txt
文件 232 2017-05-15 17:44 bayes\email\ham\2.txt
文件 204 2017-05-15 17:44 bayes\email\ham\20.txt
文件 229 2017-05-15 17:44 bayes\email\ham\21.txt
文件 324 2017-05-15 17:44 bayes\email\ham\22.txt
文件 601 2017-05-15 17:44 bayes\email\ham\23.txt
文件 42 2017-05-15 17:44 bayes\email\ham\24.txt
文件 88 2017-05-15 17:44 bayes\email\ham\25.txt
文件 364 2017-05-15 17:44 bayes\email\ham\3.txt
文件 205 2017-05-15 17:44 bayes\email\ham\4.txt
文件 113 2017-05-15 17:44 bayes\email\ham\5.txt
文件 1458 2017-05-15 17:44 bayes\email\ham\6.txt
文件 103 2017-05-15 17:44 bayes\email\ham\7.txt
文件 634 2017-05-15 17:44 bayes\email\ham\8.txt
文件 142 2017-05-15 17:44 bayes\email\ham\9.txt
目录 0 2017-08-24 08:34 bayes\email\spam\
文件 235 2017-05-15 17:44 bayes\email\spam\1.txt
............此处省略26个文件信息
评论
共有 条评论