引言
近年來涌現出越來越多的非結構化數據,我們很難直接利用傳統的分析方法從這些數據中獲得信息。但是新技術的出現使得我們可以從這些輕易地解析非結構化數據,并提取出重要信息。
主題模型是處理非結構化數據的一種常用方法,從名字中就可以看出,該模型的主要功能就是從文本數據中提取潛在的主題信息。主題模型不同于其他的基于規則或字典的搜索方法,它是一種無監督學習的方法。
主題可以由語料庫中的共現詞項所定義,一個好的主題模型的擬合結果應該如下所示——“health”、“doctor”、“patient”、“hospital”構成醫療保健主題,而“farm”、“crops”、“wheat”則構成農業主題。
主題模型的適用領域有:文檔聚類、信息提取和特征選擇。比如,紐約時報利用主題模型的結果來提升文章推薦引擎的功能。許多專家將主題模型應用到招聘領域中,利用主題模型來提取工作要求中的潛在信息,并用模型的擬合結果來匹配候選人。此外,主題模型還被用于處理大規模的非結構化數據,如郵件、顧客評論和用戶社交數據。
如果你不熟悉主題模型的話,那么本文將告訴你主題模型的原理以及如何利用Python來構建主題模型。
目錄LDA(Latent Dirichlet Allocation) 模型LDA 模型的參數
Python 實現過程數據準備
數據清洗與預處理
計算文檔詞頻矩陣
構建 LDA 模型
擬合結果
建議頻數過濾法
標記過濾法
Batch Wise LDA
特征選擇
LDA 模型
我們可以用多種方法來處理文本數據,比如 TF 和 IDF 方法。LDA模型是最流行的主題模型,我們接下來將詳細介紹 LDA 模型。
LDA 模型假設文檔是由一系列主題構成的,然后再從這些主題中依據相應的概率分布生成詞語。給定一個文檔數據集,LDA 模型主要用于識別文檔中的主題分布情況。
LDA 模型是一種矩陣分解技術,在向量空間模型中,任何語料都能被表示成一個文檔詞頻矩陣。如下所示,矩陣中包含 N 篇文檔,M 個詞語,矩陣中的數值表示詞語在文檔中出現的頻率。
LDA 模型將上述的文檔詞頻矩陣轉換成兩個低維的矩陣—— M1 和 M2。其中 M1 表示文檔主題矩陣,M2 表示主題詞語矩陣,它們的維度分別是 N*K 和 K*M,K 表示文檔中主題的個數,M 表示詞語的數量。
需要注意的是,上述兩個矩陣提供了文檔主題和主題詞語的初始分布情況,LDA 模型通過抽樣的方法來更新這兩個矩陣。該模型通過更新文檔中每個詞語的主題歸屬情況來調整模型的參數值 p1 和 p2,其中 $p1 = p(\frac{topict}{documentd})$,$p2 = p(\frac{wordw}{topict})$。經過一系列的迭代計算后,LDA 模型達到收斂狀態,此時我們即可得到一組最佳參數值。
LDA 模型的參數
超參數 alpha 和 beta —— alpha 表示文檔—主題密度,beta 則表示主題—詞語密度,其中 alpha 值越大表示文檔中包含更多的主題,而更大的 beta 值則表示主題中包含更多的詞語。
主題中的詞數——這個參數取決于你的真實需求,如果你的目標是提取主題信息,那么你最好選擇較多的詞語。如果你的目標是提取特征,那么你應該選擇較少的詞項。
迭代次數—— LDA 算法的迭代次數
Python 實現
數據準備
以下是一些示例數據:
數據清洗與預處理
數據清洗是文本建模分析過程中的一個重要環節,在這個過程中我們將移除標點符號、停止詞并規整數據集:
計算文檔詞頻矩陣
構建 LDA 模型
擬合結果
建議
主題模型的擬合結果完全取決于語料庫中的特征項,而語料是由一個稀疏的文檔詞頻矩陣所構成的。降低該矩陣的維度可以提升主題模型的擬合結果,根據我的個人經驗,主要有以下幾個降維方法:
頻數過濾法
我們可以按照詞語的頻數進行排序,然后保留頻數較高的詞語并將頻數較低的詞語剔除掉。此外我們還可以借助探索性分析的方法來決定如何設置閾值。
標記過濾法
通常情況下,標記過濾法的效果優于頻數過濾法。主題模型通過詞語的共現情況來反映主題信息,然而在每個主題中并不是所有的詞語都是同等重要的。我們可以將這些無關緊要的詞語剔除掉,提升模型的擬合效果。
Batch Wise LDA
為了提取出文檔中最重要的主題信息,我們可以將語料庫分割成一系列固定大小的子集。然后我們可以對每個子集數據構建多個 LDA 模型,出現次數最多的主題就是該文檔中最重要的主題信息。
特征選擇
有些時候,我們還可以利用 LDA 模型來選擇特征。以文本分類問題為例,如果訓練集中包含多個類別的文檔,我們可以首先構建 LDA 模型,然后剔除掉不同類別文檔中共同出現的主題信息,剩余的特征即為有助于提升文本分類模型的準確率。
結語
到此為止,我們已經介紹完主題模型了,我希望本文能夠幫你了解如何處理文本數據。如果你想加深對主題模型的理解,那么我建議你最好親自練習下本文的代碼并檢查模型的擬合結果。
如果你覺得本文對你有幫助的話,你可以將此文分享給你的朋友。
***
原文作者:Shivam Bansal
譯者:Fibears