python 舆情分析 nlp主题分析 (3) --gensim库的简单使用
时间:2022-07-27
本文章向大家介绍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、文本预处理欠缺,主题中存分隔符货一些无效词汇。
改进:需要积累文本分类素材,打磨文本分类模型;提高词典分词准确性,以及文本预处理有效性。
- WCF后续之旅(6): 通过WCF Extension实现Context信息的传递
- 理性的相亲方法!精品课:《决策树》
- Asp.Net无刷新分页( jquery.pagination.js)
- 为什么网站需要用CDN来加速?
- Jmeter常用获取数据的几种方式
- [Silverlight 4 RC]RichTextBox概览
- WCF后续之旅(4):WCF Extension Point 概览
- Asp.Net无刷新上传并裁剪头像
- 用泛型的IEqualityComparer<T>接口去重复项
- python与office(一)
- Asp.net 后台添加CSS、JS、Meta标签(帮助类)
- 分享一下cookies操作(增、删、改、查)小经验
- [Silverlight 4 RC]WebBrowserBrush概览
- 一个例子理解C#位移
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android辅助功能实现自动抢红包(附源码)
- Android设置控件阴影的三种方法
- Android Studio 引入 aidl 文件的方法汇总
- Android 点击生成二维码功能实现代码
- Android屏幕手势检测的实现代码
- Android开发实现简单的观察者与被观察者示例
- Android开发中4个常用的工具类【Toast、SharedPreferences、网络及屏幕操作】
- Android实现客户端语音动弹界面实例代码
- Android封装MVP实现登录注册功能
- Android5.1系统通过包名给应用开放系统权限的方法
- android 上传aar到私有maven服务器的示例
- Android Studio开发环境搭建教程详解
- android事件总线EventBus3.0使用方法详解
- Android仿淘口令复制弹出框功能(简答版)
- Android实现简单断点续传和下载到本地功能