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、文本预处理欠缺,主题中存分隔符货一些无效词汇。

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