专栏首页源懒由码python 舆情分析 nlp主题分析 (3) --gensim库的简单使用

python 舆情分析 nlp主题分析 (3) --gensim库的简单使用

python 舆情分析 nlp主题分析 (1) 待续: https://www.cnblogs.com/cycxtz/p/13663895.html

python 舆情分析 nlp主题分析 (2)-结合snownlp与jieba库,提高分词与情感判断 待续:https://www.cnblogs.com/cycxtz/p/13695865.html

前文摘要:
微博热门话题:#中印双方达成五点共识# 阅读量2.4亿,讨论7430条。

1、数据采集,使用python+selenium,采集该话题下的博文及作者信息,以及每个博文下的评论及作者信息;

2、数据预处理,采用Jieba库,构建用户词典,以达到更好的分词;情感分析,采用snownlp库,寻找政治类积极和负面词向量做一个训练,再进行评论分类;

3、对博文及评论作者信息进行分析,查看调查主体的用户类别概况;

4、lda主题分析,对博文做主题分析,依据top3主题关键字,对博文群主类看法进行分析;对正、负向评论做一次主题分析,并分别分析观点;

第1、2已完成,但是原始的积极和负面词料库不是特别好。最后一步是进行评论分析,本篇文章是学习gensim的使用方法。

参考资料:

使用gensim简单地跑个LDA模型:https://zhuanlan.zhihu.com/p/134161509

在已经1、文本预处理及分好词的基础上,整个流程大概为:2、使用语料库建立词典->3、语料库向量化(普通向量化/tfidf向量化)->4、调用模型->5、可视化显示,分析

由于简单评论的语料库不小心被删除....只好使用博文进行一波操作。

1.1、文本预处理,手动删除一些无效字符串。

# 读取源数据
data = pd.read_excel(r'../data/npl_asan/wenzhangs.xlsx',dtype=object)

# 构造一个需要删除的字符串列表
list_del = data['actor_name'].values.tolist()
list_del = list(set(list_del))
list_del.append('收起全文d')
list_del.append('中印双方达成五点共识')
list_del.append('#')
list_del.append('*')
list_del.append(r'\n')
list_del.append('\n')
list_del.append('\u200b')
list_del.append(r'↓')
list_del.append(r' ')
#list_del.append(r'?')

data['clear'] = data['content'].str.strip()

1.2分词处理

# 定义自定义分词函数,但是结果不对
def my_cut_handle(sent):
    return jieba.lcut(sent)

# 修改分词方法
seg.set_my_handle(my_cut_handle)
#自己准备的常用词词典
jieba.load_userdict(r'../data/npl_asan/words.txt') 

# 对语料库进行分词处理
words = []
for index, row in data.iterrows():
    sentence = row['clear']
    for l in list_del:
        sentence = sentence.replace(l,"")
    # 替换和去重
    s = SnowNLP(sentence)
    words.append(s.words_filter_stop)  # 去掉停止词

2、通过语料库建立词典

dictionary = corpora.Dictionary(words) #建立词典
#dictionary.save(r'../data/npl_asan/qzone.dict')  # 把字典存储下来,可以在以后直接导入

3、语料库向量化

# 普通向量化
corpus = [dictionary.doc2bow(s) for s in words]
#corpora.MmCorpus.serialize(r'../data/npl_asan/corpus_bow.mm', corpus)  # 存储语料库

# 词向量改成使用tfidf计量
tfidf = models.TfidfModel(corpus)
corpus_tfidf = tfidf[corpus]

4、调用建模

# 构建5个主题
model = models.LdaModel(corpus,id2word=dictionary,num_topics=5)
#model.save(r'../data/npl_asan/npl_asan.model')  # 将模型保存到硬盘
model.show_topics()

lda = models.LdaModel(corpus_tfidf, id2word = dictionary, num_topics = 5)
model.show_topics()
# 模型结果1

[(0,
  '0.010*"共识" + 0.008*"阿三" + 0.006*"中" + 0.006*"达成" + 0.006*"印度" + 0.005*"印" + 0.005*"看" + 0.005*"2" + 0.004*"边境" + 0.004*"\ue627"'),
 (1,
  '0.025*"印度" + 0.016*"中" + 0.013*"印" + 0.012*"边境" + 0.012*"中国" + 0.009*"共识" + 0.009*"不" + 0.009*"都" + 0.008*"外长" + 0.007*"达成"'),
 (2,
  '0.024*"印度" + 0.012*"不" + 0.012*"中国" + 0.010*"阿三" + 0.009*"两" + 0.008*"共识" + 0.008*"印" + 0.008*"中" + 0.007*"边境" + 0.005*"国家"'),
 (3,
  '0.032*"印度" + 0.013*"中国" + 0.008*"不" + 0.008*"视频" + 0.008*"说" + 0.007*"L" + 0.007*"都" + 0.007*"共识" + 0.007*"微博" + 0.005*"好"'),
 (4,
  '0.012*"共识" + 0.012*"印度" + 0.010*"希望" + 0.009*"达成" + 0.008*"印" + 0.008*"中" + 0.007*"中国" + 0.007*"五点" + 0.007*"都" + 0.006*"说"')]
# 模型结果2
[(0,
  '0.003*"共识" + 0.003*"印度" + 0.002*"视频" + 0.002*"微博" + 0.002*"L" + 0.002*"美国" + 0.002*"阿三" + 0.002*"达成" + 0.002*"说" + 0.002*"印方"'),
 (1,
  '0.003*"一套" + 0.003*"好" + 0.003*"共识" + 0.003*"说" + 0.003*"达成" + 0.003*"希望" + 0.002*"阿三" + 0.002*"印方" + 0.002*"做一套" + 0.002*"防"'),
 (2,
  '0.003*"印度" + 0.003*"阿三" + 0.002*"一套" + 0.002*"不" + 0.002*"希望" + 0.002*"2" + 0.002*"人" + 0.002*"背后" + 0.002*"会" + 0.002*"出尔反尔"'),
 (3,
  '0.004*"希望" + 0.003*"印度" + 0.003*"中国" + 0.003*"共识" + 0.003*"中" + 0.003*"印" + 0.003*"外长" + 0.002*"五点" + 0.002*"阿三" + 0.002*"两"'),
 (4,
  '0.002*"印度" + 0.002*"出尔反尔" + 0.002*"…" + 0.002*"阿三" + 0.002*"一套" + 0.002*"战报" + 0.002*"希望" + 0.002*"中国" + 0.001*"共识" + 0.001*"说到做到"')]

5、数据可视化

import pyLDAvis.gensim

vis = pyLDAvis.gensim.prepare(lda, corpus, dictionary)
# 需要的三个参数都可以从硬盘读取的,前面已经存储下来了
pyLDAvis.display(vis)

结论:从4、5汇聚的主题来看:大概可以认为,从收集的文章中,大家希望和平共处,达成共识,但是对阿三的出尔反尔老赖行为有所预期,其中还存在美国的干扰。

一家之言,没有代表性,希望世界和平。

总结:

大概掌握了lda分析的流程。

不足:1、没有进行文本分类(积极、消极),直接进行主题分析,主题有点混淆不是很明确;2、文本预处理欠缺,主题中存分隔符货一些无效词汇。

改进:需要积累文本分类素材,打磨文本分类模型;提高词典分词准确性,以及文本预处理有效性。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++ share_prt 简单设计和实现

    C++ 比较烦恼的是内存的管理,new是简单,不够,delete偶尔就会忘记。或者说,出现,多个对象共享多一个内存,一个delete以后,导致其他也不能用的不良...

    forxtz
  • arp 地址解析协议

    这个时候,就涉及到一个 arp缓存表(<ip,mac>),每个主机都有这么个缓存表,也是为了能够节省网络上arp报文的数量。(分动态项和静态项,动态项的话,就会...

    forxtz
  • functional 和 bind 用法

    使用 functional 和 bind 就可以简单绑定类成员函数参数,且能指定对象。

    forxtz
  • 『互联网架构』软件架构-深入理解Ribbon(93)

    2.见示例:05-ms-consumer-order-ribbon-customizing-properties

    IT故事会
  • [python][matlab]使用py

    在做实验的时候,需要用到python和matlab工具来进行不同的处理,比如在run神经网络的时候,需要使用pytorch框架得到网络的各个参数,在得到参数后需...

    py3study
  • 我是 SPI,我让框架更加优雅了!

    自从上次小黑进入公司的架构组之后,小黑就承担起整个公司底层框架的开发工作。就在刚刚,小黑又接到一个任务:做一个通用的歌曲信息解析框架。即输入歌曲数据,之后返回该...

    Java后端技术
  • 我是 SPI,我让框架更加优雅了!

    自从上次小黑进入公司的架构组之后,小黑就承担起整个公司底层框架的开发工作。就在刚刚,小黑又接到一个任务:做一个通用的歌曲信息解析框架。即输入歌曲数据,之后返回该...

    java进阶架构师
  • 我是SPI,我让框架更加优雅了!

    自从上次小黑进入公司的架构组之后,小黑就承担起整个公司底层框架的开发工作。就在刚刚,小黑又接到一个任务:做一个通用的歌曲信息解析框架。即输入歌曲数据,之后返回该...

    陈树义
  • Spring Cloud Alibaba 系列之 Sentinel @SentinelResource 注解

      我们可以发现在之前的 Sentinel 资源名都是请求路径,我们可以使用 @SentinelResource 注解的 value 属性来自定义资源名称。第二...

    Demo_Null
  • 【评论】高冷的苹果,能在人工智能上有所作为吗?

    【新智元导读】苹果最近邀请科技记者Steven Levy到总部走了一圈,希望向外界介绍其机器学习技术,一反过去低调的姿态。其实以机器学习为代表的人工智能技术在苹...

    新智元

扫码关注云+社区

领取腾讯云代金券