可以求得某個詞在某種標籤中的概率。
再用貝葉斯公式某個詞出現,他屬於某種標籤的概率。
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元素居多,所佔的比重會很大,所以訓練集中各種標籤所佔比重最大的標籤對結果有很大的導向作用。
解決:減小所佔的比重