【文智背后的奧秘】系列篇——文本聚類系統


版權聲明:本文由文智原創文章,轉載請注明出處: 
文章原文鏈接:https://www.qcloud.com/community/article/131

來源:騰雲閣 https://www.qcloud.com/community

 

一.文本聚類概述

文本聚類是文本處理領域的一個重要應用,其主要目標是將給定的數據按照一定的相似性原則划分為不同的類別,其中同一類別內的數據相似度較大,而不同類別的數據相似度較小。聚類與分類的區別在於分類是預先知道每個類別的主題,再將數據進行划分;而聚類則並不知道聚出來的每個類別的主題具體是什么,只知道每個類別下的數據相似度較大,描述的是同一個主題。因此,文本聚類比較適合用於大數據中熱點話題或事件的發現。

文智平台提供了一套文本聚類的自動化流程,它以話題或事件作為聚類的基本單位,將描述同一話題或事件的文檔聚到同一類別中。用戶只需要按照規定的格式上傳要聚類的數據,等待一段時間后就可以獲得聚類的結果。通過文本聚類用戶可以挖掘出數據中的熱門話題或熱門事件,從而為用戶對數據的分析提供重要的基礎。本文下面先對文本聚類的主要算法作介紹,然后再具體介紹文智平台文本聚類系統的原理與實現。

二.文本聚類主要算法

文本聚類需要將每個文檔表示成向量的形式,以方便進行相似度的計算。詞袋模型(bag of words,BOW)是文本聚類里面的一種常用的文檔表示形式,它將一個文檔表示成一些詞的集合,而忽略了這些詞在原文檔中出現的次序以及語法句法等要素,例如對於文本“北京空氣重污染拉響黃色預警”,可以表示為詞集{北京,空氣,污染,黃色,預警}。通過詞袋模型將文檔轉化為N維向量,進而構造整個文檔集合的詞語矩陣,就可以使用一些數值運算的聚類算法進行文本聚類。

當然,並不是所有的詞都用來構建文檔的詞向量,可以去掉一些像a、an、the這樣的出現頻率很高而又無實際意義的詞,這樣的詞沒有什么類別區分能力,應作為停用詞而去掉。另外,可以使用TF-IDF等方法來評估一個詞對於文檔的重要程度,保留對文檔較為重要的詞作為詞向量之用。

以詞袋模型為基礎,將文檔表示成N維向量,進而可以利用相關的聚類算法進行聚類計算。常用的文本聚類算法有層次聚類算法、划分聚類算法(例如k-means、k-medoids算法)以及基於主題模型的聚類算法(例如PLSA、LDA)等。

1.層次聚類算法

層次聚類算法是對給定的數據集進行層次的分解,直到達到某個終止條件為止。具體可以分為凝聚和分裂兩種方式。凝聚是自底向上的策略,首先將每個對象作為一個類別,然后根據對象之間的相似度不斷地進行合並,直到所有對象都在一個類別中或是滿足某個終止條件;而分裂則與凝聚相反,用的是自頂向下的策略,它首先將所有對象都放到一個類別中,然后逐漸分裂為越來越小的類別,直到每個對象自成一個類別或是滿足某個終止條件。大多數的層次聚類算法都采用凝聚的方式,這里就以凝聚的方式為例對算法進行介紹。

層次聚類算法的輸入是數據集中所有對象的距離矩陣,並預先設定一個距離閾值,用於迭代的終止,算法的主要步驟如下:

  1. 將每個對象作為一類,類與類之間的距離就是它們所包含的對象之間的距離;
  2. 找出距離最接近的兩個類,如果它們的距離小於,則將它們合並為一類;
  3. 重新計算新的類與所有其它舊類之間的距離;
  4. 重復第2步和第3步,直到所有的類無法再進行合並為止;

其中步驟3中類與類之間距離的計算方法有3種,分別為:

  • Single Linkage:類間距離等於兩類對象之間的最小距離,這種方法計算簡便,但是容易導致兩個類從大范圍看是比較遠的,卻由於個別的點比較近而被合並的情況,而且這種情況還會不斷擴散,最后造成類別比較松散;
  • Complete Linkage:類間距離等於兩類對象之間的最大距離,這種方法有時也不太好,容易導致兩個比較近的類由於存在一些較遠的點而老死不合並;
  • Group-AverageLinkage:類間距離等於兩類對象之間的平均距離,前面兩種方法的不足都是由於只考慮了類內數據的局部情況,而缺乏整體上的考慮,取平均距離能夠改善前面兩種方法的不足,但是計算量相應也有所增加。

層次聚類算法的優點是計算速度較快,並且不需要指定最終聚成的類別個數,但是需要預先指定一個距離閾值作為終止條件,這個距離閾值的設定需要一定的先驗知識。

2. 划分聚類算法

划分聚類算法中有代表性的算法是k-means算法和k-medoids算法,這里以較為常用的k-means算法為代表進行介紹。

k-means算法是基於距離的聚類算法,輸入是數據集中所有文檔的詞向量矩陣,需要預先指定最終聚成的類別個數k,並且還需要指定算法迭代終止的條件,這可以通過指定迭代的次數或是指定前后兩次迭代中k個質心距離變化的總和小於一定閾值作為算法迭代終止的條件。k-means算法的主要步驟如下:

  • 初始條件下,隨機選取k個對象作為初始的質心;
  • 計算每個對象到k個質心的距離,將對象歸到距離最近的質心的類中;
  • 重新計算各個類的質心,取類中所有點的平均值作為該類新的質心;
  • 重復第2步和第3步,直到達到指定的迭代次數或是新舊質心距離變化之和小於指定閾值;

k-means算法需要預先指定聚成類別的數目k,這需要一定的先驗知識,而且算法迭代終止條件的設定也是要根據一定的經驗。另外,算法初始質心的選取會影響到最終的聚類結果,有不少文獻都在研究優化k-means算法初始質心的選取。

3.基於主題模型的聚類算法

基於主題模型的聚類算法是假定數據的分布是符合一系列的概率分布,用概率分布模型去對數據進行聚類,而不是像前面的層次聚類和划分聚類那樣基於距離來進行聚類。因此,模型的好壞就直接決定了聚類效果的好壞。目前比較常用的基於主題模型的聚類算法有LDA和PLSA等,其中LDA是PLSA的一個“升級”,它在PLSA的基礎上加了Dirichlet先驗分布,相比PLSA不容易產生過擬合現象,LDA是目前較為流行的用於聚類的主題模型,這里以LDA為代表介紹基於主題模型的聚類算法。

LDA(Latent Dirichlet Allocation,隱含狄利克雷分配),是一種三層貝葉斯概率模型,它由文檔層、主題層和詞層構成。LDA對三層結構作了如下的假設:

  • 整個文檔集合中存在k個相互獨立的主題;
  • 每一個主題是詞上的多項分布;
  • 每一個文檔由k個主題隨機混合組成;
  • 每一個文檔是k個主題上的多項分布;
  • 每一個文檔的主題概率分布的先驗分布是Dirichlet分布;
  • 每一個主題中詞的概率分布的先驗分布是Dirichlet分布;


圖1 LDA三層模型結構

LDA模型的訓練過程是一個無監督學習過程,模型的生成過程是一個模擬文檔生成的過程,文檔中的一個詞首先是根據一定的主題概率分布抽取出一個主題,然后是從這個主題中以一定的概率分布抽取出一個詞,如此重復,直到生成文檔中所有的詞。LDA在模型中以Dirichlet分布為基本假設,其生成過程如圖2所示。

圖2 LDA的模型生成過程

在實際的應用中,可以通過Gibbs Sampling來對給定的文檔集合進行LDA訓練。首先是用戶需要設定生成的模型的主題個數k,然后是對給定的文檔進行分詞,去掉停用詞,獲得文檔的詞袋模型,作為訓練的輸入。

圖3 使用Gibbs Sampling的LDA訓練過程

LDA中隱含的變量包括文檔的主題分布Θ、主題的詞分布Φ以及詞所屬的主題Z。Gibbs Sampling通過不斷的抽樣與迭代,推算出這些隱含變量。如圖3所示,Gibbs Sampling在初始時隨機給每個詞分配主題z(0),然后統計每個主題z下出現詞t的數量以及每個文檔m下出現主題z中的詞的數量,再計算,即排除當前詞的主題分布,根據其它詞的主題分布來估計當前詞分配到各個主題的概率。當得到當前詞屬於所有主題的概率分布后,再根據這一概率分布為該詞抽樣一個新的主題z(1)。然后用同樣的方法不斷更新下一個詞的主題,直到文檔的主題分布Θ和主題的詞分布Φ收斂或是達到預定的迭代次數為止。最終輸出所有的隱含變量,每個詞所屬的主題也能夠得到。根據每個詞所屬的主題分布,就可以進一步計算出每個文檔所屬的主題及其概率,這就是LDA聚類的結果。

三.文本聚類系統的實現

在上一節中我們介紹了常用的文本聚類算法,其中層次聚類算法和k-means算法等都是基於距離的聚類算法,而LDA則是使用概率分布模型來進行聚類。基於距離的聚類算法的優點是速度比較快,但是它們都是通過兩個文檔共同出現的詞的多少來衡量文檔的相似性,而缺乏在語義方面的考慮。相反,LDA等基於模型的聚類算法能夠通過文本中詞的共現特征來發現其中隱含的語義結構,對“一詞多義”和“一義多詞”的現象都能夠建模,並在聚類結果中得到體現。“一詞多義”就例如“蘋果”一詞,它可能是指水果,可能是指手機,也可能是指公司,LDA能夠將其分配到不同的主題中;而“一義多詞”就例如眾多的同義詞,它們雖然在文本上並不相似,但是在語義上是相似的,LDA能夠將它們聚集到一起。正是由於LDA在語義分析方面的優勢,我們文智平台的聚類系統使用LDA來進行文本聚類。但是LDA在訓練中會比較耗時,單機情況下300萬的文檔數據訓練需要100多個小時,這是不能接受的,因此需要對LDA做並行化計算。

1.基於Spark的LDA並行化計算

Spark是繼Hadoop之后新一代的大數據並行計算框架,是目前大數據分析的利器。相比於傳統的Hadoop MapReduce,Spark將計算時的中間結果寫到內存中,而不是寫磁盤,而且在同一個任務中可以重復利用task對象,而無需重新創建,這使得Spark非常適合應用於類似LDA這樣的需要反復迭代的算法中。

圖4 Spark任務執行總體框架

Spark在任務的執行上也是跟Hadoop類似,通過一定的任務管理器和調度器將任務分配給各個節點來並行化執行,從而能夠取得比單機環境下快數十倍的計算效率,如圖4所示。對於LDA,其訓練過程主要是Gibbs Sampling,目前已經有對LDA中Gibbs Sampling進行並行化的方法。具體地說,就是將訓練數據分成多份,分配給每個節點進行獨立的並行化訓練,訓練完成后再更新全局模型,然后再根據全局模型進行下一輪的迭代訓練,如此重復,直到任務結束,如圖5所示。

圖5 LDA並行化計算

在Spark中實現上述的LDA並行化流程,可以極大地提升LDA的計算效率,訓練300萬的文檔數據由原來的需要100多個小時減少到只需5到6個小時。

2.文本聚類系統整體架構

文智平台文本聚類系統的整體架構如圖6所示,主要分為接入層、計算層和存儲層三層。用戶通過前台頁面按照規定的格式上傳數據文件,然后在計算層首先會對數據進行預處理,去除無效數據,接着使用Spark對數據進行LDA聚類,這是一個反復迭代的過程。用戶可以指定生成的主題個數以及迭代的最大次數,如果用戶不指定我們也會有默認值。LDA聚類得到的結果再經過簡單的統計和排序整理就能夠生成數據中的熱門話題,熱門話題和聚類結果最后會返回給用戶。整個計算層的操作都是無需用戶參與的,用戶只需要上傳數據文件,然后等待一段時間后就可以獲得文本聚類的結果。


圖6 文本聚類系統整體架構

文智平台基於Spark的LDA聚類系統能夠快速而有效地對數據進行聚類,聚類的平均准確率達到80%以上,而且經過對Spark平台的不斷優化,聚類的效率也在不斷提高,表1中所示的是系統目前聚類的性能情況,后續還會在性能方面對系統不斷進行優化。

表1 基於Spark的LDA聚類系統性能情況

四.總結

文智平台文本聚類系統使用Spark對文本數據進行LDA聚類,可以從語義的層面上挖掘出用戶數據中的熱門話題。系統的應用范圍非常廣泛,可以應用於各類文本數據,尤其是對海量社交數據的分析非常有效。這一整套使用LDA進行文本聚類的機制目前已經較為成熟,已經在為公司內的一些部門提供文本聚類服務,我們期待今后系統能得到更為廣泛的應用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM