前叙
系列文章:
该系列文章介绍了什么?
1.爬虫分析和处理方法
2.Python中的数据库操作方法
3.Selenium浏览器自动化以及无头浏览器使用方法
4.对数据进行词云分析的方法
5.对数据进行可视化的方法
6.LDA隐含狄利克雷分布模型的建模和使用方法
前言
前面 这篇文章 介绍了爬取微博用户资料和动态并将数据保存在数据库的过程。下面来说一下对数据库数据与分析的过程。
数据库分析
首先先来回顾一下前一篇文章中谈到的数据库字段。下图是 weibo 数据库中的三张表:
其中每个字段对应的含义请见源码。
再来看一下数据库中每张表里面的内容,首先是用户资料表中的内容:
可以看到和微博资料页的资料是对应的。
再来看看用户动态数据表:
里面包含了用户动态内容和动态发布时间,所以我们首先想到可以对微博动态内容进行处理。
可视化分析
了解了数据库结构以后,我们可以对微博动态和动态发布时间进行可视化处理,在这里,笔者做了以下几点分析:
- 微博动态发布时间处理:画出微博发布时间统计图
- 微博动态简单可视化:词云
- 微博动态词频处理:词频统计以及生成词频图
以上三种分析程序均位于 Data_analysis.py 中, 其 main 函数代码如下:
1 | 复制代码#可以指定需要分析的用户的uid(必须先存在conf.yaml里面,并且运行了一次爬虫程序) |
那么这三种分析具体如何实现呢?接下来笔者将对其进行一一阐述。
微博发布时间统计
要对微博动态内容进行可视化分析,第一步是要将微博动态内容整合到一起,下面这段代码是将用户微博中的所有动态拼接到一起,也就是 main 函数里面的第一行代码所调用的函数。
1 | 复制代码# time_lists,str=get_time_str(uid)# main 函数第一行代码 |
返回的 time_lists
为动态发布时间列表, str
为所有动态拼接到一起的最终字符串.在这里因为是对时间进行统计,所以我们只需要关注 time_lists
这个列表.先来看看这个列表里面存放的具体内容:
1 | 复制代码[....,'02月02日 29', '01月21日 30', '01月20日 31', '01月10日 32', '01月02日 33', '01月01日 34', '2017-11-30', '2017-11-29', '2017-11-04', '2017-10-29', '2017-10-27',...] |
这是我特意取的一段,刚好两种格式的时间都包含在内。这个列表里面包含的时间是从最近的月份和日期到最初的年份-月份-日期.例如上面的 '2017-11-30'
前面的日期格式均是 XX月XX日XX ,而 '01月01日 34'
后面的同理均是 20XX-XX-XX ,排序方式是由近到远 。在这里,我考虑分析每天发布的微博动态数和时间的变化趋势,并且将时间排列为离现在越远离原点越近。
于是便有了下面这段代码:
1 | 复制代码# plot_create_time(time_lists)# main 函数第二行代码 |
于是微博发布时间统计图便画出来了,是一个动态的图,效果如下:
词云分析
要对动态内容进行分析,首先要进行分词处理,并且,我们知道常用词语中有很多语气词等,会影响关键词语的权重,所以在进行分析之前需要去掉这些词语,这种词语在信息检索叫做 停用词 。此外,动态中含有的换行符,html代码等不必要的符号也需要去掉。
所以 main 函数中在得到词云之前有下面四行代码:
1 | 复制代码with open('data/stop_words.txt') as f:#从保存有停用词的文件中读取停用词 |
其中调用了 word_segmentation
函数,该函数的内容如下:
1 | 复制代码# 分词并去除停用词 |
在这里,我使用 jieba 进行分词,再对分词结果进行过滤,去除停用词,并返回该分词结果列表。然后使用 word_list
中的数据来画出词云,具体代码如下:
1 | 复制代码#create_wordcloud(word_list) # main 函数第7行代码 |
最后得到结果 weibo.jpg ,打开看一看:
这就是词云分析的结果,读者可以根据自己需要,比如如果觉得原文和转发出现频率高价值不高可以加入停用词中进行过滤。
词频处理
对微博动态中的词语出现的频率进行统计处理,首先需要词语列表,因为在词云分析中我们已经得到了过滤掉停用词的词语列表 word_list
,所以在这里可以直接拿来使用:
1 | 复制代码#counter = word_frequency(word_list, 10)# main 函数倒数第三行代码 |
得到的 counter
内容为词语以及出现的次数组成的列表,例如:
1 | 复制代码[('感觉', 11), ('代码', 10), ('说', 9),('晚上', 9), ('终于', 7), ('麻蛋', 6), ('写', 6), ('数据', 5), ('学校', 5), ('朋友', 4)] |
然后根据得到的词频画图并渲染:
1 | 复制代码# plot_chart(counter)# main 函数最后一行,会生成词频图保存在weibo_wordfrq.html中 |
最后得到排名前10位的词语频率统计图:
LDA 分析
我们忙活了很久,对用户动态进行了多种分析,但是用户的偏好和个性感觉还是没有把握得很清楚,那么这时候就需要使用一种方法从海量信息中抽取关键部分,最好是能提取出主题,受之前这篇论文[1] 的启发,笔者得知 LDA 便是一种能够满足上述条件的很好的分析方法。
隐含狄利克雷分布(英语:Latent Dirichlet allocation,简称LDA)是一种主题模型,它可以将文档集中每篇文档的主题按照概率分布的形式给出。同时它是一种无监督学习算法,在训练时不需要手工标注的训练集,需要的仅仅是文档集以及指定主题的数量k即可。此外LDA的另一个优点则是,对于每一个主题均可找出一些词语来描述它。
以上说明摘录自维基百科.
本文着眼点在于实践,所以只介绍在 python 中使用 LDA 进行分析的方法,并不阐述 LDA 的原理。更何况,在计算机科学和数据科学的学术讲座中,讲者在介绍到LDA时,都往往会把原理这部分直接跳过去。
该部分代码位于 LDA_Analysis.py ,首先可以看看 main 函数的内容:
1 | 复制代码def main(uid): |
第一步便是像之前那样进行分词并过滤停用词,调用了 getwords
函数,代码如下:
1 | 复制代码#获取微博动态数据 |
该函数内容和之前介绍的 Data_analysis.py 中的效果一样,故在此不累述。
然后使用 sklearn 机器学习包中自带的 LDA 处理方法进行处理,代码如下:
1 | 复制代码#lda, tf, tf_feature_names, tf_vectorizer = word2vec(wordlists)# main 函数第二行代码 |
最后我们将主题以可视化结果展现出来:
1 | 复制代码#pyLDAvisUI(lda, tf, tf_vectorizer) # main 函数中最后一行 |
得到 lda.html ,为渲染以后的结果:
至此,用户信息分析介绍结束。
参考:[1]陆飞.面向社会工程学的SNS分析和挖掘[D].上海:上海交通大学,2013.
本文转载自: 掘金