在其他資源中,使用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)「。 :?
- 這是實施正確的藍圖是否有改進的餘地
- 當分類的鳴叫(「傷心鬆」),它預計將在課堂上「負」 100%,因爲它只?包含負面的詞,然而拉普拉斯平滑卻使事情變得更加複雜:類pos和neg有相等的概率。是否有解決方法?
如果您正在對推文進行分類,那麼'p(class)=總共有#個詞/總共有#個詞的字詞似乎不正確。它應該是'p(class)=#類/#tweets'中的推文。看起來你的許多問題可能源於你正在分類的問題...... – Xodarap 2012-04-03 15:54:49