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

標(biāo)記句子并清理
刪除電子郵件、換行符、單引號(hào),最后使用 gensim 將句子拆分為單詞列表?simple_preprocess()
。設(shè)置?deacc=True
?選項(xiàng)會(huì)刪除標(biāo)點(diǎn)符號(hào)。
def snds(seecs):
for setees in sntces:
sent = r.sub('\S*@\S*\s?', '', sent) # 刪除電子郵件
snt = re.sb('\s+', '', sent) # 移除換行字符
set = re.sb("\'", "", sent) # 刪除單引號(hào)
set = geim.uls.smplprerss(str(sent), deacc=True)
# 轉(zhuǎn)換為列表
data = df.cnt.lus.tolist()
構(gòu)建雙字母組、三字母組模型和推理
讓我們使用模型形成雙字母組、三字母組。為了提高執(zhí)行速度,這個(gè)模型被傳遞給Phraser()。
接下來(lái),將每個(gè)詞詞形還原為其詞根形式,僅保留名詞、形容詞、動(dòng)詞和副詞。
我們只保留這些POS標(biāo)簽,因?yàn)樗鼈儗?duì)句子的含義貢獻(xiàn)最大。在這里,我使用spacy進(jìn)行詞法處理。
# 建立大詞和三詞模型
bigrm = endl.Pres(dta_ords, mncnt=5, thrshl=100) # 更高的閾值會(huì)減少短語(yǔ)。
tigam = genm.del.Prses(bga[dtawors], thrhld=100)
bigm_od = gsim.molpss.Pasr(bgrm)
tigrmod = genm.mos.pres.hrser(tigam)
# 在終端運(yùn)行一次
""刪除止損詞,形成大詞、三詞和詞組""
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) # 處理過的文本數(shù)據(jù)!
構(gòu)建主題模型
要使用 構(gòu)建 LDA 主題模型,您需要語(yǔ)料庫(kù)和字典。讓我們先創(chuàng)建它們,然后構(gòu)建模型。訓(xùn)練好的主題(關(guān)鍵字和權(quán)重)也輸出在下面。
如果你檢查一下主題關(guān)鍵詞,它們共同代表了我們最初選擇的主題。教會(huì)、冰球、地區(qū)和摩托車。很好!
# 創(chuàng)建字典
id2od = copoDciary(dta_eay)
# 創(chuàng)建語(yǔ)料庫(kù)。術(shù)語(yǔ)文檔頻率
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())
什么是主導(dǎo)主題及其在每個(gè)文檔中的百分比貢獻(xiàn)
在 LDA 模型中,每個(gè)文檔由多個(gè)主題組成。但是,通常只有一個(gè)主題占主導(dǎo)地位。下面的代碼提取每個(gè)句子的主要主題,并在格式良好的輸出中顯示主題和關(guān)鍵字的權(quán)重。
這樣,您將知道哪個(gè)文檔主要屬于哪個(gè)主題。
# 啟動(dòng)輸出
se_tpcf = p.Dataame()
# 獲取每個(gè)文檔中的主要話題
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)
# 獲取每個(gè)文檔的主導(dǎo)主題、perc貢獻(xiàn)和關(guān)鍵詞
for j, (toicum, pr_pic) in enate(row):
if j == 0: # => 主導(dǎo)話題
wp = ldel.shotoic(topic_num)
# 在輸出的最后添加原始文本
deeos = fratcs(lodel=damoe, copus=crpus, tets=dary)
# 格式化
topic = os.retidex()

每個(gè)話題最有代表性的一句話
有時(shí)您想獲得最能代表給定主題的句子樣本。此代碼為每個(gè)主題獲取最典型的句子。
# 顯示設(shè)置,在列中顯示更多的字符
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)

文檔中字?jǐn)?shù)的頻率分布
在處理大量文檔時(shí),您想知道文檔的整體大小和主題大小。讓我們繪制文檔字?jǐn)?shù)分布。
# 繪圖
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()

每個(gè)話題的前N個(gè)關(guān)鍵詞詞云
雖然你已經(jīng)看到了每個(gè)主題中的主題關(guān)鍵詞是什么,但字?jǐn)?shù)大小與權(quán)重成正比的詞云是很好的可視化方法。
?
# 1. 每個(gè)主題中前N個(gè)詞的詞云
from matplotlib import pyplot as plt
from worcloud mport WrCloud,STOPWODS
clod = WordClud(stopwds=stp_ords,
barounolr='white',
reer_oronal=1.0)
plt.sow()

主題關(guān)鍵詞的字?jǐn)?shù)
當(dāng)涉及主題中的關(guān)鍵字時(shí),關(guān)鍵字的重要性(權(quán)重)很重要。除此之外,這些單詞在文檔中出現(xiàn)的頻率也很有趣。
讓我們?cè)谕粓D表中繪制字?jǐn)?shù)和每個(gè)關(guān)鍵字的權(quán)重。
您要關(guān)注出現(xiàn)在多個(gè)主題中的詞以及相對(duì)頻率大于權(quán)重的詞。通常,這些詞變得不那么重要。我在下面繪制的圖表是在開始時(shí)將幾個(gè)這樣的詞添加到停用詞列表并重新運(yùn)行訓(xùn)練過程的結(jié)果。
tops = l_mdl.swtcs(foatd=Fase)
# 繪制主題關(guān)鍵詞的字?jǐn)?shù)和權(quán)重圖
fig, as = pltuls(2, 2, fiiz=(16,10), sey=rue, di=160)
fig.tigh_lyut_pad=2)
plt.shw()

按主題著色的句子圖表
文檔中的每個(gè)單詞都代表 4 個(gè)主題之一。讓我們根據(jù)給定文檔中的每個(gè)單詞所屬的主題 id 為其著色。
?
# 對(duì)N個(gè)句子進(jì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]
# 繪制矩形區(qū)域
tpcred = soted(tpps, key= x: (x[1]), rvese=True)
word_pos = 0.06
plt.subdt(wsace=0, hsace=0)
plt.show()
文件中討論最多的話題是什么?
讓我們計(jì)算歸因于每個(gè)主題的文檔總數(shù)。
# 對(duì)N個(gè)句子進(jìn)行著色
主導(dǎo)話題 = []
話題百分比 = []
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=-)
# 每個(gè)文檔中主導(dǎo)話題的分布
dfc = dh_dc.t_frme(ame='cunt').eeinex()
# 按實(shí)際權(quán)重計(jì)算的總主題分布
topweig = pd.DaaFae([dct(t) for t in toges] )
# 每個(gè)主題的前三個(gè)關(guān)鍵詞
[(i, tpic) for i, tocs in lda.shcs(fted=Flse)
for j, (tic, wt) in eae(toic)if j < 3)
讓我們做兩個(gè)圖:
通過將文檔分配給該文檔中權(quán)重最大的主題來(lái)計(jì)算每個(gè)主題的文檔數(shù)。
通過總結(jié)每個(gè)主題對(duì)各自文檔的實(shí)際權(quán)重貢獻(xiàn)來(lái)計(jì)算每個(gè)主題的文檔數(shù)量。
from mtpltli.tiker import ucFattr
# 繪圖
fig, (ax1, ax2) = pl.supot(1, 2)
# 按主要議題分布的議題
ax1.bar(data=df_dc)
# 按主題權(quán)重的主題分布
ax2.ar(x='iex', hegh='cout', dat=dfoc, with=.5,
plt.sow()

t-SNE(t分布-隨機(jī)鄰近嵌入)聚類圖
讓我們使用 t-SNE(t分布-隨機(jī)鄰近嵌入)算法在 2D 空間中可視化文檔集群。
# 獲取話題權(quán)重和主導(dǎo)話題 ------------
# 獲取主題權(quán)重
for i, row_list:
tophts.apd([w for i, w in rost[0]] )
# 主題權(quán)重的數(shù)組
arr = pd.Dame(tohts).fna(0).vales
# 保持良好的分離點(diǎn)(可選)
rr = ar[p.aax(rr) > 0.35] 。
# 每個(gè)文檔中的主要議題編號(hào)
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()

結(jié)論
我們從頭開始導(dǎo)入、清理和處理新聞組數(shù)據(jù)集構(gòu)建 LDA 模型。然后我們看到了多種可視化主題模型輸出的方法,包括詞云,它們直觀地告訴您每個(gè)主題中哪個(gè)主題占主導(dǎo)地位。t-SNE 聚類,?pyLDAVis
?提供了更多關(guān)于主題聚類的細(xì)節(jié)。

最受歡迎的見解
1.探析大數(shù)據(jù)期刊文章研究熱點(diǎn)
2.618網(wǎng)購(gòu)數(shù)據(jù)盤點(diǎn)-剁手族在關(guān)注什么
3.r語(yǔ)言文本挖掘tf-idf主題建模,情感分析n-gram建模研究
4.python主題建??梢暬痩da和t-sne交互式可視化
5.疫情下的新聞數(shù)據(jù)觀察
6.python主題lda建模和t-sne可視化
7.r語(yǔ)言中對(duì)文本數(shù)據(jù)進(jìn)行主題模型topic-modeling分析
8.主題模型:數(shù)據(jù)聆聽人民網(wǎng)留言板的那些“網(wǎng)事”
9.python爬蟲進(jìn)行web抓取lda主題語(yǔ)義數(shù)據(jù)分析