版權聲明:本文由文智原創文章,轉載請註明出處:
文章原文連接:https://www.qcloud.com/community/article/131算法
來源:騰雲閣 https://www.qcloud.com/community架構
文本聚類是文本處理領域的一個重要應用,其主要目標是將給定的數據按照必定的類似性原則劃分爲不一樣的類別,其中同一類別內的數據類似度較大,而不一樣類別的數據類似度較小。聚類與分類的區別在於分類是預先知道每一個類別的主題,再將數據進行劃分;而聚類則並不知道聚出來的每一個類別的主題具體是什麼,只知道每一個類別下的數據類似度較大,描述的是同一個主題。所以,文本聚類比較適合用於大數據中熱點話題或事件的發現。框架
文智平臺提供了一套文本聚類的自動化流程,它以話題或事件做爲聚類的基本單位,將描述同一話題或事件的文檔聚到同一類別中。用戶只須要按照規定的格式上傳要聚類的數據,等待一段時間後就能夠得到聚類的結果。經過文本聚類用戶能夠挖掘出數據中的熱門話題或熱門事件,從而爲用戶對數據的分析提供重要的基礎。本文下面先對文本聚類的主要算法做介紹,而後再具體介紹文智平臺文本聚類系統的原理與實現。oop
文本聚類須要將每一個文檔表示成向量的形式,以方便進行類似度的計算。詞袋模型(bag of words,BOW)是文本聚類裏面的一種經常使用的文檔表示形式,它將一個文檔表示成一些詞的集合,而忽略了這些詞在原文檔中出現的次序以及語法句法等要素,例如對於文本「北京空氣重污染拉響黃色預警」,能夠表示爲詞集{北京,空氣,污染,黃色,預警}。經過詞袋模型將文檔轉化爲N維向量,進而構造整個文檔集合的詞語矩陣,就可使用一些數值運算的聚類算法進行文本聚類。性能
固然,並非全部的詞都用來構建文檔的詞向量,能夠去掉一些像a、an、the這樣的出現頻率很高而又無實際意義的詞,這樣的詞沒有什麼類別區分能力,應做爲停用詞而去掉。另外,可使用TF-IDF等方法來評估一個詞對於文檔的重要程度,保留對文檔較爲重要的詞做爲詞向量之用。學習
以詞袋模型爲基礎,將文檔表示成N維向量,進而能夠利用相關的聚類算法進行聚類計算。經常使用的文本聚類算法有層次聚類算法、劃分聚類算法(例如k-means、k-medoids算法)以及基於主題模型的聚類算法(例如PLSA、LDA)等。大數據
層次聚類算法是對給定的數據集進行層次的分解,直到達到某個終止條件爲止。具體能夠分爲凝聚和分裂兩種方式。凝聚是自底向上的策略,首先將每一個對象做爲一個類別,而後根據對象之間的類似度不斷地進行合併,直到全部對象都在一個類別中或是知足某個終止條件;而分裂則與凝聚相反,用的是自頂向下的策略,它首先將全部對象都放到一個類別中,而後逐漸分裂爲愈來愈小的類別,直到每一個對象自成一個類別或是知足某個終止條件。大多數的層次聚類算法都採用凝聚的方式,這裏就以凝聚的方式爲例對算法進行介紹。優化
層次聚類算法的輸入是數據集中全部對象的距離矩陣,並預先設定一個距離閾值,用於迭代的終止,算法的主要步驟以下:spa
其中步驟3中類與類之間距離的計算方法有3種,分別爲:對象
層次聚類算法的優勢是計算速度較快,而且不須要指定最終聚成的類別個數,可是須要預先指定一個距離閾值做爲終止條件,這個距離閾值的設定須要必定的先驗知識。
劃分聚類算法中有表明性的算法是k-means算法和k-medoids算法,這裏以較爲經常使用的k-means算法爲表明進行介紹。
k-means算法是基於距離的聚類算法,輸入是數據集中全部文檔的詞向量矩陣,須要預先指定最終聚成的類別個數k,而且還須要指定算法迭代終止的條件,這能夠經過指定迭代的次數或是指定先後兩次迭代中k個質心距離變化的總和小於必定閾值做爲算法迭代終止的條件。k-means算法的主要步驟以下:
k-means算法須要預先指定聚成類別的數目k,這須要必定的先驗知識,並且算法迭代終止條件的設定也是要根據必定的經驗。另外,算法初始質心的選取會影響到最終的聚類結果,有很多文獻都在研究優化k-means算法初始質心的選取。
基於主題模型的聚類算法是假定數據的分佈是符合一系列的機率分佈,用機率分佈模型去對數據進行聚類,而不是像前面的層次聚類和劃分聚類那樣基於距離來進行聚類。所以,模型的好壞就直接決定了聚類效果的好壞。目前比較經常使用的基於主題模型的聚類算法有LDA和PLSA等,其中LDA是PLSA的一個「升級」,它在PLSA的基礎上加了Dirichlet先驗分佈,相比PLSA不容易產生過擬合現象,LDA是目前較爲流行的用於聚類的主題模型,這裏以LDA爲表明介紹基於主題模型的聚類算法。
LDA(Latent Dirichlet Allocation,隱含狄利克雷分配),是一種三層貝葉斯機率模型,它由文檔層、主題層和詞層構成。LDA對三層結構做了以下的假設:
圖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作並行化計算。
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個小時。
文智平臺文本聚類系統的總體架構如圖6所示,主要分爲接入層、計算層和存儲層三層。用戶經過前臺頁面按照規定的格式上傳數據文件,而後在計算層首先會對數據進行預處理,去除無效數據,接着使用Spark對數據進行LDA聚類,這是一個反覆迭代的過程。用戶能夠指定生成的主題個數以及迭代的最大次數,若是用戶不指定咱們也會有默認值。LDA聚類獲得的結果再通過簡單的統計和排序整理就可以生成數據中的熱門話題,熱門話題和聚類結果最後會返回給用戶。整個計算層的操做都是無需用戶參與的,用戶只須要上傳數據文件,而後等待一段時間後就能夠得到文本聚類的結果。
圖6 文本聚類系統總體架構
文智平臺基於Spark的LDA聚類系統可以快速而有效地對數據進行聚類,聚類的平均準確率達到80%以上,並且通過對Spark平臺的不斷優化,聚類的效率也在不斷提升,表1中所示的是系統目前聚類的性能狀況,後續還會在性能方面對系統不斷進行優化。
表1 基於Spark的LDA聚類系統性能狀況
文智平臺文本聚類系統使用Spark對文本數據進行LDA聚類,能夠從語義的層面上挖掘出用戶數據中的熱門話題。系統的應用範圍很是普遍,能夠應用於各種文本數據,尤爲是對海量社交數據的分析很是有效。這一整套使用LDA進行文本聚類的機制目前已經較爲成熟,已經在爲公司內的一些部門提供文本聚類服務,咱們期待從此係統能獲得更爲普遍的應用。