Python主題建模LDA模型、t-SNE 降維聚類、詞云可視化文本挖掘新聞組數(shù)據(jù)集|附代碼數(shù)據(jù)
全文鏈接:http://tecdat.cn/?p=24376
最近我們被客戶要求撰寫關(guān)于主題建模的研究報告,包括一些圖形和統(tǒng)計輸出。
在這篇文章中,我們討論了基于gensim?包來可視化主題模型 (LDA) 的輸出和結(jié)果的技術(shù)?
介紹
我們遵循結(jié)構(gòu)化的工作流程,基于潛在狄利克雷分配 (LDA) 算法構(gòu)建了一個主題模型。
在這篇文章中,我們將使用主題模型,探索多種策略以使用matplotlib
?繪圖有效地可視化結(jié)果?。
我將使用 20 個新聞組數(shù)據(jù)集的一部分,因為重點更多地放在可視化結(jié)果的方法上。
讓我們從導(dǎo)入包和 20 News Groups 數(shù)據(jù)集開始。
import?matplotlib.pyplot?as?plt#?NLTK停止詞fom?nlt.copus?imort?stowodssop_wrds?=?stowords.wrds('chinse')
導(dǎo)入新聞組數(shù)據(jù)集
讓我們導(dǎo)入新聞組數(shù)據(jù)集并僅保留 4 個?類別。
#?導(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)記句子并清理
刪除電子郵件、換行符、單引號,最后使用 gensim 將句子拆分為單詞列表?simple_preprocess()
。設(shè)置?deacc=True
?選項會刪除標(biāo)點符號。
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)?#?轉(zhuǎn)換為列表data?=?df.cnt.lus.tolist()
構(gòu)建雙字母組、三字母組模型和推理
讓我們使用模型形成雙字母組、三字母組。為了提高執(zhí)行速度,這個模型被傳遞給Phraser()。
接下來,將每個詞詞形還原為其詞根形式,僅保留名詞、形容詞、動詞和副詞。
我們只保留這些POS標(biāo)簽,因為它們對句子的含義貢獻最大。在這里,我使用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)?#?處理過的文本數(shù)據(jù)!
構(gòu)建主題模型
要使用 構(gòu)建 LDA 主題模型,您需要語料庫和字典。讓我們先創(chuàng)建它們,然后構(gòu)建模型。訓(xùn)練好的主題(關(guān)鍵字和權(quán)重)也輸出在下面。
如果你檢查一下主題關(guān)鍵詞,它們共同代表了我們最初選擇的主題。教會、冰球、地區(qū)和摩托車。很好!
#?創(chuàng)建字典id2od?=?copoDciary(dta_eay)#?創(chuàng)建語料庫。術(shù)語文檔頻率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)主題及其在每個文檔中的百分比貢獻
在 LDA 模型中,每個文檔由多個主題組成。但是,通常只有一個主題占主導(dǎo)地位。下面的代碼提取每個句子的主要主題,并在格式良好的輸出中顯示主題和關(guān)鍵字的權(quán)重。
這樣,您將知道哪個文檔主要屬于哪個主題。
????#?啟動輸出????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)????????#?獲取每個文檔的主導(dǎo)主題、perc貢獻和關(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()

每個話題最有代表性的一句話
有時您想獲得最能代表給定主題的句子樣本。此代碼為每個主題獲取最典型的句子。
#?顯示設(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)

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

import?sebon?as?snsfig.titat()fig.sbts_juo0.90)plt.xticks(np.lisa(0,00,9))plt.sow()
點擊標(biāo)題查閱往期內(nèi)容

Python之LDA主題模型算法應(yīng)用

左右滑動查看更多

01

02

03

04

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

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

按主題著色的句子圖表
文檔中的每個單詞都代表 4 個主題之一。讓我們根據(jù)給定文檔中的每個單詞所屬的主題 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]????????????????????????????#?繪制矩形區(qū)域????????????tpcred?=?soted(tpps,?key=?x:?(x[1]),?rvese=True)????????????word_pos?=?0.06???????????????plt.subdt(wsace=0,?hsace=0)??????plt.show()
文件中討論最多的話題是什么?
讓我們計算歸因于每個主題的文檔總數(shù)。
#?對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=-)????????????#?每個文檔中主導(dǎo)話題的分布dfc?=?dh_dc.t_frme(ame='cunt').eeinex()#?按實際權(quán)重計算的總主題分布topweig?=?pd.DaaFae([dct(t)?for?t?in?toges]?)#?每個主題的前三個關(guān)鍵詞?[(i,?tpic)?for?i,?tocs?in?lda.shcs(fted=Flse)??????????????????????????????????for?j,?(tic,?wt)?in?eae(toic)if?j?<?3)
讓我們做兩個圖:
通過將文檔分配給該文檔中權(quán)重最大的主題來計算每個主題的文檔數(shù)。
通過總結(jié)每個主題對各自文檔的實際權(quán)重貢獻來計算每個主題的文檔數(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分布-隨機鄰近嵌入)聚類圖
讓我們使用 t-SNE(t分布-隨機鄰近嵌入)算法在 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#?保持良好的分離點(可選)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?=?4mplot.scatter(xda[:,])

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

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

本文摘選?《?Python主題建模LDA模型、t-SNE 降維聚類、詞云可視化文本挖掘新聞組數(shù)據(jù)集?》?,點擊“閱讀原文”獲取全文完整資料。
點擊標(biāo)題查閱往期內(nèi)容
自然語言處理NLP:主題LDA、情感分析疫情下的新聞文本數(shù)據(jù)
【視頻】文本挖掘:主題模型(LDA)及R語言實現(xiàn)分析游記數(shù)據(jù)
NLP自然語言處理—主題模型LDA案例:挖掘人民網(wǎng)留言板文本數(shù)據(jù)
Python主題建模LDA模型、t-SNE 降維聚類、詞云可視化文本挖掘新聞組數(shù)據(jù)集
自然語言處理NLP:主題LDA、情感分析疫情下的新聞文本數(shù)據(jù)
R語言對NASA元數(shù)據(jù)進行文本挖掘的主題建模分析
R語言文本挖掘、情感分析和可視化哈利波特小說文本數(shù)據(jù)
Python、R對小說進行文本挖掘和層次聚類可視化分析案例
用于NLP的Python:使用Keras進行深度學(xué)習(xí)文本生成
長短期記憶網(wǎng)絡(luò)LSTM在時間序列預(yù)測和文本分類中的應(yīng)用
用Rapidminer做文本挖掘的應(yīng)用:情感分析
R語言文本挖掘tf-idf,主題建模,情感分析,n-gram建模研究
R語言對推特twitter數(shù)據(jù)進行文本情感分析
Python使用神經(jīng)網(wǎng)絡(luò)進行簡單文本分類
用于NLP的Python:使用Keras的多標(biāo)簽文本LSTM神經(jīng)網(wǎng)絡(luò)分類
R語言文本挖掘使用tf-idf分析NASA元數(shù)據(jù)的關(guān)鍵字
R語言NLP案例:LDA主題文本挖掘優(yōu)惠券推薦網(wǎng)站數(shù)據(jù)
Python使用神經(jīng)網(wǎng)絡(luò)進行簡單文本分類
R語言自然語言處理(NLP):情感分析新聞文本數(shù)據(jù)
Python、R對小說進行文本挖掘和層次聚類可視化分析案例
R語言對推特twitter數(shù)據(jù)進行文本情感分析
R語言中的LDA模型:對文本數(shù)據(jù)進行主題模型topic modeling分析
R語言文本主題模型之潛在語義分析(LDA:Latent Dirichlet Allocation)R語言對NASA元數(shù)據(jù)進行文本挖掘的主題建模分析
R語言文本挖掘、情感分析和可視化哈利波特小說文本數(shù)據(jù)
Python、R對小說進行文本挖掘和層次聚類可視化分析案例
用于NLP的Python:使用Keras進行深度學(xué)習(xí)文本生成
長短期記憶網(wǎng)絡(luò)LSTM在時間序列預(yù)測和文本分類中的應(yīng)用
用Rapidminer做文本挖掘的應(yīng)用:情感分析
R語言文本挖掘tf-idf,主題建模,情感分析,n-gram建模研究
R語言對推特twitter數(shù)據(jù)進行文本情感分析
Python使用神經(jīng)網(wǎng)絡(luò)進行簡單文本分類
用于NLP的Python:使用Keras的多標(biāo)簽文本LSTM神經(jīng)網(wǎng)絡(luò)分類
R語言文本挖掘使用tf-idf分析NASA元數(shù)據(jù)的關(guān)鍵字
R語言NLP案例:LDA主題文本挖掘優(yōu)惠券推薦網(wǎng)站數(shù)據(jù)
Python使用神經(jīng)網(wǎng)絡(luò)進行簡單文本分類
R語言自然語言處理(NLP):情感分析新聞文本數(shù)據(jù)
Python、R對小說進行文本挖掘和層次聚類可視化分析案例
R語言對推特twitter數(shù)據(jù)進行文本情感分析
R語言中的LDA模型:對文本數(shù)據(jù)進行主題模型topic modeling分析
R語言文本主題模型之潛在語義分析(LDA:Latent Dirichlet Allocation)