
主題模組化是一種用于找出文檔集合中抽象“主題”的統計模型。LDA(Latent Dirichlet Allocation)是主題模型的一個示例,用于将文檔中的文本分類為特定的主題。LDA算法為每一個文檔建構出一個主題,再為每一個主題添加一些單詞,該算法按照Dirichlet分布來模組化。
那便開始吧!
資料在這裡将使用到的資料集是15年内釋出的100多萬條新聞标題的清單,可以從Kaggle下載下傳。
先來看看資料。
1048575
圖1
資料預處理執行以下步驟:
- 标記化——将文本分成句子,将句子分成單詞,把單詞變為小寫,去掉标點符号。
- 删除少于3個字元的單詞。
- 删除所有的句号。
- 詞形還原——将第三人稱的單詞改為第一人稱,将過去和未來時态中的動詞改為現在時。
- 詞根化——将單詞簡化為詞根形式。
[nltk_data] Downloading package wordnet to[nltk_data] C:UsersSusanLiAppDataRoamingnltk_data…[nltk_data] Package wordnet is already up-to-date!True
編寫一個函數,對資料集執行詞形還原和詞幹預處理。
預處理之後選擇要預覽的文檔。
源檔案:[‘rain’, ‘helps’, ‘dampen’, ‘bushfires’]标記化和詞形還原後的檔案:[‘rain’, ‘help’, ‘dampen’, ‘bushfir’]成了!預處理标題文本,将結果儲存為“processed_docs’
圖2
資料集的詞袋由 “processed_docs”建立一個字典,其中包含單詞出現在訓練集中的次數。
0 broadcast1 communiti2 decid3 licenc4 awar5 defam6 wit7 call8 infrastructur9 protect10 summit
Gensim filter_extremes過濾出以下幾種情況下的單詞:
- 在少于15個文檔中出現(絕對數)或
- 在總語料庫中占比分數超過0.5
以上兩步之後,隻保留前10萬最頻繁出現的單詞。
為每個文檔建立一個字典來報告單詞和這些單詞出現的次數,将其儲存到“bow_corpus”,然後再次檢查標明的文檔。
[(76, 1), (112, 1), (483, 1), (3998, 1)]
預覽樣本預處理檔案的詞袋。
Word 76 (“bushfir”) appears 1 time.Word 112 (“help”) appears 1 time.Word 483 (“rain”) appears 1 time.Word 3998 (“dampen”) appears 1 time.
TF-IDF利用models.TfidfModel模型,建立 ‘bow_corpus’的 tf-idf模型對象,并将其儲存到“tfidf”。對整個語料庫進行tfidf轉換,并将其命名為“corpus_tfidf’。最後,預覽第一份檔案的TF-IDF分數值。
使用gensim.models.LdaMulticore訓練LDA模型并将其儲存到“lda_model’
計算每個主題下出現的單詞及其相對權重。
圖3
你能用每個主題中的單詞及其相應的權重來區分不同的主題嗎?
利用TF-IDF 運作LDA圖4
現在,你能用每個主題中的單詞及其相應的權重來區分不同的主題嗎?
評估利用LDA詞袋模型對樣本文檔進行分類的效果檢查将測試檔案歸為哪一類。
圖5
測試文檔被模型精确歸類為可能性最大的那個主題,說明分類準确。
評估LDA TF-IDF模型對樣本文檔進行分類的效果圖6
測試文檔被模型精确歸類為可能性最大的那個主題,說明分類準确。
隐含文檔上的測試模型圖7
源代碼可以在GitHub上找到。期待聽到您的回報或問題。
參考資料:
https://www.udacity.com/course/natural-language-processing-nanodegree--nd892
原文标題:利用Python實作主題模組化和LDA 算法原文連結:https://towardsdatascience.com/topic-modeling-and-latent-dirichlet-allocation-in-python-9bf156893c24