实践代码和训练测试数据可以参考这里
https://github.com/stonycat/ML-in-Action
通过概率大小来判断分类结果归属,涉及到概率论的条件概率。
p(ci | x,y)=p(x,y | ci)·p(ci)/p(x,y)
比较p(ci | x,y)的大小(i=1,2……)
1、从文本中构建词向量
#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 = [0,1,0,1,0,1] #1表示侮辱类,0表示不属于
return postingList,classVec #词条切分后的分档和类别标签
运行结果:
2、训练算法
首先导入数据得到listOPosts所有文档和类别;
然后创建一个myVocabList包含所有词不重复的list;
创建一个训练集,然后添加数据并转化为词向量,计算概率。
由于概率都很小,那么相乘之后就更小,会造成四舍五入之后为0,解决这个问题的办法是我们对概率取对数。一下输出为负数的结果是取对数后的值。
#包含所有文档 不含重复词的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(v