本文介紹樸素貝葉斯算法如何對文本進行分類。好比,每一個用戶的購物評論就是一篇文本,識別出這篇文本屬於正向評論仍是負面評論 就是分類的過程,而類別就是:{正面評論,負面評論}。正面評論爲Positive,用標識符'+'表示;負面評論爲Negative,用標識符'-'表示。html
一,分類目標web
尋找文本的某些特徵,而後根據這些特徵將文本歸爲某個類。算法
The goal of classification is to take a single observation, extract some useful
features, and thereby classify the observation into one of a set of discrete classes.
使用監督式機器學習方法對文本進行分類:首先假設已經有分好類的N篇文檔:(d1,c1)、(d2,c2)、(d3,c3)……(dn,cn)機器學習
di表示第i篇文檔,ci表示第i個類別。目標是:尋找一個分類器,這個分類器可以:當丟給它一篇新文檔d,它就輸出d (最有可能)屬於哪一個類別cide
二,分類器的介紹函數
①Generative classifierpost
樸素貝葉斯分類器屬於Generative classifier。 學習
②Discriminative classifier測試
邏輯迴歸屬於Discriminative classifier。ui
Generative classifiers like naive Bayes build a model of each class. Given an observation,they return the class most likely to have generated the observation.
Discriminative classifiers like logistic regression instead learn what features from the input are most useful to discriminate between the different possible classes.
三,詞袋模型(Bag Of Words)
前面提到,文本分類須要尋找文本的特徵。而詞袋模型就是表示文本特徵的一種方式。給定一篇文檔,它會有不少特徵,好比文檔中每一個單詞出現的次數、某些單詞出現的位置、單詞的長度、單詞出現的頻率……而詞袋模型只考慮一篇文檔中單詞出現的頻率(次數),用每一個單詞出現的頻率做爲文檔的特徵(或者說用單詞出現的頻率來表明該文檔)。詞袋模型的示意圖以下:
We represent a text document as if it were a bag-of-words,
that is, an unordered set of words with their position ignored, keeping only their frequency in the document.
四,樸素貝葉斯分類器
樸素貝葉斯分類器是一個機率分類器。假設現有的類別C={c1,c2,……cm}。給定一篇文檔d,文檔d最有可能屬於哪一個類呢?這個問題用數學公式表示以下:
(公式一)
c^ 就是:在全部的類別C={c1,c2,……cm} 中,使得:條件機率P(c|d)取最大值的類別。使用貝葉斯公式,將(公式一)轉換成以下形式:
(公式二)
對類別C中的每一個類型,計算 [p(d|c)*p(c)]/p(d) 的值,而後選取最大值對應的那個類型ci ,該ci就是最優解c^,所以,能夠忽略掉分母 p(d),(公式二)變成以下形式:
(公式三)
這個公式由兩部分組成,前面那部分P(d|c) 稱爲似然函數,後面那部分P(c) 稱爲先驗機率。
前面提到使用詞袋模型來表示 文檔d,文檔d的每一個特徵表示爲:d={f1,f2,f3……fn},那麼這裏的特徵fi 其實就是單詞wi 出現的頻率(次數),公式三轉化成以下形式:
(公式四)
對文檔d 作個假設:假設各個特徵之間是相互獨立的。那麼p(f1,f2……fn|c)=p(f1|c)*p(f2|c)*……*p(fn|c),公式四轉化成以下形式:
(公式五)
因爲每一個機率值很小(好比0.0001)若干個很小的機率值直接相乘,獲得的結果會愈來愈小。爲了不計算過程出現下溢(underflower),引入對數函數Log,在 log space中進行計算。而後使用詞袋模型的每一個單詞wi 出現頻率做爲特徵,獲得以下公式
(公式六)
五,訓練樸素貝葉斯分類器
訓練樸素貝葉斯的過程其實就是計算先驗機率和似然函數的過程。
①先驗機率P(c)的計算
P(c)的意思是:在全部的文檔中,類別爲c的文檔出現的機率有多大?假設訓練數據中一共有Ndoc篇文檔,只要數一下類別c的文檔有多少個就能計算p(c)了,類別c的文檔共有Nc篇,先驗機率的計算公式以下:
(公式七)
【先驗機率 其實就是 準備幹一件事情時,目前已經掌握了哪些信息了】關於先驗信息理解,可參考:這篇文章。
For the document prior P(c) we ask what percentage of the documents in our training set are in each class c.
Let Nc be the number of documents in our training data with
class c and Ndoc be the total number of documents
②似然函數P(wi|c)的計算
因爲是用詞袋模型表示一篇文檔d,對於文檔d中的每一個單詞wi,找到訓練數據集中全部類別爲c的文檔,數一數 單詞wi在這些文檔(類別爲c)中出現的次數:count(wi,c)
而後,再數一數訓練數據集中類別爲c的文檔一共有多少個單詞。計算 兩者之間的比值,就是似然函數的值。似然函數計算公式以下:
(公式八)
其中V,就是詞庫。(有些單詞在詞庫中,可是不屬於類別C,那麼 count(w,c)=0)
Here the vocabulary V consists of the union of all the word types in all classes, not just the words in one class c.
從上面計算似然函數的過程來看,其實至關於一個發掘(統計)潛藏規律的過程。
六,unknow words的情形
假設只考慮文本二分類:將文檔分紅 positve類別,或者negative類別,C={positive, negative}
在訓練數據集中,類別爲positive的全部文檔 都沒有 包含 單詞wi = fantastic(fantastic可能出如今類別爲negative的文檔中)
那麼 count(wi=fantastic,ci=positive)=0 。那麼:
而注意到前面公式五中的累乘,整篇文檔的似然函數值爲0,也就是說:若是文檔d中有個單詞fantastic在類別爲c的訓練數據集文檔中從未出現過,那文檔d被分類到類別c的機率爲0,儘管文檔d中還有一些其餘單詞(特徵),而這些單詞所表明的特徵認爲文檔d應該被分類 到 類別c中
But since naive Bayes naively multiplies all the feature likelihoods together, zero
probabilities in the likelihood term for any class will cause the probability of the
class to be zero, no matter the other evidence!
解決方案就是 add-one smoothing。(不介紹了),其實就是將「出現次數加1」。似然函數公式變成以下形式:
(公式九)
其中|V|是詞庫中全部單詞的個數。
七,樸素貝葉斯分類示例
假設訓練數據集有五篇文檔,其中Negative類別的文檔有三篇,用符號 '-' 標識;Positive類別的文檔有二篇,用符號 '+' 標識,它們的內容以下:
- just plain boring
- entirely predictable and lacks energy
- no surprises and very few laughs
+ very powerful
+ the most fun film of the summer
測試數據集T 有一篇文檔dt,內容以下:
predictable with no fun
樸素貝葉斯分類器會把「predictable with no fun」歸爲哪一個類呢?根據第五節「訓練樸素貝葉斯分類器」,須要計算先驗機率和似然函數。
因爲訓練數據集中一共有5篇文檔,其中類別 '+' 的文檔有2篇,類別爲 '-' 的文檔有3篇,所以先驗機率:P(c)=P('-')=Nc/Ndoc=3/5=0.6
類別爲'+' 的文檔有2篇,故 P(c)=P('+')=Nc/Ndoc=2/5=0.4
對測試數據集文檔dt中的每一個單詞,似然函數採用「add-one smoothing」處理,計算相應的似然機率:
首先單詞 predictable 在訓練數據集中 類別爲'-'的文檔中只出現了1次,類別爲'-'的文檔一共有14個單詞,訓練數據集中兩種類型的文檔加起來一共有23個單詞,可是有三個單詞(and、
very、the)重複出現了兩次,故詞庫V的大小爲 20。所以單詞predictable對應的似然機率以下:
p(predictable|'-')=(1+1)/(14+20)=2/34
同理:p(predictable|'+')=(0+1)/(9+20)=1/29 (predictable沒有在類別爲'+'的訓練數據集中出現過)
相似地:p(no|'-')=(1+1)/(14+20) p(no|'+')=(0+1)/(9+20)
p(fun|'-')=(0+1)/(14+20) p(fun|'+')=(1+1)/(9+20)
所以,測試集中的文檔d歸類爲 '-' 的機率爲:0.6 * (2*2*1)/343 = 6.1*10-5
測試集中的文檔d歸類爲 '+' 的機率爲:0.4*(1*1*2)/293 =3.2*10-5
比較上面兩個機率的大小,就能夠知道將「predictable with no fun」歸爲 '-' 類別。
八,參考資料
CS 124: From Languages to Information