LDA主题提取,lda文本主题模型
主题LDA的实现及其可视化。文档主题的无监督抽取——LDA模型1.1准备工作1.2调用api实现模型2。LDA ——pyLDAvis2.1可视化交互分析安装pyLDAvis2.2用gensim调用api实现可视化P.S .将结果保存为独立网页p.p.s加快准备速度?2.3如何分析pyLDAvis可视化结果2.3.1。**每个主题是什么意思?**2.3.2每个主题的常见程度如何?2.3.3主题之间的关系是什么?
1.文档主题的无监督抽取——LDA模型
这个模型的具体介绍和应用场景我就不说了,只知道
它能从一堆的文本中给你反馈出规定主题数的词语聚类
。因为是无监督的算法,所以意味着不需要准备训练集,也不需要煞费苦心的标注。在数据准备阶段,任务负载至少节省一半。
作为一个数学hcddt,如果没有必要,我总是不想深究具体原理。只要有人证明可行,我就用。聪明的头脑应该充分利用彼此(笑
但也许我终究逃不开去学原理。原理的解释先放在这里,需要的时候再看。
所以本文主要介绍
如何上手实现
和如何分析结果
,这是数据科学家应该做的。1.1开始着手准备工作。以这个作品为例,我需要分析500个用户抓取的500个微博页面的主题,大约500 * 50 * 10=25万条微博文本。也就是说,我想看看这些人的微博主要关注什么,他们一起关注什么。
编程环境:
python 3.6 pycharm 2018,
LDA实现使用的包是
gensim
,还是用我们的老朋友
jieba
。
数据准备:
爬到csv中存储的原始数据,我要的是把所有的微博文本分支读入一个txt,然后把单词分割成停词,这样会符合gensim的输入标准。
分词前:
分词后:
code
用于处理原文。
def stopwodslist(file path):stop words=[line . strip()for line in open(file path, r ,Encoding= utf-8 )。read lines()]return stop words # divide sentences def seg _ sentence(sentence):sentence=re sub(u [0-9 .],u ,句子)jb.add _ word(光摄影学院)Jb.add_word(依然单身鸵鸟老师)#同样,如果你想删除某个特定的未登录词,只需先添加,然后放入非索引字表即可。Jb.add_word(网页链接)jb.add_word(微博视频)jb.add_word(头条文章发布)jb.add_word(青春有你)jb.add_word(清幽)sentence _ segmented=jb .cut(STOP WORDS=STOP WORDS LIST( STOP WORDS/STOP WORDS . txt )#这里加载STOP WORDS的路径是out str= for word in sentence _ segmented:if word not in STOP WORDS and word。_ _ len _ _ () 1: if word!= t :outstr=word outstr= return outputs=open( input/like _ mi10 _ user _ all _ retweet . txt , r ,Encoding= utf-8 )outputs=open( output 1/mi10 _ user _ retweet _ fc . txt , w ,Encoding= UTF-8 )for line in inputs:line _ seg=seg _ sentence(line)#这里的返回值是字符串outputs . write(line _ seg n )outputs . close()inputs。
Gensim非常友好。字典,词袋模型,lda模型都是一句话搞定的。
code
from gensim import corpora from gensim . models import ldamomodel from gensim . corpora import dictionary train=[]FP=codecs . open( output 1/mi10 _ user _ retweet _ fc . txt , r ,encoding= utf8 )for line in FP:if line!= :line=line . split()train . append([w for w in line])dictionary=corpora。dictionary(train)corpus=[dictionary . doc 2 bow(text)for text in train]LDA=LDA model(corpus=corpus,id2word=dictionary,num_topics=20,Passes=60)# num_topics:主题数# passes:训练数# num _ words:LDA . Print _ topics(num _ words=20)中主题的每个主题下输出的词条数:term num=topic[0]Print(topic[0],:,sep= )词条列表=topic [1]。对术语列表中的术语进行拆分(“”):listitems=term . split(“*”)print(“”),listitems [1],“(”),listitems
0:“北京”(0.024)“疫情”(0.021)“中国联通”(0.019)“优惠券收藏”(0.019)“购物”(0.016)“新冠肺炎”(0.016)“独家”(0.012)“人民币优惠券”优惠(0.011)“肺炎”(0.010)“新闻”(0.010)“病例”(0.010)“汽车”(0.009)1:“小米”(0.133)“红米”(0.019)“新浪”(0.019).这种。他只会回你指定题号下的字数。每个词后的小数可以认为是
这个词属于这个主题的概率
,题目下所有词的概率和为1;而这个主题应该是什么,取决于你的人工分析来定义。那么,盯着这堆冰冷的文字和数字,也许你可以用概率来衡量这个字和这个题目的关系,但是你能看出不同题目之间的关系吗?你能看出一个词和其他话题的关系吗?
有点难。这时候就要介绍我们的LDA可视化分析工具了。
2.LDA的可视化交互分析。——pyLDAvis先放上效果图:
2.1安装pyLDAvis pip install pyldavis会安装很多依赖包。包括:
源代码和文档
直接使用指南
2.2用gensim调用api实现可视化。pyldavis支持直接导入三个包中的LDA模型:sklearn、gensim和graphlab。看来你也可以自己算算。当然,这里沿用的是gensim在上一篇文章中直接得到的lda模型。
PyLDAvis也很友好,用同一句话实现:
代码片段 d=pyldavis.gensim.prepare (LDA,Corpus,Dictionary) LDA:计算主题模型语料库:文档词频矩阵词典:词空间 pyLDAvis.show(d)#在浏览器中显示# pyLDAvis.displace(d) #在笔记本的输出单元格中显示数据量大,运行时间稍长。
P.S .将结果保存为独立网页。同时,如果您想将结果保存为独立的网页以便共享或放入web系统,您可以这样做:
D=Pyldavis.gensim.prepare (LDA,Corpus,Dictionary)pyl Davis . Save _ html(d, LDA _ PAS10.html) #将结果另存为这个HTML文件,这样就不用每次运行结果都要等很长时间。
P.p.s .加快准备速度?是的,这个可视化过程真的很慢。我用时间计时。测试时为了节省时间,gensim只训练了一次,用了58s,然后等待pyLDAvis的渲染。你已经等了一个多小时了吗?400s……终于出来了。
然后很快保存为网页。
在此期间,电脑CPU的利用率一直保持在100%,pycharm约占90%。结果我气得没截图。我立即尝试了新方案:
D=pyldavis.gensim.prepare (LDA,语料库,词典,MDS= mmds )酱紫色。
实际测试,可以说,没有效果。
同时,这种选择算法的参数也可以是tsne。不同算法的区别还是在文档里。
2.3如何分析这一页pyLDAvis可视化结果,说不复杂,左边的气泡分布是不同的主题,右边是主题内的前30个特征词。浅蓝色表示该词在整个文档中的出现频率(权重),深红色表示该词在该主题中的权重。右上角可以调整一个参数,然后它的功能会往下看。
因此,我们最后回答LDAvis的作者在开发这个工具时要解决的三个问题:
2.3.1.
每个主题表示什么意义?
鼠标悬停在左边的气泡上,我们可以选择查看某个具体的话题。被选中后,右侧面板会相应显示与该话题相关的文字。通过总结这些词所表达的意思,我们可以总结出这个题目的意思。同时,哪个词在主题上的权重更高?一个词主题的相关性是由参数调节的。
如果接近1,那么在这个题目下出现频率较高的词与题目相关性较大;
如果更接近于0,那么这个话题下更特殊、更排斥的词就更与话题相关(意为TF-IDF)。
因此,我们可以通过调整的大小来改变词与主题之间的关联性,发掘更多的主题意义感。
2.3.2每个主题有多常见?运行主题建模后,我们可以知道每个主题出现的频率。LDAvis的作者把这个数字表示为
圆圈的大小
,也按顺序编号为1~n。所以气泡的大小和数量表明了主题的频率。2.3.3主题之间的关系是什么?这里作者采用多维尺度分析,提取
主成分
为维度,将主题分布到这两个维度上。主题之间的距离表示主题之间的接近度。气泡距离就是JSD距离,可以认为是题目之间的差异。气泡重叠说明这两个题目中的特征词有交叉。知道这些后,就该念词说话了。看看这些单词应该说什么,并提取不同的主题。这是具有实际应用价值的结果。如果没有最终的结果输出,之前所做的一切都将是一张废纸。
先总结到这里吧。抛开理论层面,应该够了。