之前看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...