用gensim做LDA實踐之文字分類

2021-07-14 02:19:42 字數 2015 閱讀 2962

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

最近手上遇到了乙個文字分類的問題,採用普通的vsm模型的時候,執行的太慢,後來查詢改進策略的時候,想起了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的格式】

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

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

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

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

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

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

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

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

Impala實踐之十五 Impala使用文件

由於前期大家使用impala的時候都比較隨意,再加上對impala的原理不清楚,因此在使用的過程中對impala帶來了很大的壓力。經過前段時間的研究和實驗。我整理了乙份impala使用文件,供組內小夥伴使用。只有通過hdfs增加或刪除分割槽中檔案後,才需要人為更新元資料,其餘情況依賴impala自帶...

go實踐之swagger自動生成api文件

作為乙個後端開發,給前端提供api介面是必須的。手動去寫文件不是乙個程式設計師的風格。swagger就是乙個很好的api文件生成該工具,go當然也支援了。下面看看怎麼使用這個工具。安裝gin swagger,用來整合到我們前一篇文章go實踐之apiserver搭建實現的apiserver當中去。在r...

用Python做50道ACM之《土地劃分》

劃分的區塊數 四邊的交點數 中間的交點數 和四邊重疊的邊的邊數 import sys defcount lands long wide,line num len position list 1 line table sideways 0 dots 0for i in range 1 line num...