前文摘要:
微博热门话题:#中印双方达成五点共识# 阅读量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、文本预处理欠缺,主题中存分隔符货一些无效词汇。
改进:需要积累文本分类素材,打磨文本分类模型;提高词典分词准确性,以及文本预处理有效性。