原文鏈接:http://tecdat.cn/?p=24376
原文出處:拓端數據部落公眾號
在這篇文章中,我們討論了基於gensim 包來可視化主題模型 (LDA) 的輸出和結果的技術 。
介紹
我們遵循結構化的工作流程,基於潛在狄利克雷分配 (LDA) 算法構建了一個主題模型。
在這篇文章中,我們將使用主題模型,探索多種策略以使用matplotlib 繪圖有效地可視化結果 。
我將使用 20 個新聞組數據集的一部分,因為重點更多地放在可視化結果的方法上。
讓我們從導入包和 20 News Groups 數據集開始。
-
-
import matplotlib.pyplot as plt
-
-
# NLTK停止詞
-
fom nlt.copus imort stowods
-
sop_wrds = stowords.wrds('chinse')
-
-
-
導入新聞組數據集
讓我們導入新聞組數據集並僅保留 4 個 類別。
-
# 導入數據集
-
-
d = f.oc[dftargt_name.in([so.relion.chritan], 'ec.sot.okey', 'ak.piticmdast' 'rec.oorcyces']) , :]
-
prin(f.hpe) #> (2361, 3)
-
df.(

標記句子並清理
刪除電子郵件、換行符、單引號,最后使用 gensim 將句子拆分為單詞列表 simple_preprocess()。設置 deacc=True 選項會刪除標點符號。
-
-
def snds(seecs):
-
for setees in sntces:
-
sent = r.sub('\S*@\S*\s?', '', sent) # 刪除電子郵件
-
snt = re.sb('\s+', '', sent) # 移除換行字符
-
set = re.sb("\'", "", sent) # 刪除單引號
-
set = geim.uls.smplprerss(str(sent), deacc=True)
-
-
# 轉換為列表
-
data = df.cnt.lus.tolist()
-
構建雙字母組、三字母組模型和推理
讓我們使用模型形成雙字母組、三字母組。為了提高執行速度,這個模型被傳遞給Phraser()。
接下來,將每個詞詞形還原為其詞根形式,僅保留名詞、形容詞、動詞和副詞。
我們只保留這些POS標簽,因為它們對句子的含義貢獻最大。在這里,我使用spacy進行詞法處理。
-
-
# 建立大詞和三詞模型
-
bigrm = endl.Pres(dta_ords, mncnt=5, thrshl=100) # 更高的閾值會減少短語。
-
tigam = genm.del.Prses(bga[dtawors], thrhld=100)
-
bigm_od = gsim.molpss.Pasr(bgrm)
-
tigrmod = genm.mos.pres.hrser(tigam)
-
-
# 在終端運行一次
-
-
""刪除止損詞,形成大詞、三詞和詞組""
-
texts = [[wor fo wrd in sipeeproe(tr(dc))
-
[iram_od[oc] for doc in txts]
-
tets = [rirammod[igrmmod[dc]] for dc in tets]
-
tetout = []
-
np = scy.oad('en', dial=['解析器', 'ner'])
-
for set in txs:
-
dc = np(" ".join(sn))
-
tex_.ppd([tknlea_ fr toen in oc if toenpo_ in aowed_ots])
-
# 在詞法化之后,再一次刪除停止詞
-
-
-
atady = roe_os(daa_ds) # 處理過的文本數據!
-
構建主題模型
要使用 構建 LDA 主題模型,您需要語料庫和字典。讓我們先創建它們,然后構建模型。訓練好的主題(關鍵字和權重)也輸出在下面。
如果你檢查一下主題關鍵詞,它們共同代表了我們最初選擇的主題。教會、冰球、地區和摩托車。很好!
-
-
# 創建字典
-
id2od = copoDciary(dta_eay)
-
-
# 創建語料庫。術語文檔頻率
-
crpus = [i2wod.o2bow(ext) for txt in daa_ey]
-
-
# 建立LDA模型
-
Lal(copus=copus,
-
id2wrd=id2wrd,
-
nu_tpic=4,
-
radom_ate=100,
-
updaeeery=1,
-
chnsie=10,
-
pas=10。
-
alha='symmetric',
-
iteatos=100,
-
prdics=True)
-
-
(ldampcs())
什么是主導主題及其在每個文檔中的百分比貢獻
在 LDA 模型中,每個文檔由多個主題組成。但是,通常只有一個主題占主導地位。下面的代碼提取每個句子的主要主題,並在格式良好的輸出中顯示主題和關鍵字的權重。
這樣,您將知道哪個文檔主要屬於哪個主題。
-
# 啟動輸出
-
se_tpcf = p.Dataame()
-
-
# 獲取每個文檔中的主要話題
-
for i, ro_isin enate(ldmoel[crps]):
-
rw = rw_s0] if lamoel.pe_wortopis else rowlis
-
row = soed(ow, ky=laba x: (x[1]), evre=True)
-
# 獲取每個文檔的主導主題、perc貢獻和關鍵詞
-
for j, (toicum, pr_pic) in enate(row):
-
if j == 0: # => 主導話題
-
wp = ldel.shotoic(topic_num)
-
-
-
# 在輸出的最后添加原始文本
-
-
-
deeos = fratcs(lodel=damoe, copus=crpus, tets=dary)
-
-
# 格式化
-
topic = os.retidex()
-

每個話題最有代表性的一句話
有時您想獲得最能代表給定主題的句子樣本。此代碼為每個主題獲取最典型的句子。
-
-
# 顯示設置,在列中顯示更多的字符
-
-
for i, grp in serpd:
-
senlet = pd.cnct([senlet,
-
gp.srtes(['Peion'], asng=Fase).hed(1)]
-
ais=0)
-
-
# 重置索引
-
seet.resex(drp=True, inlce=True)
-
-
# 格式化
-
senllet.couns = ['Toum', "TopCorib", "Kywrds", "rsa xt"]
-
-
# 顯示
-
sencoet.head(10)
-

文檔中字數的頻率分布
在處理大量文檔時,您想知道文檔的整體大小和主題大小。讓我們繪制文檔字數分布。
-
-
-
# 繪圖
-
plt.fiue(fe=(6,7), dpi=60)
-
-
-
plt.xtcs(nplic(0,00,9))
-
-

-
import sebon as sns
-
fig.titat()
-
fig.sbts_juo0.90)
-
plt.xticks(np.lisa(0,00,9))
-
plt.sow()

每個話題的前N個關鍵詞詞雲
雖然你已經看到了每個主題中的主題關鍵詞是什么,但字數大小與權重成正比的詞雲是很好的可視化方法。
-
-
# 1. 每個主題中前N個詞的詞雲
-
from matplotlib import pyplot as plt
-
from worcloud mport WrCloud,STOPWODS
-
-
-
-
clod = WordClud(stopwds=stp_ords,
-
barounolr='white',
-
-
reer_oronal=1.0)
-
-
-
plt.sow()
-

主題關鍵詞的字數
當涉及主題中的關鍵字時,關鍵字的重要性(權重)很重要。除此之外,這些單詞在文檔中出現的頻率也很有趣。
讓我們在同一圖表中繪制字數和每個關鍵字的權重。
您要關注出現在多個主題中的詞以及相對頻率大於權重的詞。通常,這些詞變得不那么重要。我在下面繪制的圖表是在開始時將幾個這樣的詞添加到停用詞列表並重新運行訓練過程的結果。
-
-
tops = l_mdl.swtcs(foatd=Fase)
-
-
-
# 繪制主題關鍵詞的字數和權重圖
-
fig, as = pltuls(2, 2, fiiz=(16,10), sey=rue, di=160)
-
fig.tigh_lyut_pad=2)
-
plt.shw()
-

按主題着色的句子圖表
文檔中的每個單詞都代表 4 個主題之一。讓我們根據給定文檔中的每個單詞所屬的主題 id 為其着色。
-
-
# 對N個句子進行着色的句子
-
-
-
for i, ax in eumate(xes):
-
cour = corp[i-1] 。
-
topprcs, wrdits, wrdihius = lda[copr]
-
wodoac = [(lmod2word[wd], tpic[0]) or w, tpc in odid_opcs]
-
-
# 繪制矩形區域
-
tpcred = soted(tpps, key= x: (x[1]), rvese=True)
-
-
word_pos = 0.06
-
-
-
plt.subdt(wsace=0, hsace=0)
-
-
plt.show()
-
-
-
文件中討論最多的話題是什么?
讓我們計算歸因於每個主題的文檔總數。
-
-
# 對N個句子進行着色
-
主導話題 = []
-
話題百分比 = []
-
for i, crp in euete(opu_el):
-
topcs, wordics, wrlues = moel[crp]
-
dopic = soted(torcs, key = lmda x: x[1], reerse=Tue)[0][0] 。
-
-
doics, toages = topent(mol=lda, copus=crus,en=-)
-
-
# 每個文檔中主導話題的分布
-
-
dfc = dh_dc.t_frme(ame='cunt').eeinex()
-
-
# 按實際權重計算的總主題分布
-
topweig = pd.DaaFae([dct(t) for t in toges] )
-
-
-
# 每個主題的前三個關鍵詞
-
[(i, tpic) for i, tocs in lda.shcs(fted=Flse)
-
for j, (tic, wt) in eae(toic)if j < 3)
-
-
-
讓我們做兩個圖:
- 通過將文檔分配給該文檔中權重最大的主題來計算每個主題的文檔數。
- 通過總結每個主題對各自文檔的實際權重貢獻來計算每個主題的文檔數量。
-
-
from mtpltli.tiker import ucFattr
-
-
# 繪圖
-
fig, (ax1, ax2) = pl.supot(1, 2)
-
-
# 按主要議題分布的議題
-
ax1.bar(data=df_dc)
-
-
-
# 按主題權重的主題分布
-
ax2.ar(x='iex', hegh='cout', dat=dfoc, with=.5,
-
-
plt.sow()
-

t-SNE(t分布-隨機鄰近嵌入)聚類圖
讓我們使用 t-SNE(t分布-隨機鄰近嵌入)算法在 2D 空間中可視化文檔集群。
-
-
# 獲取話題權重和主導話題 ------------
-
-
# 獲取主題權重
-
for i, row_list:
-
tophts.apd([w for i, w in rost[0]] )
-
-
# 主題權重的數組
-
arr = pd.Dame(tohts).fna(0).vales
-
-
# 保持良好的分離點(可選)
-
rr = ar[p.aax(rr) > 0.35] 。
-
-
# 每個文檔中的主要議題編號
-
to_n = np.agax(rr, ais=1)
-
-
# tSNE降維
-
tsel = TSE(n=2, vre=1, rae=0, ae=.99, int='pca')
-
tlda = tsl.frm(arr)
-
-
# 使用Bokeh繪制主題集群圖
-
oueook()
-
n_tics = 4
-
m
-
plot.scatter(xda[:,])
-
-

pyLDAVis
最后,pyLDAVis 是最常用的,也是一種將主題模型中包含的信息可視化的好方法。
-
-
pyLDvis.enaok()

結論
我們從頭開始導入、清理和處理新聞組數據集構建 LDA 模型。然后我們看到了多種可視化主題模型輸出的方法,包括詞雲,它們直觀地告訴您每個主題中哪個主題占主導地位。t-SNE 聚類, pyLDAVis 提供了更多關於主題聚類的細節。

最受歡迎的見解
3.r語言文本挖掘tf-idf主題建模,情感分析n-gram建模研究
4.python主題建模可視化lda和t-sne交互式可視化
