当前位置:   article > 正文

Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集

python主题建模lda模型、t-sne 降维聚类、词云可视化文本挖掘新闻组数据集

全文链接:http://tecdat.cn/?p=24376

在这篇文章中,我们讨论了基于gensim 包来可视化主题模型 (LDA) 的输出和结果的技术 。

介绍

我们遵循结构化的工作流程,基于潜在狄利克雷分配 (LDA) 算法构建了一个主题模型。

在这篇文章中,我们将使用主题模型,探索多种策略以使用matplotlib 绘图有效地可视化结果 。

相关视频:文本挖掘主题模型(LDA)及R语言实现

我将使用 20 个新闻组数据集的一部分,因为重点更多地放在可视化结果的方法上。

让我们从导入包和 20 News Groups 数据集开始。

  1. import matplotlib.pyplot as plt
  2. # NLTK停止词
  3. fom nlt.copus imort stowods
  4. sop_wrds = stowords.wrds('chinse')

导入新闻组数据集

让我们导入新闻组数据集并仅保留 4 个 类别。

  1. # 导入数据集
  2. d = f.oc\[dftargt_name.in(\[so.relion.chritan\], 'ec.sot.okey''ak.piticmdast' 'rec.oorcyces'\]) , :\]
  3. prin(f.hpe) #> (23613)
  4. df.(

708296b05ff6a56c041133d59849b1e7.png

标记句子并清理

删除电子邮件、换行符、单引号,最后使用 gensim 将句子拆分为单词列表 simple_preprocess()。设置 deacc=True 选项会删除标点符号。

  1. def snds(seecs):
  2.     for setees in sntces:
  3.         sent = r.sub('\\S*@\\S*\\s?''', sent) # 删除电子邮件
  4.         snt = re.sb('\\s+''', sent) # 移除换行字符
  5.         set = re.sb("\\'""", sent) # 删除单引号
  6.         set = geim.uls.smplprerss(str(sent), deacc=True) 
  7. # 转换为列表
  8. data = df.cnt.lus.tolist()

构建双字母组、三字母组模型和推理

让我们使用模型形成双字母组、三字母组。为了提高执行速度,这个模型被传递给Phraser()。

接下来,将每个词词形还原为其词根形式,仅保留名词、形容词、动词和副词。

我们只保留这些POS标签,因为它们对句子的含义贡献最大。在这里,我使用spacy进行词法处理。

  1. # 建立大词和三词模型
  2. bigrm = endl.Pres(dta_ords, mncnt=5, thrshl=100) # 更高的阈值会减少短语。
  3. tigam = genm.del.Prses(bga\[dtawors\], thrhld=100)  
  4. bigm_od = gsim.molpss.Pasr(bgrm)
  5. tigrmod = genm.mos.pres.hrser(tigam)
  6.  # 在终端运行一次
  7.     ""删除止损词,形成大词、三词和词组""
  8.     texts = \[\[wor fo wrd in sipeeproe(tr(dc)) 
  9.      \[iram_od\[oc\] for doc in txts\]
  10.     tets = \[rirammod\[igrmmod\[dc\]\] for dc in tets\]
  11.     tetout = \[\]
  12.     np = scy.oad('en', dial=\['解析器''ner'\])
  13.     for set in txs:
  14.         dc = np(" ".join(sn)) 
  15.         tex_.ppd(\[tknlea_ fr toen in oc if toenpo_ in aowed_ots\])
  16.     # 在词法化之后,再一次删除停止词
  17. atady = roe\_os(daa\_ds) # 处理过的文本数据!

构建主题模型

要使用 构建 LDA 主题模型,您需要语料库和字典。让我们先创建它们,然后构建模型。训练好的主题(关键字和权重)也输出在下面。

如果你检查一下主题关键词,它们共同代表了我们最初选择的主题。教会、冰球、地区和摩托车。很好!

  1. # 创建字典
  2. id2od = copoDciary(dta_eay)
  3. # 创建语料库。术语文档频率
  4. crpus = \[i2wod.o2bow(ext) for txt in daa_ey\]
  5. # 建立LDA模型
  6. Lal(copus=copus,
  7.                                            id2wrd=id2wrd,
  8.                                            nu_tpic=4
  9.                                            radom_ate=100,
  10.                                            updaeeery=1,
  11.                                            chnsie=10,
  12.                                            pas=10
  13.                                            alha='symmetric',
  14.                                            iteatos=100,
  15.                                            prdics=True)
  16. (ldampcs())

什么是主导主题及其在每个文档中的百分比贡献

在 LDA 模型中,每个文档由多个主题组成。但是,通常只有一个主题占主导地位。下面的代码提取每个句子的主要主题,并在格式良好的输出中显示主题和关键字的权重。

这样,您将知道哪个文档主要属于哪个主题。

  1. # 启动输出
  2.     se_tpcf = p.Dataame()
  3.     # 获取每个文档中的主要话题
  4.     for i, ro_isin enate(ldmoel\[crps\]):
  5.         rw = rw\_s0\] if lamoel.pe\_wortopis else rowlis            
  6.         row = soed(ow, ky=laba x: (x\[1\]), evre=True)
  7.         # 获取每个文档的主导主题、perc贡献和关键词
  8.         for j, (toicum, pr_pic) in enate(row):
  9.             if j == 0: # => 主导话题
  10.                 wp = ldel.shotoic(topic_num)
  11.  
  12.     # 在输出的最后添加原始文本
  13. deeos = fratcs(lodel=damoe, copus=crpus, tets=dary)
  14. # 格式化
  15. topic = os.retidex()

d558a33ce32d020dcd89c24bdc610570.png

每个话题最有代表性的一句话

有时您想获得最能代表给定主题的句子样本。此代码为每个主题获取最典型的句子。

  1. # 显示设置,在列中显示更多的字符
  2. for i, grp in serpd:
  3.     senlet = pd.cnct(\[senlet, 
  4.                                              gp.srtes(\['Peion'\], asng=Fase).hed(1)\] 
  5.                                             ais=0)
  6. # 重置索引    
  7. seet.resex(drp=True, inlce=True)
  8. # 格式化
  9. senllet.couns = \['Toum'"TopCorib""Kywrds""rsa xt"\]
  10. # 显示
  11. sencoet.head(10)

5a7f105289e73a38df03031285db724a.png

文档中字数的频率分布

在处理大量文档时,您想知道文档的整体大小和主题大小。让我们绘制文档字数分布。

  1. # 绘图
  2. plt.fiue(fe=(6,7), dpi=60)
  3. plt.xtcs(nplic(0,00,9))

ce1b5f238c16b0e45b19287342094afa.jpeg

  1. import sebon as sns
  2. fig.titat()
  3. fig.sbts_juo0.90)
  4. plt.xticks(np.lisa(0,00,9))
  5. plt.sow()

51dad63c553402a2e94eb07e8fe61870.jpeg


点击标题查阅往期内容

4febf7abd2df835e9aa0948789e1372f.png

Python之LDA主题模型算法应用

outside_default.png

左右滑动查看更多

outside_default.png

01

56d351b7ebde46843271ba932c7aeeaa.png

02

fca8e0e8f5a562d929cd5a0ee3aff611.png

03

a75e52de068e9678357471c5f6365493.png

04

4daff61c7084eba04b220691b597dca4.png

每个话题的前N个关键词词云

虽然你已经看到了每个主题中的主题关键词是什么,但字数大小与权重成正比的词云是很好的可视化方法。

  1. 1. 每个主题中前N个词的词云
  2. from matplotlib import pyplot as plt
  3. from worcloud mport WrCloud,STOPWODS
  4. clod = WordClud(stopwds=stp_ords,
  5.                   barounolr='white',
  6.                  
  7.                   reer_oronal=1.0)
  8. plt.sow()

8fa9e8d1a61d6eabbf985e18c0017709.jpeg

主题关键词的字数

当涉及主题中的关键字时,关键字的重要性(权重)很重要。除此之外,这些单词在文档中出现的频率也很有趣。

让我们在同一图表中绘制字数和每个关键字的权重。

您要关注出现在多个主题中的词以及相对频率大于权重的词。通常,这些词变得不那么重要。我在下面绘制的图表是在开始时将几个这样的词添加到停用词列表并重新运行训练过程的结果。

  1. tops = l_mdl.swtcs(foatd=Fase)
  2.     
  3. # 绘制主题关键词的字数和权重图
  4. fig, as = pltuls(22, fiiz=(16,10), sey=rue, di=160)
  5. fig.tigh\_lyut\_pad=2)    
  6. plt.shw()

f741b47e0db562e4723bceda3a3b0b9f.jpeg

按主题着色的句子图表

文档中的每个单词都代表 4 个主题之一。让我们根据给定文档中的每个单词所属的主题 id 为其着色。

  1. # 对N个句子进行着色的句子
  2.       for i, ax in eumate(xes):
  3.             cour = corp\[i-1\] 。
  4.             topprcs, wrdits, wrdihius = lda\[copr\]
  5.             wodoac = \[(lmod2word\[wd\], tpic\[0\]) or w, tpc in odid_opcs\]    
  6.             
  7.             # 绘制矩形区域
  8.             tpcred = soted(tpps, key= x: (x\[1\]), rvese=True)
  9.             word_pos = 0.06
  10.            
  11.     plt.subdt(wsace=0, hsace=0)
  12.   
  13.     plt.show()

文件中讨论最多的话题是什么?

让我们计算归因于每个主题的文档总数。

  1. # 对N个句子进行着色
  2.     主导话题 = \[\]
  3.     话题百分比 = \[\]
  4.     for i, crp in euete(opu_el):
  5.         topcs, wordics, wrlues = moel\[crp\]
  6.         dopic = soted(torcs, key = lmda x: x\[1\], reerse=Tue)\[0\]\[0\] 。
  7. doics, toages = topent(mol=lda, copus=crus,en=-)            
  8. # 每个文档中主导话题的分布
  9. dfc = dh\_dc.t\_frme(ame='cunt').eeinex()
  10. # 按实际权重计算的总主题分布
  11. topweig = pd.DaaFae(\[dct(t) for t in toges\] )
  12. # 每个主题的前三个关键词
  13.  \[(i, tpic) for i, tocs in lda.shcs(fted=Flse) 
  14.                                  for j, (tic, wt) in eae(toic)if j < 3)

让我们做两个图:

  • 通过将文档分配给该文档中权重最大的主题来计算每个主题的文档数。

  • 通过总结每个主题对各自文档的实际权重贡献来计算每个主题的文档数量。

  1. from mtpltli.tiker import ucFattr
  2. # 绘图
  3. fig, (ax1, ax2) = pl.supot(12)
  4. # 按主要议题分布的议题
  5. ax1.bar(data=df_dc)
  6. # 按主题权重的主题分布
  7. ax2.ar(x='iex', hegh='cout', dat=dfoc, with=.5
  8. plt.sow()

9e4e0767e9de5196fa948b1ef8e5d1be.jpeg

t-SNE(t分布-随机邻近嵌入)聚类图

让我们使用 t-SNE(t分布-随机邻近嵌入)算法在 2D 空间中可视化文档集群。

  1. # 获取话题权重和主导话题 ------------
  2. # 获取主题权重
  3. for i, row_list:
  4.     tophts.apd(\[w for i, w in rost\[0\]\] )
  5. # 主题权重的数组    
  6. arr = pd.Dame(tohts).fna(0).vales
  7. # 保持良好的分离点(可选)
  8. rr = ar\[p.aax(rr) > 0.35\] 。
  9. # 每个文档中的主要议题编号
  10. to_n = np.agax(rr, ais=1)
  11. # tSNE降维
  12. tsel = TSE(n=2, vre=1, rae=0, ae=.99int='pca')
  13. tlda = tsl.frm(arr)
  14. # 使用Bokeh绘制主题集群图
  15. oueook()
  16. n_tics = 4
  17. m
  18. plot.scatter(xda\[:,\])

1de12e8557c03d914a07110ee1e14330.jpeg

pyLDAVis

最后,pyLDAVis 是最常用的,也是一种将主题模型中包含的信息可视化的好方法。

pyLDvis.enaok()

b5b7bd3e31ed8bf151c519eb00f09d79.png

结论

我们从头开始导入、清理和处理新闻组数据集构建 LDA 模型。然后我们看到了多种可视化主题模型输出的方法,包括词云,它们直观地告诉您每个主题中哪个主题占主导地位。t-SNE 聚类, pyLDAVis 提供了更多关于主题聚类的细节。


fee3f2a62f690f732c855db387056744.jpeg

本文摘选Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集,点击“阅读原文”获取全文完整资料。


点击标题查阅往期内容

自然语言处理NLP:主题LDA、情感分析疫情下的新闻文本数据

【视频】文本挖掘:主题模型(LDA)及R语言实现分析游记数据

NLP自然语言处理—主题模型LDA案例:挖掘人民网留言板文本数据

Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集

自然语言处理NLP:主题LDA、情感分析疫情下的新闻文本数据

R语言对NASA元数据进行文本挖掘的主题建模分析

R语言文本挖掘、情感分析和可视化哈利波特小说文本数据

Python、R对小说进行文本挖掘和层次聚类可视化分析案例

用于NLP的Python:使用Keras进行深度学习文本生成

长短期记忆网络LSTM在时间序列预测和文本分类中的应用

用Rapidminer做文本挖掘的应用:情感分析

R语言文本挖掘tf-idf,主题建模,情感分析,n-gram建模研究

R语言对推特twitter数据进行文本情感分析

Python使用神经网络进行简单文本分类

用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类

R语言文本挖掘使用tf-idf分析NASA元数据的关键字

R语言NLP案例:LDA主题文本挖掘优惠券推荐网站数据

Python使用神经网络进行简单文本分类

R语言自然语言处理(NLP):情感分析新闻文本数据

Python、R对小说进行文本挖掘和层次聚类可视化分析案例

R语言对推特twitter数据进行文本情感分析

R语言中的LDA模型:对文本数据进行主题模型topic modeling分析

R语言文本主题模型之潜在语义分析(LDA:Latent Dirichlet Allocation)

R语言对NASA元数据进行文本挖掘的主题建模分析

R语言文本挖掘、情感分析和可视化哈利波特小说文本数据

Python、R对小说进行文本挖掘和层次聚类可视化分析案例

用于NLP的Python:使用Keras进行深度学习文本生成

长短期记忆网络LSTM在时间序列预测和文本分类中的应用

用Rapidminer做文本挖掘的应用:情感分析

R语言文本挖掘tf-idf,主题建模,情感分析,n-gram建模研究

R语言对推特twitter数据进行文本情感分析

Python使用神经网络进行简单文本分类

用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类

R语言文本挖掘使用tf-idf分析NASA元数据的关键字

R语言NLP案例:LDA主题文本挖掘优惠券推荐网站数据

Python使用神经网络进行简单文本分类

R语言自然语言处理(NLP):情感分析新闻文本数据

Python、R对小说进行文本挖掘和层次聚类可视化分析案例

R语言对推特twitter数据进行文本情感分析

R语言中的LDA模型:对文本数据进行主题模型topic modeling分析

R语言文本主题模型之潜在语义分析(LDA:Latent Dirichlet Allocation)

b5d6fe0afedcd449be244b4228af5749.png

80e127561b9a679dc7d410512a621d9b.jpeg

902b2db4bc6652433a4350e2ba366eba.png

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号