1. 程式人生 > >用gensim做LDA實踐之文字分類

用gensim做LDA實踐之文字分類

之前看LDA,一直沒搞懂到底作用是什麼,公式推導了一大堆,dirichlet分佈求了一堆倒數,卻沒有真正理解精髓在哪裡。

最近手上遇到了一個文字分類的問題,採用普通的VSM模型的時候,執行的太慢,後來查詢改進策略的時候,想起了LDA,因此把LDA重新拉回我的視線,也終於弄懂了到底是做什麼的。

LDA本質是一種降維

為什麼這麼說,因為在我的文字分類問題中,文字共有290w個,根據詞項得到的維度為90w個,這樣一個巨大的矩陣【尤其是維度過多】扔到分類器裡,肯定會有各種各樣的問題【比如訓練過慢,過擬合,等等】
因此,LDA的出現,能讓VSM模型的列,由詞項變成“主題”。這也就是主題模型的來歷吧。

文件——主題矩陣

先看一個簡單的:LSI 隱語意索引。基本方法是SVD矩陣分解
從圖片中可以看到,最開始文件——詞矩陣,被分解為兩個矩陣的相乘,其中主題的個數【維度】要遠遠小於詞的維度

現在我們開始分析這兩個矩陣各自長啥樣:
文件——主題矩陣求出來之後,是這樣的
這裡寫圖片描述
在這裡,我定義了200個主題,現只截圖了前25個主題。

需要說明的是,這個是第一個文件的主題分佈。我們可以看到,第一個樣本的第6,第7個主題明顯得分更高一些。至於主題都是“什麼主題”,需要人自己通過“主題——詞”矩陣觀看,並給出
【其實,並不需要定義每個主題是什麼,其實只是一列,並放在分類器裡用就可以了。】

其實,我們降維得到的這個矩陣,就可以放在分類器裡面用了。
LDA得到的主題表徵:
這裡寫圖片描述
LDA神奇之處在於,如果我定義了200個主題,那麼我得到corpus_lda的時候,比如要看第二個樣本的主題,它不會像LSI一樣全部顯示出來,而是選擇性地顯示幾個大的。

主題——詞矩陣

同樣地,如果想看每個主題都有哪些詞,也就是主題——詞矩陣,那麼可以看到:
這裡寫圖片描述

總結

最後,【在文字分類中】其實我們要做的,就是從文字——詞項矩陣變為文字——主題【維度為200】矩陣,通過降維的方式,對文字分類。其中的值由詞項的TF-IDF值變為了主題的權重得分值。

附上整個lda的過程的步驟和程式碼:

第一步,把待轉換成詞袋的詞變成需要的型別

value_list以逗號隔開

通過學習value_list得到我們的字典。【注意:value_list的格式】

第二步:把所有文件根據字典轉換成VSM

這裡寫圖片描述

現在得到的corpus利用了字典,把每一個文件變成了一個一個tuple組合的形式,key為ID,value為出現的頻數

第三步,把頻數變為tfidf值【用corpus訓練】

這裡寫圖片描述

此時,可以轉換一個文件,方法:先用dictionary的dic2bow方法變成詞頻,再把詞頻變為tfidf頻率

第四步:用訓練好的tfidf把測試文件變為tfidf格式

這裡寫圖片描述

第五步:把規整後的tfidf矩陣放進LSI,LDA模型中

這裡寫圖片描述

所以說實際上沒有做輿情的話,我是沒有用到主題——詞項矩陣的。這個充其量是讓我理解“這個主題是講的什麼東西”。

另外,多說一句。短文字【標籤,名稱】並不適合做LDA,因為一個文件裡的標籤太少了,LDA並不能發揮其真正效果