机器学习的一个重要应用就是文档的自动分类。在文档分类中,整个文档(如一封电子邮件)
是实例,而电子邮件中的某些元素则构成特征。虽然电子邮件是一种会不断增加的文本,但我们同
样也可以对新闻报道、用户留言、政府公文等其他任意类型的文本进行分类。我们可以观察文档中
出现的词,并把每个词的出现或者不出现作为一个特征,这样得到的特征数目就会跟词汇表中的词
目一样多。朴素贝叶斯是上节介绍的贝叶斯分类器的一个扩展,是用于文档分类的常用算法。
(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
词表到向量的转换函数。
该函数的伪代码:
计算每个类别中的文档数目
对每篇训练文档:
对每个类别:
如果词条出现在文档中->增加该词条的计数值
增加所有词条的计数值
对每个类别:
对每个词条:
将该词条的数目除以总词条数目得到条件概率
返回每个类别的条件概率
代码实现:
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
朴素贝叶斯分类函数
四个输入:要分类的向量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
以上代码结束,这样分类器就已经构建完成!!!!可以使用其过滤垃圾邮件