在这篇文章中,我们讨论了基于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.ocdftargtname.in(\[so.relion.chritan 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(bgadtawors dtawors, thrhld=100) bigm_od = gsim.molpss.Pasr(bgrm) tigrmod = genm.mos.pres.hrser(tigam) # 在终端运行一次 ""删除止损词,形成大词、三词和词组"" texts = \[\[wor fo wrd in sipeeproe(tr(dc)) iramod\[oc iram_od\[oc for doc in txts\] tets = rirammod\[igrmmod\[dc 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(ldmoelcrps 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()
Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集2;https://developer.aliyun.com/article/1485103