LDA(Latent Dirichlet allocation)範例+實作

Sharon Peng
6 min readJan 12, 2024

--

本文,以Python Machine Learning : Machine Learning and Deep Learning with Python書來實作,以下將會簡單說明程式碼,順便作為學習筆記。如果有錯誤還請各位多多指教~~

首先,此篇為本書中的第八個章節,關於「語意分析」(Sentiment Analysis)的使用,實作資料為IMDB 影片評論。

Outline:

  • 準備資料
  • 資料的前處理(Preprocessing)
  • LDA 實作

電腦只看得懂數字,人類才了解語言在說什麼。

那要怎麼把人類的語言轉換成機器也看得懂的東西,這時bag of word model就登場拉~~

Bag of Word Model

解釋:一個方法使電腦能把「文字轉換成數值」(bag of words model, which allows us to represent text as numerical feature vector)

圖源:http://www.prathapkudupublog.com/2019/04/bag-of-words.html

把文字轉換成特徵向量(feature vector),使用sklearn的CountVectorizer

範例:

文章如下:

The sun is shining. The weather is sweet. The sun is shining. The weather is sweet. and one and one is two.

再來,要讓電腦理解這段文字。

利用CountVectorizer中,fit_transform將文字轉換成數字(feature vector)。

  • fit_transform():建立出bag of word模型,並把詞語轉換成特徵向量。(constructed the vocabulary of the bag-of-words model and transformed the following sentences into sparse feature vectors.)
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
count = CountVectorizer()
docs = np.array(['The sun is shining',
'The weather is sweet',
'the sun is shining, the weather is sweet',
'and one and one is two'])
bag = count.fit_transform(docs)
# 計算出現多少個單字,並幫他們做編號
print(count.vocabulary_)
# 依照上面印出來的編號,再去對照在文句中出現的次數
print(bag.toarray())

說明:

從下方程式碼這個我們得到關於docs這些文句的詞袋(bag of word)

bag = count.fit_transform(docs)

下方則是列印出,剛剛所建立詞袋模型與每個文句中單詞所出現的次數

print(bag.toarray())

輸出結果:

**注意**

我們是依照 CountVectorizer建立出一個 count物件。而 fit_transform, vocabulary_則為此 class中的一個 Method。

對於這個結果,感覺可以再更好一點,因為出現了the, a, is等等的單詞,這些單詞對於我們在分析時,沒有實質的意義,因為在分析過程中,我們無法從這些單詞中得到整句話想要表達的重點。而這些沒有實質意義的詞,被稱為stopword(停止詞)

出現的話,就要把它消除,使用的手段為TF-IDF

TF-IDF

import numpy as np
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
count = CountVectorizer()
docs = np.array(['The sun is shining',
'The weather is sweet',
'the sun is shining, the weather is sweet',
'and one and one is two'])

tfidf = TfidfTransformer(use_idf=True, norm = 'l2', smooth_idf=True)
np.set_printoptions(precision=2) # 設小數點兩位
print(tfidf.fit_transform(count.fit_transform(docs)).toarray())
print(count.vocabulary_)

將建立的詞袋,放入tfidf.fit_transform,得到出經過tf-idf計算過後的詞袋。

print(tfidf.fit_transform(count.fit_transform(docs)).toarray())

輸出結果:

上面簡單介紹詞袋模型的使用,下方要帶大家來使用LDA。

資料的前置處理

獲取本次要使用的IMDB資料,下載過後,放到自己的資料夾,然後解壓縮,因為檔案比較特別,可以使用python來解壓縮。

# 用python解壓縮檔案 (限用macos, linux)
import tarfile
with tarfile.open('aclImdb_v1.tar.gz', 'r:gz') as tar:
tar.extractall()

整理資料,重新存成csv檔案

去除檔案內出現HTML符號

LDA 實作

**注意**:以下程式大概會需要跑個5分多鐘,還請耐心稍等。

輸出結果:

得到LDA做的主題分類後,需要人工觀察後,選擇符合的主題。假設在topic10,我預測他是動作片/戰爭片。所以我現在要利用LDA中的文檔-主題分佈矩陣,找出文章,看評估是否正確。

輸出結果:

--

--