通過文章主題做文本分類的理論依據
直觀來講,如果一篇文章有一個中心思想,那么一些特定詞語會更頻繁的出現。比方說,如果一篇文章是在講貓的,那"貓"和"魚"等詞出現的頻率會高些,如果一篇文章是在講狗的,那"狗"和"骨頭"等詞出現的頻率會高些。而有些詞例如"這個"、"和"大概在兩篇文章中出現的頻率會大致相等。但真實的情況是,一篇文章通常包含多種主題,而且每個主題所占比例各不相同。因此,如果一篇文章10%和貓有關,90%和狗有關,那么和狗相關的關鍵字出現的次數大概會是和貓相關的關鍵字出現次數的9倍。
- 由於上面的理論基礎,在文本分析中就有了基於文章主題的分類方法。
主題模型是用來在一系列文檔中發現抽象主題(topic)的一種統計模型(在機器學習PAI平台,我們給PLDA組件設置topic參數值為50,表示讓每篇文章抽象出50個主題)。
主題模型核心思想:數學框架(統計+概率)
主題模型試圖用數學框架來體現文檔的這種特點。主題模型自動分析每個文檔,統計文檔內的詞語,根據統計的信息來斷定當前文檔含有哪些主題,以及每個主題所占的比例各為多少。
- 下面說一種最經典的主題模型-LDA(隱含狄利克雷分布)
LDA(Latent Dirichlet allocation),是一種主題模型,它可以將[文檔集]中每篇文檔的主題按照概率分布的形式給出,從而通過分析一些文檔抽取出它們的主題,然后根據主題給文本分類。它是一種無監督學習算法,在訓練時不需要手工標注的訓練集,需要的僅僅是文檔集以及指定主題的數量k(這個K就是PLDA參數topic)即可。
- 目前機器學習PAI平台文本分析組件PLDA,它是Google對LDA的開源實現。
語料生成過程(語料就是我們需要分析的所有文本,即文本集)
假設語料庫中有M篇文檔(在這里我們定義:z是主題, w是詞, d是文檔),其中W(m)表示第m篇文檔中的詞,Z(m)表示這些詞對應的topic編號。所有的word和對應的topic如下表示:
紅色方框內即表示一篇文檔是由若干個詞組成的,每個詞都對應一個主題。(就像一篇文章所有的詞都是為了更好的表達主題而存在的)
- 下面我們思考當寫一篇文章時你是怎么做的。
假設你要寫一篇文章,首先想好了主題(一個或多個),然后圍繞這幾個主題(比如"Arts""Budgets""Children""Education")你會想到很多與之相關的詞:
最后我們就是用這些和主題相關的詞完成了一篇文章,就像下圖一樣,不同的顏色代表不同主題下的詞,從顏色能看出每個主題的下面的詞出現概率是不相同的:
上面的這個案例是我們在確定主題和詞之后生成文章的步驟。然后偉大的數學家把這個過程抽象成了概率分布問題(關於如何抽象,當然是一大堆假設和公式推導,最后得出結論)
生成這篇文章可以看作如下過程:
首先以一定的概率在"Arts"、"Budgets"、"Children"、"Education"中選擇一個主題
然后再以一定的概率在這個主題下選擇某個單詞
不斷重復以上兩個步驟,最終完成一篇文章
這里的兩次"以一定的概率",后面會有解釋。
- 通過上面的分析,我們知道了文章生成過程,下來來說LDA模型
《LDA數學八卦》中把文檔生成過程抽象成了一個游戲,主要是為了解決剛才我們說的"以一定概率"的問題。上帝有兩種類型骰子:
上面紅框里面內容是說,每個doc-topic骰子是一篇文章的所有主題。
上帝在LDA模型中,玩文檔生成游戲的規則是這樣的:
這個文檔生成規則可以看作如下過程:
首先上帝有兩大壇骰子
第一壇裝的是doc-topic骰子,就是和所有文檔相關的所有主題;
第二壇裝的是topic-word骰子,就是和所有主題相關的所有單詞;
開始文檔生成游戲
隨機從topic-word壇子獨立抽取K個骰子,編號為1,2,3…k
隨機從doc-topic壇子抽取一個骰子,然后重復如下過程生成文檔中的詞:
投擲doc-topic骰子,得到一個topic編號z
投擲剛才K個骰子中選擇編號為z的那個骰子,得到一個詞
每次都是先生成一篇文檔之后再生成第二篇,文檔中每個詞的生成都要投擲兩次骰子,第一次投擲doc-topic骰子得到一個topic,第二次投擲topic-word骰子得到一個word,就是說生成文檔中的一個詞要投擲2次。如果語料中有N個詞,那么上帝要拋2N次,輪換拋doc-topic和topic-word。實際上一些投擲順序是可以交換的(這里有很多公式推導,最終得到這個順序可以交換),我們可以等價交換這2N次投擲順序,先拋N次doc-topic骰子,得到語料中所有詞的topic,然后基於每個topic的編號,再拋N次topic-word骰子得到語料中所有word。
於是上帝的游戲規則就變成了這樣:
這個過程是這樣的:
隨機從topic-word壇子獨立抽取K個骰子,編號為1,2,3…k
隨機抽取一個doc-topic骰子,然后拋出得到一個主題z,再次抽取doc-topic骰子,再拋出,得到一個主題z(注意:由於是再次抽取,所以不一定還是之前那篇文檔的主題);重復這個步驟就能得到語料中所有文檔主題
從頭到尾拋我們抽到的doc-topic骰子,從最開始抽到的topic-word骰子中取相應編號(在1到k中拿)的骰子拋出,得到對應的word
以面的過程是先生成了語料中所有的topic,然后生成了所有的word。在topic生成的情況下word順序是可以交換的,即如果確定了topic k,就算和它相關的word不在同一篇文章中,也是可以交換的。
...數學家們做了假設和分析,搞懂了原理,他們決定把這些用公式表示,於是就算啊算,用到了貝葉斯、Dirichlet-Multionmial共軛結構、Gibbs-Sampling采樣(一堆公式)最終...
牛X的數學家(神)得到了一個公式:
這里面z,i,k,t,v,m...只要知道都是一系列參數就行,比如文檔編號、topic編號、word編號、第k個topic產生的詞中word t的個數、文章數量...
這個公式右邊就是p(topic|word)*p(word|topic),概率就是doc-->topic-->word的路徑概率:
接下來任務有兩個:
這里用到了Gibbs-Sampling公式,它的意義就是在k條路徑中采樣,基於語料訓練LDA模型,模型中參數可以基於采集到的樣本進行評估(我們做這些都是為了得到上面式子的參數)。
下面是訓練過程:
由這個topic-word頻率矩陣我們可以計算出每一個p(word|topic)概率。
Gibbs-Sampling收斂后統計每篇文檔中topic的頻率分布就可以計算出p(topic|doc)的概率。(PAI平台PLDA組件有六個輸出樁后面會解釋)
LDA的核心公式如下:
P(word|doc)=p(word|topic)*p(topic|doc)
通過計算可以得到任意一個topic對應文檔d中單詞w出現的概率,通過這個概率不斷修正我們的參數。
- 有了模型,接下來做的就是對於新來的文檔doc(new)計算topic語義分布。
下面是具體計算過程:
迭代過程即:首先產生一個均勻分布的隨機數,然后根據上式計算每個轉移主題的概率,通過累積概率判斷隨機數落在哪個new topic下,更新參數矩陣,如此迭代直至收斂。
-
回到我們機器學習PAI,先看下PLDA模塊的6個輸出樁
-
輸出樁1:詞頻,算法內部抽樣后每個詞在主題出現次數
-
輸出樁2:P(單詞|主題)每個主題下詞的概率
-
輸出樁3:P(主題|單詞)每個單詞對應各個主題的概率
-
輸出樁4:P(文檔|主題)每個主題對應各個文檔的概率
-
輸出樁5:P(主題|文檔)每個文檔對應主題的概率
-
輸出樁6:P(主題)每個主題的概率,表明在整個文檔中的權重
通過上面的公式推導,計算出關鍵的幾個概率,通過貝葉斯公式這幾個值都是可以算出來的。
第5個是輸出樁輸出結果顯示的是每篇文章對應的每個主題的概率,而這個概率在上面通過p(topic|doc)已經算出。
在實驗中我們設置參數topic=50,這個主題數是相對整個語料庫而言的,我們最后看到的結果是這50個主題在每一篇文章上的分布情況。其它默認即可。對於默認的幾個參數給予功能性的說明:
我們將文章id列和主題概率分布列,得到每個主題在每篇文章的概率分布如下圖所示:
上面把文章從主題的維度表示成了一個向量。接下來就可以通過向量的距離實現聚類,從而實現文章分類。
關於是如何聚類的下一篇文章會給詳細解釋過程。