可以求得某个词在某种标签中的概率。
再用贝叶斯公式某个词出现,他属于某种标签的概率。
w是一个向量,他的大小是一个包括所有用户搜索词的词集大小
在计算一个用户输入一个搜索词向量是多少时,只需要计算每个标签在w向量是的条件概率,i=1,2…..k,k为标签的个数。
条件概率可以用贝叶斯公式求出。
和很容易求出,只需要遍历所有用户的搜索条就行。
求
def trainNB_Gender(trainMatrix,trainCategory):#朴素贝叶斯分类器训练函数
numTrainSearcher=len(trainMatrix)#一共多少个搜索者
numWords=len(trainMatrix[0])#一个搜索者所拥有的词向量长度
p0=count_IntofList('0',trainCategory)/float(numTrainSearcher)#计算标签中各种性别的比例
p1=count_IntofList('1',trainCategory)/float(numTrainSearcher)
p2=count_IntofList('2',trainCategory)/float(numTrainSearcher)
p0Num=ones(numWords);p1Num=ones(numWords);p2Num=ones(numWords)
p0Denom=2.0;p1Denom=2.0;p2Denom=2.0
for i in range(numTrainSearcher):
if trainCategory[i]==0:
p0Num+=trainMatrix[i]
p0Denom+=sum(trainMatrix[i])
elif trainCategory[i]==1:
p1Num+=trainMatrix[i]
p1Denom+=sum(trainMatrix[i])
else:
p2Num+=trainMatrix[i]
p2Denom+=sum(trainMatrix[i])
p0Vect=log(p0Num/p0Denom)
p1Vect=log(p1Num/p1Denom)
p2Vect=log(p2Num/p2Denom)
return p0Vect,p1Vect,p2Vect,p0,p1,p2
得到的python代码(即判断标签的代码):
def classifyNB_Gender(vec2Classify,p0Vect,p1Vect,p2Vect,p0_,p1_,p2_):
# print 'start-------------------start'
p0=sum(vec2Classify*p0Vect)+log(p0_)
p1=sum(vec2Classify*p1Vect)+log(p1_)
p2=sum(vec2Classify*p2Vect)+log(p2_)
# print p0,' ',p1,' ',p2
# print 'end--------------------end'
return (('0' if p0>p2 else '2') if p0>p1 else ('1' if p1>p2 else '2'))
问题与拟解决方法:
1.当用户的训练集成倍增加时,因为新增用户会加入一些新的词,所以词集也会成倍增加,向量w也会成倍增加,导致计算时间幂次增加
解决:计算词频,去掉频次为1,长度为1的中文词
2.当训练集比较小时,这是w已经很大了而且0元素居多,所占的比重会很大,所以训练集中各种标签所占比重最大的标签对结果有很大的导向作用。
解决:减小所占的比重