推薦 :使用Python的LDA主題建模(附連結)

2021-12-28 數據分析

作者:Kamil Polak  翻譯:劉思婧   校對:孫韜淳

本文約2700字,建議閱讀5分鐘

本文為大家介紹了主題建模的概念、LDA算法的原理,示例了如何使用Python建立一個基礎的LDA主題模型,並使用pyLDAvis對主題進行可視化。


引言主題建模包括從文檔術語中提取特徵,並使用數學結構和框架(如矩陣分解和奇異值分解)來生成彼此可區分的術語聚類(cluster)或組,這些單詞聚類繼而形成主題或概念。主題建模是一種對文檔進行無監督分類的方法,類似於對數值數據進行聚類。這些概念可以用來解釋語料庫的主題,也可以在各種文檔中一同頻繁出現的單詞之間建立語義聯繫。

發現數據集中隱藏的主題;

將文檔分類到已經發現的主題中;

使用分類來組織/總結/搜索文檔。

潛在語義索引(Latent semantic indexing)

潛在狄利克雷分配(Latent Dirichlet Allocation,LDA)

非負矩陣分解(Non-negative matrix factorization,NMF)

在本文中,我們將重點討論如何使用Python進行LDA主題建模。具體來說,我們將討論:什麼是潛在狄利克雷分配(LDA, Latent Dirichlet allocation)?潛在狄利克雷分配(LDA, Latent Dirichlet allocation)是一種生成概率模型(generative probabilistic model),該模型假設每個文檔具有類似於概率潛在語義索引模型的主題的組合。簡而言之,LDA背後的思想是,每個文檔可以通過主題的分布來描述,每個主題可以通過單詞的分布來描述。LDA算法如何工作?注意:LDA不關心文檔中單詞的順序。通常,LDA使用詞袋特徵(bag-of-word feature)表示來代表文檔。1. 對於每個文檔,隨機將每個單詞初始化為K個主題中的一個(事先選擇K個主題);3. 考慮所有其他單詞及其主題分配,以概率P(T | D)´ P(W | T) 將單詞W與主題T重新分配。

LDA主題模型的圖示如下。

下圖直觀地展示了每個參數如何連接回文本文檔和術語。假設我們有M個文檔,文檔中有N個單詞,我們要生成的主題總數為K。圖中的黑盒代表核心算法,它利用前面提到的參數從文檔中提取K個主題。

如何使用Python建立LDA主題模型我們將使用Gensim包中的潛在狄利克雷分配(LDA)。首先,我們需要導入包。核心包是re、gensim、spacy和pyLDAvis。此外,我們需要使用matplotlib、numpy和panases以進行數據處理和可視化。
1. import re2. import numpy as np3. import pandas as pd4. from pprint import pprint5. 6. # Gensim7. import gensim8. import gensim.corpora as corpora9. from gensim.utils import simple_preprocess10. from gensim.models import CoherenceModel11. 12. # spacy for lemmatization13. import spacy14. 15. # Plotting tools16. import pyLDAvis17. import pyLDAvis.gensim  # don't skip this18. import matplotlib.pyplot as plt19. %matplotlib inline20. 21. # Enable logging for gensim - optional22. import logging23. logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.ERROR)24. 25. import warnings26. warnings.filterwarnings("ignore",category=DeprecationWarning)

像am/is/are/of/a/the/but/…這樣的詞不包含任何關於「主題」的信息。因此,作為預處理步驟,我們可以將它們從文檔中移除。要做到這一點,我們需要從NLT導入停用詞。還可以通過添加一些額外的單詞來擴展原始的停用詞列表。
1. # NLTK Stop words2. from nltk.corpus import stopwords3. stop_words = stopwords.words('english')4. stop_words.extend(['from', 'subject', 're', 'edu', 'use'])

在本教程中,我們將使用20個新聞組數據集,其中包含來自20個不同主題的大約11k個新聞組帖子。這可以作為newsgroups.json獲得。
1. # Import Dataset2. df = pd.read_json('https://raw.githubusercontent.com/selva86/datasets/master/newsgroups.json')3. print(df.target_names.unique())4. df.head()

在我們開始主題建模之前,需要清理數據集。首先,刪除電子郵件連結、多餘的空格和換行符。
1. # Convert to list2. data = df.content.values.tolist()3. 4. # Remove Emails5. data = [re.sub('\S*@\S*\s?', '', sent) for sent in data]6. 7. # Remove new line characters8. data = [re.sub('\s+', ' ', sent) for sent in data]9. 10. # Remove distracting single quotes11. data = [re.sub("\'", "", sent) for sent in data]12. 13. pprint(data[:1])

讓我們把每個句子標記成一個單詞列表,去掉標點符號和不必要的字符。
1. def sent_to_words(sentences):2.     for sentence in sentences:3.         yield(gensim.utils.simple_preprocess(str(sentence), deacc=True))  # deacc=True removes punctuations4. 5. data_words = list(sent_to_words(data))6. 7. print(data_words[:1])

創建二元(Bigram)模型和三元(Trigram)模型
1. # Build the bigram and trigram models2. bigram = gensim.models.Phrases(data_words, min_count=5, threshold=100) # higher threshold fewer phrases.3. trigram = gensim.models.Phrases(bigram[data_words], threshold=100)  4. 5. # Faster way to get a sentence clubbed as a trigram/bigram6. bigram_mod = gensim.models.phrases.Phraser(bigram)7. trigram_mod = gensim.models.phrases.Phraser(trigram)8. 9. # See trigram example10. print(trigram_mod[bigram_mod[data_words[0]]])

刪除停用詞(stopword),建立二元模型和詞形還原(Lemmatize)在這一步中,我們分別定義了函數以刪除停止詞、建立二元模型和詞形還原,並且依次調用了這些函數。


1. # Define functions for stopwords, bigrams, trigrams and lemmatization2. def remove_stopwords(texts):3. return [[word for word in simple_preprocess(str(doc)) if word not in stop_words] for doc in texts]4. 5. def make_bigrams(texts):6. return [bigram_mod[doc] for doc in texts]7. 8. def make_trigrams(texts):9. return [trigram_mod[bigram_mod[doc]] for doc in texts]10. 11. def lemmatization(texts, allowed_postags=['NOUN', 'ADJ', 'VERB', 'ADV']):12. """https://spacy.io/api/annotation"""13. texts_out = []14. for sent in texts:15. doc = nlp(" ".join(sent)) 16. texts_out.append([token.lemma_ for token in doc if token.pos_ in allowed_postags])17. return texts_out
1. # Remove Stop Words2. data_words_nostops = remove_stopwords(data_words)3. 4. # Form Bigrams5. data_words_bigrams = make_bigrams(data_words_nostops)6. 7. # Initialize spacy 'en' model, keeping only tagger component (for efficiency)8. # python3 -m spacy download en9. nlp = spacy.load('en', disable=['parser', 'ner'])10. 11. # Do lemmatization keeping only noun, adj, vb, adv12. data_lemmatized = lemmatization(data_words_bigrams, allowed_postags=['NOUN', 'ADJ', 'VERB', 'ADV'])13. 14. print(data_lemmatized[:1])

Gensim為文檔中的每個單詞創建一個唯一的id,但是在此之前,我們需要創建一個字典和語料庫作為模型的輸入。
1. # Create Dictionary2. id2word = corpora.Dictionary(data_lemmatized)3. 4. # Create Corpus5. texts = data_lemmatized6. 7. # Term Document Frequency8. corpus = [id2word.doc2bow(text) for text in texts]9. 10. # View11. print(corpus[:1])

現在我們準備進入核心步驟,使用LDA進行主題建模。讓我們開始建立模型。我們將建立20個不同主題的LDA模型,其中每個主題都是關鍵字的組合,每個關鍵字在主題中都具有一定的權重(weightage)。
1. # Build LDA model2. lda_model = gensim.models.ldamodel.LdaModel(corpus=corpus,3.                                            id2word=id2word,4.                                            num_topics=20, 5.                                            random_state=100,6.                                            update_every=1,7.                                            chunksize=100,8.                                            passes=10,9.                                            alpha='auto',10.                                            per_word_topics=True)

我們可以可視化每個主題的關鍵詞和每個關鍵詞的權重(重要性)。
1. # Print the Keyword in the 10 topics2. pprint(lda_model.print_topics())3. doc_lda = lda_model[corpus]

計算模型困惑度(Perplexity)和一致性分數(Coherence Score)模型困惑度是對概率分布或概率模型預測樣本好壞的一種度量。主題一致性通過測量主題中得分高的單詞之間的語義相似度來衡量單個主題的得分。簡而言之,它們提供了一種方便的方法來判斷一個給定的主題模型有多好。
1. # Compute Perplexity2. print('\nPerplexity: ', lda_model.log_perplexity(corpus))  # a measure of how good the model is. lower the better.3. 4. # Compute Coherence Score5. coherence_model_lda = CoherenceModel(model=lda_model, texts=data_lemmatized, dictionary=id2word, coherence='c_v')6. coherence_lda = coherence_model_lda.get_coherence()7. print('\nCoherence Score: ', coherence_lda)

現在,我們可以檢查生成的主題和相關的關鍵詞。最好的方法是使用pyLDAvis可視化我們的模型。pyLDAvis旨在幫助用戶在一個適合文本數據語料庫的主題模型中解釋主題。它從擬合好的的線性判別分析主題模型(LDA)中提取信息,以實現基於網絡的交互式可視化。
1. # Visualize the topics2. pyLDAvis.enable_notebook()3. vis = pyLDAvis.gensim.prepare(lda_model, corpus, id2word)4. vis

簡要地解釋一下結果:左手邊的每個氣泡代表一個話題。氣泡越大,該主題就越盛行。根據經驗,一個好的主題模型會有大的、不重疊的氣泡。我們也可以點擊右邊的側邊工具條,以調整阿爾法(alpha)參數。結語

主題建模是自然語言處理的主要應用之一。本文的目的是解釋什麼是主題建模,以及如何在實際使用中實現潛在狄利克雷分配(LDA)模型。

為此,我們深入研究了LDA的原理,使用Gensim包中的LDA構建了一個基礎的主題模型,並使用pyLDAvis對主題進行了可視化。

希望您喜歡該文並有所收穫。

References:Jelodar, H., Wang, Y., Yuan, C. et al. Latent Dirichlet allocation (LDA) and topic modeling: models, applications, a survey. Multimed Tools Appl 78, 15169–15211 (2019). https://doi.org/10.1007/s11042-018-6894-4https://jovian.ai/outlink?url=https%3A%2F%2Fdoi.org%2F10.1007%2Fs11042-018-6894-4D. Sarkar, Text Analytics with Python. A Practical Real-World Approach to Gaining Actionable Insights from Your Datahttps://www.machinelearningplus.com/nlp/topic-modeling-gensim-python/https://jovian.ai/outlink?url=https%3A%2F%2Fwww.machinelearningplus.com%2Fnlp%2Ftopic-modeling-gensim-python%2Fhttps://towardsdatascience.com/topic-modelling-in-python-with-nltk-and-gensim-4ef03213cd21https://jovian.ai/outlink?url=https%3A%2F%2Ftowardsdatascience.com%2Ftopic-modelling-in-python-with-nltk-and-gensim-4ef03213cd21https://towardsdatascience.com/end-to-end-topic-modeling-in-python-latent-dirichlet-allocation-lda-35ce4ed6b3e0https://jovian.ai/outlink?url=https%3A%2F%2Ftowardsdatascience.com%2Fend-to-end-topic-modeling-in-python-latent-dirichlet-allocation-lda-35ce4ed6b3e0https://towardsdatascience.com/latent-dirichlet-allocation-lda-9d1cd064ffa2https://towardsdatascience.com/light-on-math-machine-learning-intuitive-guide-to-latent-dirichlet-allocation-437c81220158http://blog.echen.me/2011/08/22/introduction-to-latent-dirichlet-allocation/譯者簡介:劉思婧,清華大學新聞系研一在讀,數據傳播方向。文理兼愛,有點小情懷的數據愛好者。希望結識更多不同專業、不同專長的夥伴,拓寬眼界、優化思維、日日自新。

版權聲明:本號內容部分來自網際網路,轉載請註明原文連結和作者,如有侵權或出處有誤請和我們聯繫。

合作請加QQ:365242293  

數據分析(ID : ecshujufenxi )網際網路科技與數據圈自己的微信,也是WeMedia自媒體聯盟成員之一,WeMedia聯盟覆蓋5000萬人群。

相關焦點

  • 獨家 | 利用Python實現主題建模和LDA 算法(附連結)
    主題建模是一種用於找出文檔集合中抽象「主題」的統計模型。LDA(Latent Dirichlet Allocation)是主題模型的一個示例,用於將文檔中的文本分類為特定的主題。LDA算法為每一個文檔構建出一個主題,再為每一個主題添加一些單詞,該算法按照Dirichlet分布來建模。
  • Python文本挖掘——LDA模型實現
    此外,一篇文檔可以包含多個主題,文檔中每一個詞都由其中的一個主題生成。人類生成文檔是基於概率選取主題及其對應的詞彙的方式,即一篇文章的每個詞都是通過「以一定概率選擇了某個主題,並從這個主題中以一定概率選擇某個詞語」這樣一個過程得到。那麼LDA要做的就是通過文檔反推主題。文檔到主題服從多項式分布,主題到詞服從多項式分布。
  • 數據挖掘之--LDA主題建模
    無論你的手裡是文本、圖片還是其他的非結構化、結構化數據,都可用這個方法進行主題建模。今天我們通過一個新聞文本數據集進行 LDA 主題建模。觀察數據中有哪些主題、這些主題的分布如何,以及每個主題都包含哪些關鍵元素。
  • 【乾貨】利用NLTK和Gensim進行主題建模(附完整代碼)
    參與 | XiaowenTopic Modelling in Python with NLTK and Gensim利用NLTK和Gensim進行主題建模研究論文主題建模是一種無監督的機器學習方法('URL') elif token.orth_.startswith('@'): lda_tokens.append('SCREEN_NAME') else: lda_tokens.append(token.lower_) return lda_tokens我們使用
  • Python中的端對端主題建模: 隱含狄利克雷分布(LDA)
    獲取主題模型使用了許多技術。本文旨在演示LDA的實現:一種廣泛使用的主題建模技術。隱含狄利克雷分布(LDA)根據定義,LDA是給定語料庫的生成概率模型。其基本思想是將文檔表示為潛在主題的隨機混合,並對每個主題通過單詞分布進行特徵化。LDA的底層算法
  • 基於財經新聞的LDA主題模型實現:Python
    這篇博客側重提供一個LDA主題模型python代碼的技術實現,不側重如何分析財經新聞(後面再更)。= gensim.models.LdaMulticore(corpus, num_topics=30, id2word=id2word, passes=2, workers=2)lda_model = gensim.models.ldamodel.LdaModel(corpus=corpus,id2word=id2word,num_topics=100, random_state=100, update_every
  • Python之LDA主題模型算法應用
    原文連結:http://tecdat.cn/?
  • 【專知薈萃16】主題模型Topic Model知識資料全集(基礎/進階/論文/綜述/代碼/專家,附PDF下載)
    專知訪問www.zhuanzhi.ai,  或關注微信公眾號後臺回復" 專知"進入專知,搜索主題「主題模型」查看。此外,我們也提供該文網頁桌面手機端(www.zhuanzhi.ai)完整訪問,可直接點擊訪問收錄連結地址,以及pdf版下載連結,請文章末尾查看!
  • 運用sklearn進行線性判別分析(LDA)代碼實現
    基於sklearn的線性判別分析(LDA)代碼實現一、前言及回顧本文記錄使用sklearn庫實現有監督的數據降維技術——線性判別分析(LDA)。在上一篇LDA線性判別分析原理及python應用(葡萄酒案例分析),我們通過詳細的步驟理解LDA內部邏輯實現原理,能夠更好地掌握線性判別分析的內部機制。
  • R語言中的LDA模型:對文本數據進行主題模型topic modeling分析
    p=4333 主題建模在文本挖掘中,我們經常收集一些文檔集合,例如博客文章或新聞文章,我們希望將其分成組,以便我們可以分別理解它們。主題建模是對這些文檔進行無監督分類的一種方法,類似於對數字數據進行聚類,即使我們不確定要查找什麼,也可以找到分組。潛在狄利克雷分配(LDA)是擬合主題模型特別流行的方法。
  • 《Python語言數據分析》----8.2.4 向量模型_3)LDA模型
    ###############8.2.4  向量模型_3)LDA模型import nltkfrom nltk.corpus import PlaintextCorpusReadercorpus_root = r"D:\python
  • 如何使用python完成數學建模常見算法
    在數學建模中主流的程式語言是MATLAB,但隨著python/R中數學軟體包的不斷完善,熟悉這兩種程式語言的同學也可以快速數學建模的編程環節。後面我們將介紹幾種常見數學建模算法的python實現,旨在展示python在本領域的強大威力。
  • 商品評論情感化分析案例(LDA主題分析)
    # 匹配情感詞word = pd.read_csv("/word.csv")# 讀入正面、負面情感評價詞pos_comment = pd.read_csv("/正面評價詞語(中文).txt", header=None,sep="\n",                           encoding = 'utf-8', engine='python
  • 【R分享|實戰】LDA 線性判別分析
    無監督學習指我們事先沒有任何訓練樣本,直接對數據進行建模。無監督學習的主要算法是聚類,聚類目的在於把相似的東西聚在一起,主要通過計算樣本間和群體間距離得到。可以用散點圖來檢驗方差齊性,使用數據轉換方式來修正非其次。我將從機器學習的角度介紹LDA的功能,首先將數據集分為兩部分,一部分作為訓練集構建LDA分類預測模型,一部分作為測試集評估預測模型的精確性。
  • 值得收藏的45個Python優質資源(附連結)
    這份清單中包括了各不相同的20個主題,以及一些資深程式設計師分享使用Python的經驗,值得收藏。Mybridge AI 的排名結合了內部機器評估的內容質量和各種人為因素,包括閱讀次數和閱讀時長等。對於Python的初學者,我們推薦以下這些課程:REST API:使用 Python,Flask,Flask-RESTful 和 Flask-SQLAlchemy
  • 數據科學家最喜歡的5個自然語言處理Python庫
    Grammarly 讓我們看看python中有哪些庫是最常用的,可用來構建NLP模型:非常優化的NLP庫,可以與TensorFlow或PyTorch等深度學習框架一起使用。Gensim是一個用於從文檔中自動提取語義主題的Python庫,目標受眾是自然語言處理(NLP)和信息檢索(IR)社區。
  • 獨家|使用Python進行機器學習的假設檢驗(附連結&代碼)
    我將簡要介紹一下這個當我學習時給我帶來了麻煩的主題。我把所有這些概念放在一起,並使用python進行示例。什麼是假設檢驗?我們為什麼用它?什麼是假設的基本條件?什麼是假設檢驗的重要參數?假設檢驗是一種統計方法,用於使用實驗數據進行統計決策。
  • 手把手教你學會LDA話題模型可視化pyLDAvis庫
    自然語言處理之LDA主題模型致敬褚先生:pyLDAvis可視化不認輸的一生對文本分析感興趣的可以關注下我的直播間內的課程python文本分析:從入門到精通 pyLDAvis是話題模型交互式可視化庫,最初是在R語言社區的Carson Sievert和Kenny Shirley開發的。
  • 小白數據分析——Python職位數據分析全鏈路
    挖掘算法使用mlxtend模塊的FP-Growth,FP-Growth實現關聯規則的挖掘比Apriori更快。也就是人工智慧職位裡要求使用python的職位,有64%的概率還需要用c++。同理我們還可以看python跟其他詞的關聯關係
  • 盤點數據科學20個最好的Python庫(附連結)
    Plotly (Commits: 2906, Contributors: 48)官網:https://plot.ly/python/Plotly 是一個流行的庫,它可以讓你輕鬆構建複雜的圖形。該軟體包適用於交互式 Web 應用程,可實現輪廓圖、三元圖和三維圖等視覺效果。8.