共计 6106 个字符,预计需要花费 16 分钟才能阅读完成。
原文链接: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
提供了更多对于主题聚类的细节。
最受欢迎的见解
1. 探析大数据期刊文章钻研热点
2.618 网购数据盘点 - 剁手族在关注什么
3.r 语言文本开掘 tf-idf 主题建模,情感剖析 n -gram 建模钻研
4.python 主题建模可视化 lda 和 t -sne 交互式可视化
5. 疫情下的新闻数据察看
6.python 主题 lda 建模和 t -sne 可视化
7.r 语言中对文本数据进行主题模型 topic-modeling 剖析
8. 主题模型:数据凝听人民网留言板的那些“网事”
9.python 爬虫进行 web 抓取 lda 主题语义数据分析