張騰岳
(延安大學 數(shù)學與計算機科學學院,陜西 延安 716000)
隨著計算機網(wǎng)絡的普及與發(fā)展,基于互聯(lián)網(wǎng)的各種應用層出不窮,特別是自媒體時代的到來,網(wǎng)絡上出現(xiàn)了類型各異,體量巨大的數(shù)據(jù)和信息,這些數(shù)據(jù)與信息與傳統(tǒng)時代的數(shù)據(jù)有著根本性的不同,非結構化的數(shù)據(jù)占據(jù)了很大的比重,其中包含文檔信息,音頻信息,圖片信息和視頻信息,這些數(shù)據(jù)中往往隱含著豐富的信息,對這些信息的處理已經成為目前計算機領域研究的熱點,對文本信息的挖掘和處理是這些熱點之一。
在文本數(shù)據(jù)挖掘的研究中,有時候需要將文檔劃分成若干個主題,進而可以對文本進行各種的后繼處理。LDA(Latent Dirichlet Allocation,潛在狄利克雷分布)是一種文檔主題生成模型。它能夠將語料庫中的文檔自動劃分為不同的主題,文檔以概率的形式表示該文檔歸屬于某個主題,而每個主題又以不同詞語在該主題中占有的權重給出。LDA模型由于貝葉斯理論的支持,使得該模型被廣泛的應用到文檔分類[1]、文檔聚類[2]、圖像標注[3]、話題檢測[4,5]、推薦系統(tǒng)[6]、情感分析[7,8]、圖書自動分類[9]、文獻檢索[10]、數(shù)據(jù)可視化[11]、用戶畫像[12,13]等不同的領域。
LDA由Blei D M、Ng A Y和Jordan于2003年提出[14]。它是一種文檔主題生成模型,本質上是一個三層貝葉斯概率模型。LDA模型認為一篇文檔包含若干主題,而每個主題又有若干詞語體現(xiàn),因此生成一篇文檔的過程也就包含兩個階段:由文檔到主題,再由主題到詞語。
生成一篇文檔之前,應該先確定這篇文檔包含哪些主題,這些主題的分布是什么,先假設在文檔中包含K個主題,這些主題在文檔中的分布為θm,主題分布符合公式(1)所示的Dirichlet分布。
f(x1,x2,…,xk;x∝1∝2…∝n)=
(1)
其中參數(shù)B(∝)如公式(2)所示。
(2)
其中的Γ是Gamma函數(shù),滿足Γ(x)=(x-1)!,在Dirichlet分布中,向量∝是一個K維向量,與文檔中包含的主題個數(shù)K相同。
在主題的多項式分布θm中取樣生成文檔m第n個詞語的主題Zm,n。多項式分布是Dirichlet的共軛分布。重復上述的步驟,從Dirichlet分布β中取樣生成主題Zm,n對應的詞語分布φZm,n,然后在根據(jù)φZm,n采樣得到最終的詞語Wm,n。
在文檔主題模型生成過程中,兩個Dirichlet分布分別有一個超參數(shù)α和β,參數(shù)α控制了文檔中包含主題的多少,α越高,文檔包含的主題更多。β表示一個主題中詞語的多少,β越大表示主題中包含的詞語越多。
LDA模型生成文檔的過程可以用圖1表示。
圖1 文檔生成過程圖
基于LDA模型求解每一篇文檔的主題分布和每一個主題中詞的分布可以使用兩種方法,第一種是基于Gibbs采樣算法求解,第二種是基于變分推斷EM算法求解。
本文采用gensim工具包提供的LDA模型進行求解,采用的是Gibbs采樣算法。其算法步驟是:
(1)隨機為每一篇文檔的每一個詞W,隨機分配主題編號Z。
(2)統(tǒng)計每個主題Zi下出現(xiàn)字W的數(shù)量,以及每個文檔N中出現(xiàn)主題Zi中的詞W的數(shù)量。
(3)每次排除當前詞W的主題分布Zi,根據(jù)其他所有詞的主題分類,來估計當前詞W分配到各個主題Z1,Z2,Z3,…,Zk的概率,即計算p(zi|z-i,d,w)。得到當前詞屬于所有主題Z1,Z2,Z3,…,Zk的概率分布后,重新為詞采樣分配一個新的主題Zj。用同樣的方法不斷更新這個詞的主題,直到每個文檔下的主題分布θm和每個主題下的詞分布φk收斂。
(4)最后輸出待估計參數(shù),θm和φk,每個單詞的主題Zm,n也可以得到。
經典的LDA算法完全依靠某個詞語Word在一個文檔中出現(xiàn)的頻率,認為詞語Word在文檔中出現(xiàn)的頻率越高表示該詞語Word越重要,但這與實際情況并不完全相符,比如在本文中經常同時出現(xiàn)“文檔主題模型”,分詞后將會是“主題”、“文檔”、“模型”三個詞,這些詞語在文檔中的頻率一樣,但是并不能說明這三個詞語的重要程度是一樣的,為了更加合理、客觀的評價一個詞語的重要程度,所提出的算法采用TF-IDF方法來計算詞語Word的重要程度。
TF-IDF算法除了使用詞頻作為衡量詞語Word重要程度的指標,還引入了逆文檔頻率的概念,逆文檔頻率表示詞語Word在整個語料庫中出現(xiàn)的文檔數(shù)與語料庫中所有文檔的數(shù)量的比值。它表示一個詞語在文檔中出現(xiàn)的次數(shù)越多但是在語料庫中包含該詞語的文檔數(shù)量越少,表示該詞語越重要[15]。
因此,TF概念衡量的是一個詞語在一個文檔中的重要程度,表示的是詞語Word在一個文檔中的局部信息,而IDF概念反映了一個詞語在整體語料庫中的信息,表示的詞語Word的全局信息。
在TF-IDF算法中,TF采用公式(3)來計算:
(3)
逆文檔頻率IDF采用公式(4)
(4)
文檔中每個詞語Word的權重采用公式(5)進行計算:
Wtf=tfi×idfi
(5)
公式(3)的計算表明,如果一個詞語在某個文檔中出現(xiàn)的次數(shù)越多但是在語料庫中包含該詞語的文檔數(shù)量越少,該詞語在該文檔中越重要。
經過分析,詞語Word在文檔中的重要程度比單純的詞頻更具有說服力[16],因此可以使用詞語Word的TF-IDF值代替LDA算法中的詞頻。但大部分的LDA工具包在進行模型訓練的過程中,往往要求詞頻矢量矩陣的值為整數(shù),但詞語Word的TF-IDF值一般都是小數(shù),因此直接用TF-IDF值代替LDA算法的詞頻矢量矩陣的做法是不可取的,需要對TF-IDF值進行適當?shù)淖儞Q,既能保持詞語在文檔重要程度又能符合LDA算法的要求。
一個完整的LDA實現(xiàn)過程如下:
(1)獲取需要處理的數(shù)據(jù),這個數(shù)據(jù)為原生數(shù)據(jù)Raw_Data。
(2)對原生數(shù)據(jù)進行數(shù)據(jù)清洗。由于原生數(shù)據(jù)獲取的途徑等問題,這些數(shù)據(jù)中往往包含有一些噪聲,比如從網(wǎng)頁上抓取的數(shù)據(jù)中可能會包含HTML標簽和數(shù)據(jù)實體等噪聲數(shù)據(jù),在數(shù)據(jù)進一步處理之前必須清除掉這些噪聲。處理掉噪聲后的數(shù)據(jù)稱為字符串類型的語料庫String_Corpus。
(3)對String_Corpus包含的每篇文檔Text進行分詞操作,每個文檔Text處理成為一個詞語Word的列表。在分詞的過程中首先需要加載用戶自定義的詞語庫,詞語庫中的詞語Word在分詞過程中具有更高的優(yōu)先級。比如“延安大學”詞語在分詞的過程中往往會被分為兩個詞語“延安”和“大學”,為了讓其成為一個詞Word,需要在用戶自定義詞語庫中添加“延安大學”。然后去掉一些停用詞,一篇文檔中往往包含有很多“的”、“地”、“得”、“啊”等虛詞,這些詞語對于文檔的主題生成不具有任何意義,所以需要去掉。為了更能體現(xiàn)文檔的意義,還需要根據(jù)詞性過濾掉一些詞,在實現(xiàn)中,本文將詞性為“介詞”、“連詞”、“助詞”、“嘆詞”、“擬聲詞”、“語氣詞”、“處所詞”、“方位詞”、“狀態(tài)詞”、“標點符號”、“None”的詞語舍棄掉。
(4)生成詞袋即字典Dictionary。將String_Corpus分詞得到的詞語裝入詞袋,詞袋中的每個詞語不重復,進行唯一的編號并計算該詞語在整個語料庫中出現(xiàn)的次數(shù)。
(5)生成詞語矢量矩陣Corpus。根據(jù)詞袋Dictionary和String_Corpus生成一個二維矩陣M×N,M是語料庫中文檔的個數(shù),N為詞袋中詞語的個數(shù)。每一篇文檔都轉換稱為一個長度是N的矢量。詞語矢量矩陣Corpus如下。
矩陣中的每一行代表一篇文檔,從詞袋Dictionary取出編號為1的詞語,查看該詞語在該文檔中是否出現(xiàn),如果沒有出現(xiàn),寫入0,否則寫入該詞語在該文檔中出現(xiàn)的次數(shù)。顯然詞語矢量矩陣Corpus是一個稀疏矩陣,如果語料庫中的文檔篇數(shù)巨大,矩陣Corpus將會占用大量的內存空間,所以Corpus采用壓縮格式存儲,一篇文檔壓縮后的矢量存儲如[(1,2)(5,1)(6,1)…(10,2)(21,3)(200,1)]所示。
其中元組(X,Y)表示在字典Dictionary中編號為X的詞語在該文檔中出現(xiàn)了Y次,由于沒有對出現(xiàn)0次的詞語存儲,所以節(jié)省了大量的存儲空間。
(6)根據(jù)Corpus計算每篇文檔的TFIDF值,得到矩陣Corpus_TFIDF.。Corpus_TFIDF矩陣的形式與矢量存儲基本類似,只是原來詞語的詞頻用TFIDF值代替。對矩陣Corpus_TFIDF中的TFIDF值進行適當轉換,使TFIDF值成為整數(shù),得到整數(shù)類型的詞語矢量矩陣Corpus_TF_Int。
(7)根據(jù)得到的Dictionary、Corpus_TF_Int、傳入迭代次數(shù)參數(shù)iterations、主題數(shù)num_topics等參數(shù)開始模型訓練,最后得到LDA模型LdaModel。
(8)對LdaModel模型進行評價。根據(jù)評價指標的提示,調整訓練參數(shù)重新訓練模型,最后得到滿意的模型。
(9)對模型的可視化。
本文采用從網(wǎng)絡上采集的《南方周末》1525篇新聞為數(shù)據(jù)源[17],采用著名的文檔處理工具包gensim進行仿真實驗,模型評價指標使用Topic Coherence[18],超參數(shù)α、β采用工具包中的默認組,對影響模型的迭代次數(shù)和主題數(shù)進行最優(yōu)化測試。
先固定主題數(shù),模型迭代次數(shù)從50開始,每次訓練迭代次數(shù)增加50,一直迭代到2000次結束。圖2是不同迭代次數(shù)對模型的影響。然后固定迭代次數(shù),選擇不同主題數(shù)對模型的影響如圖3所示。
最后算法使用pyLDAvis工具包對LDA模型進行了可視化顯示,如圖4所示。
表1列出了改進后的算法和經典算法隨著算法迭代次數(shù)的變化,模型評價指標Topic Coherence的變化,評價指標Topic Coherence越小表示模型的效果越好。行號是1的表示經典LDA算法的Topic Coherence,行號為2的表示改進算法的Topic Coherence。
圖2 不同迭代次數(shù)對模型的影響
圖3 不同主題數(shù)對模型的影響
圖4 LDA結果可視化顯示
表1 不同迭代次數(shù)不同模型TopicCoherence的比較
通過仿真實驗,可以看出使用TFIDF替換經典的LDA算法的詞語矢量矩陣,可以使得模型的TopicCoherence大幅度減小,按照文獻[18]的描述,文檔對象模型效果應該有很大的改善,但TFIDF不能直接放入LDA模型中,需要先轉換為整數(shù)類型的矩陣。
對模型效果影響的因素很多,包含Dirichlet分布的超參數(shù)α和β,gensim工具包已經進行了優(yōu)化設計,因此可以采用默認值,除此之外對模型訓練效果影響的因素還包含隨機種子數(shù)的設定、模型迭代次數(shù)、主題數(shù)目的選擇,這些參數(shù)的取值都需要根據(jù)原始語料庫的變化而探索獲得。