原文鏈接:http://tecdat.cn/?p=6917
我嘗試使用Latent Dirichlet分配LDA來提取一些主題。 本教程以端到端的自然語言處理流程為特色,從原始數據開始,貫穿准備,建模,可視化論文。
我們將涉及以下幾點
使用LDA進行主題建模
使用pyLDAvis可視化主題模型
使用t-SNE和散景可視化LDA結果
In [1]:
In [2]:
預處理和矢量化文檔
In [3]:
In [4]:
計算雙字母組/三元組:
正弦主題非常相似,可以區分它們是短語而不是單個/單個單詞。
In [5]:
刪除
In [6]:
修剪常見和罕見的單詞,我們最終只有大約6%的單詞。
矢量化數據:
第一步是獲得每個文檔的單詞表示。
In [7]:
In [8]:
通過詞袋語料庫,我們可以繼續從文檔中學習我們的主題模型。
訓練LDA模型
In [9]:
In [10]:
如何選擇主題數量?
LDA是一種無監督的技術,這意味着我們在運行模型之前不知道在我們的語料庫中有多少主題存在。 主題連貫性是用於確定主題數量的主要技術之一。
但是,我使用了LDA可視化工具pyLDAvis,嘗試了幾個主題並比較了結果。 四個似乎是最能分離主題的最佳主題數量。
In [11]:
In [12]:
Out[12]:
我們在這看到什么?
左側面板,標記為Intertopic Distance Map,圓圈表示不同的主題以及它們之間的距離。類似的主題看起來更近,而不同的主題更遠。圖中主題圓的相對大小對應於語料庫中主題的相對頻率。
如何評估我們的模型?
將每個文檔分成兩部分,看看分配給它們的主題是否類似。 =>越相似越好
將隨機選擇的文檔相互比較。 =>越不相似越好
In [13]:
Transform the data
In [14]:
In [15]:
讓我們看一下每個主題中出現的術語。
In [17]:
In [18]:
從上面可以檢查每個主題並為其分配一個人類可解釋的標簽。 在這里我將它們標記如下:
In [19]:
In [20]:
'''
# 1. Remove non-letters
paper_text = re.sub("[^a-zA-Z]"," ", paper)
# 2. Convert words to lower case and split them
words = paper_text.lower().split()
# 3. Remove stop words
words = [w for w in words if not w in stops]
# 4. Remove short words
words = [t for t in words if len(t) > 2]
# 5. lemmatizing
words = [nltk.stem.WordNetLemmatizer().lemmatize(t) for t in words]
In [21]:
In [22]:
In [23]:
In [24]:
In [25]:
In [26]:
In [27]:
BokehJS 0.12.5成功加載。
In [28]:
In [29]: