2012-04-03 46 views
4

在其他資源中,使用Stackoverflow中的各種帖子,我嘗試實現自己的PHP classier,將推文分爲正面,中性和負面類。在編碼之前,我需要讓這個過程變得簡單。我的列車的深思熟慮和示例如下:使用樸素貝葉斯分類器對推文進行分類:一些問題

        p(class) * p(words|class) 
Bayes theorem: p(class|words) = ------------------------- with 
              p(words) 

assumption that p(words) is the same for every class leads to calculating 
arg max p(class) * p(words|class) with 
p(words|class) = p(word1|class) * p(word2|topic) * ... and 
p(class) = #words in class/#words in total and 

       p(word, class)      1 
p(word|class) = -------------- = p(word, class) * -------- = 
        p(class)      p(class) 

#times word occurs in class #words in total #times word occurs in class 
--------------------------- * --------------- = --------------------------- 
     #words in total   #words in class  #words in class 

Example: 

------+----------------+-----------------+ 
class | words   | #words in class | 
------+----------------+-----------------+ 
pos | happy win nice | 3    | 
neu | neutral middle | 2    | 
neg | sad loose bad | 3    | 
------+----------------+-----------------+ 

p(pos) = 3/8 
p(neu) = 2/8 
p(meg) = 3/8 

Calculate: argmax(sad loose) 

p(sad loose|pos) = p(sad|pos) * p(loose|pos) = (0+1)/3 * (0+1)/3 = 1/9 
p(sad loose|neu) = p(sad|neu) * p(loose|neu) = (0+1)/3 * (0+1)/3 = 1/9 
p(sad loose|neg) = p(sad|neg) * p(loose|neg) =  1/3 *  1/3 = 1/9 

p(pos) * p(sad loose|pos) = 3/8 * 1/9 = 0.0416666667 
p(neu) * p(sad loose|neu) = 2/8 * 1/9 = 0.0277777778 
p(neg) * p(sad loose|neg) = 3/8 * 1/9 = 0.0416666667 <-- should be 100% neg! 

正如你所看到的,我已經「訓練有素」的分類與正(「快樂贏得漂亮」),中性(「中性中間」 )和負面(「悲傷鬆散的壞」)推文。爲了防止由於所有類中缺少一個詞而導致概率爲零的問題,我使用LaPlace(或äddone「)平滑,請參見」(0 + 1)「。 :?

  1. 這是實施正確的藍圖是否有改進的餘地
  2. 當分類的鳴叫(「傷心鬆」),它預計將在課堂上「負」 100%,因爲它只?包含負面的詞,然而拉普拉斯平滑卻使事情變得更加複雜:類pos和neg有相等的概率。是否有解決方法?
+1

如果您正在對推文進行分類,那麼'p(class)=總共有#個詞/總共有#個詞的字詞似乎不正確。它應該是'p(class)=#類/#tweets'中的推文。看起來你的許多問題可能源於你正在分類的問題...... – Xodarap 2012-04-03 15:54:49

回答

3

在推理過程中有兩個主要因素需要改進。

首先,你要提高你的平滑方法:

  • 在應用拉普拉斯平滑,應適用於所有的測量,而不僅僅是那些與零的分母。
  • 另外,對於這種情況的拉普拉斯平滑通常由(c + 1)/(N + V)給出,其中V是詞彙大小(例如參見Wikipedia)。

因此,使用已確定的概率函數(這可能不是最合適的,見下文):

p(sad loose|pos) = (0+1)/(3+8) * (0+1)/(3+8) = 1/121 

p(sad loose|neu) = (0+1)/(3+8) * (0+1)/(3+8) = 1/121 

p(sad loose|neg) = (1+1)/(3+8) * (1+1)/(3+8) = 4/121 <-- would become argmax 

此外,在所述第一位置計算所述概率的更常見的方法,將是:

(number of tweets in class containing term c)/(total number of tweets in class) 

例如,在以上給出的,和不考慮平滑,對有限的車組(悲傷| POS)= 0/1 = 0,且p(悲傷| NEG)= 1/1 = 1.當火車組大小增加時,數字將更加平均ngful。例如如果你對負面課堂有10條推文,其中4條出現「悲傷」,那麼p(悲傷|否定)將是4/10。

關於由樸素貝葉斯算法輸出的實際數量:您不應該期望算法爲每個類分配實際概率;相反,類別順序更重要。具體而言,使用argmax會爲您提供該算法對該類的最佳猜測,但不會給出該算法的可能性。給NB結果分配概率是另一回事;例如,請參閱討論此問題的article

相關問題