當前位置:成語大全網 - 書法字典 - 如何使用mahout對文檔進行lda主題分析

如何使用mahout對文檔進行lda主題分析

使用sqoop將數據從MySQL導入到HDFS,使用mahout的LDA的cvb對輸入的數據進行聚類,並將結果更新到數據庫。數據流程圖如下

Mahout算法分析

輸入數據格式

算法相關參數的詳細說明(不包括hadoop運行參數)

項目中的所有參數設置與mahout-0.9目錄下examples/bin/cluster-Reuters . sh中的147-172行相同,即

$ SCOUT cv B- I $ { WORK _ DIR }/$ { ROWID _ MATRIX _ DIR }/MATRIX-o $ { WORK _ DIR }/$ { LDA _ DIR }-k 20-ow-x 20-dict $ { WORK _ DIR }/$ { DICTIONARY _ FILES }-dt $ { WORK _ DIR }/$ { LDA _ TOPICS _ DIR }-mt $ { WORK _ DIR }/$ { LDA _ MODEL _ DIR }

Input -輸入數據的hdfs路徑,這裏是/home/Hadoop-user/scout _ workspace/scout/dataset/Reuters-out-matrix-debug/matrix。

Dt -文檔主題輸出路徑,保存每個文檔對應主題的概率,這裏是/home/Hadoop-user/scout _ workspace/scout/dataset/Reuters-LDA-topics。

mt - model的路徑,這裏是/home/Hadoop-user/scout _ workspace/scout/dataset/Reuters-LDA-debug。

K -要學習的主題數量,這裏設置為20。

X -模型的叠代次數,即生成最終模型需要多少次叠代。默認值為20。

Seed - Random seed,生成初始readModel時的種子,默認值為System.nanoTime()% 10000。

Dict - dictionary路徑,這裏是/home/Hadoop-user/scout _ workspace/scout/dataset/Reuters-out-seqdir-sparse-LDA/dictionary . file-*

a-對於文檔/主題分布的平滑,文檔/主題分布的平滑系數,默認為1.0E-4。

E-平滑對於topic/$ TERM分布,默認情況下,topic/$ TERM分布的平滑系數為1.0E-4。

至於A和E,根據描述,A和E的合適值是k/50(k是話題數),但是這個網頁仍然保留了對mahout ldatopics命令的介紹,而Mahout 0.8和Mahout 0.9沒有這個命令,所以應該是老內容了,所以還是基於cluster-reuters.sh中的設置,也就是采用了默認值。

mipd——這個參數非常重要。對於每個文檔程序,RandomSeed用於生成初始readModel,然後執行mipd叠代來計算用於更新的最終模型。這裏的默認值是10次。

LDA算法的程序分析

該算法的壹般流程如下

1.解析參數和配置設置

2.讀取模型(第壹次運行時沒有這個過程)

如果hfds上有壹些模型,程序會讀取最後壹個模型,並將這個模型作為初始readModel繼續算法叠代,也就是說有壹個類似斷電重啟的機制。

3.運行算法叠代(映射器過程)以生成LDA模型。

這個過程是最復雜的階段,很多地方我不太懂。我會盡力解釋。

首先,映射器,CachingCVB0Mapper,顧名思義,是壹個可以緩存的映射器,表現在其readModel的選擇上。如果目錄中沒有模型,readModel用RandomSeed初始化,否則讀取最新的模型。程序將model分為readModel和writeModel,兩者都是TopicModel類,由ModelTrainer調度和管理。

CachingCVB0Mapper的整個過程如下圖所示(清晰大圖見附件)。

在上述總體框架下,mahout程序使用CVB0算法計算LDA模型。在映射過程中,叠代求解向量docTopic和矩陣docTopicModel。計算每個文檔的docTopicModel,並在更新writeModel階段添加docTopicModel矩陣的向量。經過所有的映射過程,得到了整個語料庫的docTopicModel矩陣。最後,主題的索引被用作鍵,矩陣docTopicModel被寫為清除過程中的值。該過程中涉及的算法如下

CVB0算法分析圖(清晰大圖見附件)

4.利用生成的LDA模型推導出話題的概率分布。

算法總結

可以看出,算法的本質是貝葉斯公式和EM算法的結合。

E-process就是假設壹個均勻分布且歸壹化的話題概率分布向量docTopics,用這個值通過貝葉斯公式計算出詞-話題概率分布矩陣docTopicModel(見CVB0算法分析圖第壹步)。

m過程是根據生成的docTopicModel重新計算CVB0算法分析圖中的2、3、4、5步,得到新的docTopics。

然後重復E-M過程n次,得到收斂的docTopics和docTopicModel,其中docTopicModel可以用來更新lda模型,docTopics是我們聚類所需的主題概率分布向量。

算法的後記

有幾個問題沒有解決。

1.在mahout中,docTopicModel是根據下面的公式計算的。

double termTopicLikelihood =

(topictermrow . get(termIndex)+eta)*(topicWeight+alpha)/(topic sum+eta * num terms);

問題是這個公式在貝葉斯公式中增加了幾個平滑系數項,這種寫法的理論依據在哪裏,出自哪本書或哪篇論文,平滑系數eta和alpha分別代表什麽,這兩個系數如何選擇。

2.CVB0算法分析了圖中第二步歸壹化的理論基礎,即為什麽需要歸壹化。

3.3.update writeModel過程中topicTermCounts的計算

也就是為什麽P (topic | $ TERM)要在每壹張地圖上累加,這個還沒有完全理解。

項目運行環境

hadoop-1.2.1

sqoop-1.4.4

看象人-0.9

環境的安裝部署請參考相關文章,這裏就不贅述了。以上三個軟件都部署在/home/Hadoop-user/mahout _ workspace/目錄下。另外,自己寫的scout項目部署在目錄/home/Hadoop-user/scout _ workspace/

項目代碼

項目代碼已經放到Github上了。有興趣的同學可以下載看看,重點是bin目錄下的腳本文件和驅動、導出、解析器等幾個包中的java文件。

整個項目架構的分析

這個項目的初始數據保存在MySQL中。算法分析需要map/reduce進程和hdfs文件系統的參與,最終結果更新到MySQL。整個過程如圖。