当前位置:   article > 正文

利用python做文本分析——以爬取B站视频弹幕评论为例_b站评论分析

b站评论分析

本篇文章主要运用了机器学习以及Python爬虫以及nlp以及lda主题分析相关的操作内容
本文主要展示实战分析相关内容,关于理论的相关介绍不做过多展开


机器学习根据我的个人理解就是建立相关的模型,利用已有的数据对模型进行相关的训练,不断的丰富模型的准确度和适用范围。从而更加有效高效的解决问题


Python爬虫是利用网页的url链接,使用Python的相关库对网页进行解析并抓取相关的内容,从而便于进一步的分析处理


NLP主题分析和lDA主题分析都是常用的文本分析的方法,通过这两种方法可以对文本所含情感进行处理和分析


NLP(Natural Language Processing)中文是自然语言处理。本文使用的NLP主要用于情感分析,基于统计和深度学习的方法对文本进行分类。这种处理复杂中文文本的方法可以在客户编号,满意度和意见反馈等方面提供有助于市场活动和产品设计的数据


LDA分析(Latent Dirichlet Allocation).主要是用来推测文档的主题分布,将文档的主题以概率分布的形式给出。通过抽取他们的主题分布,便可以根据主题分布进行聚类或者文本分类

本文选取视频《苏炳添纪录片——为生命而奔跑》为例进行实战


实证分析部分:

(一)snownlp文本分析

1. Python爬虫

本项目在pycharm中实现。使用到的第三方库有requests,bs4,pandas,jieba.posseg,pyecharts等等。

首先要得到b站弹幕的xml文件,b站的xml网址有一个固定的格式,所以只需要获得到视频的oid值就可以了。打开b站视频连接,按住F12,通过审查元素的方式来得到弹幕的视频链接的oid值。首先点击审查元素的Network,然后点击XHR,最后在name列表中找到一数字开头的八位数的文件就是要获取的值。

获取到弹幕的xml文件,对数据进行处理和保存首先导入requests库使用request.get方法访问弹幕url获取页面数据HTML。

图4-2:弹幕oid信息储存网页信息显示

然后导入Beautifulsoup库,使用LXML解析器解析页面, 向指定视频页面发送访问请求。收到服务器的响应之后,自动爬取视频页面的标题页面码,通过页面码对指定的弹幕页面发送请求。服务器响应之后会爬取视频的弹幕信息并保存,这样就可以抓取到所有隐藏在标签里的弹幕内容。然后进行解析弹幕,将弹幕网址时间整理字典顶最后加和成列表。

收集了1月31号~2月10号11天的弹幕,总共的弹幕数量为1.1万条数据,通过构建时间序列循环抓取不同天数的弹幕保存成txt文件,然后再利用Python将txt文件转化成csv文件,以便后续的数据处理。

具体代码详见附录一。

2.数据预处理

首先将爬渠道的数据导入到pandas观察数据的初步内容。

弹幕导入

使用info查看数据是否存在缺失值。在describe前面加上include,从而让弹幕的统计分析也显示出来,具体代码如下:

http://data.info()
data.describe(include=['object','float']).T

数据探索完毕之后,首先使用snownlp这个库对弹幕做情感分析。用模型对每条弹幕进行训练,并对这条弹幕所代表的情感打分。分数越高就越积极,分数越低越消极Snownlp在新闻评论,舆情分析,电商评论等场景用的最多,最广。

首先导入本次分析需要用到的库,有数据处理库,可视化库以及文本挖掘库。

导入一些库

3.snownlp训练

首先对弹幕内容进行一个情感训练,使用jieba库对弹幕文本内容进行分词。停用词是人工输入的非自动生成的语气词等无意义的词汇,如语气助词,副词,连接词。通过处理停用词来对弹幕文本内容进行情感训练,文本内容碰到停用词,则排除停用词在排除停用词的基础上,对文本进行分词,以获取高频词汇,然后使用snownlp进行进行文本处理。

随机抽取十个样本,看一看情感分值。来粗略观察弹幕的整体情感倾向,有8条弹幕情感得分为0.6以上,只有一条弹幕得分为0.4以下,可以看出弹幕的情感倾向较为积极。但并不能代表整体状况。还需要进一步的研究和探索。

接下来用seaborn可视化图库来看一下整体的情感倾向:

通过上面代码可以得到相关的分布密度概率图,可以从这张概率分布密度图中看到:

绝大部分数据集中在1.0附近。很显然,这份弹幕数据里绝大部分都是积极的。

4.绘制词云图

导入相关的库以后,首先对弹幕内容进行jieba分词处理。设置相关的停用词编码形式设置成utf-8的格式。然后,导入相关的库,用停用词stopword过滤一下。

分词处理相关信息

使用pd.Series将过滤好的词转化成元组,然后value_counts,得出弹幕词频。看看那些词出现最多,由此作为依据来绘制词云。

然后通过matplotlib进行画布设置,从而得到相关词云图,分析词语频率:


(二)LDA主题分析

分析完弹幕情感倾向,更进一步,用来对这份弹幕数据做一个主题分析。gensim这个库就是根据上面出来的情感倾向分值,给定一个阈值。小于这个值的判定为消极,高于这个阈值的判定为高级。最后,在积极和消极两大分类下,分别分出最具代表性的若干文档主题。由于这份数据及绝大部分是积极的数据,因此将积极的分类阈值值设置为0.85,只有分值大于0.85的才能被分为积极弹幕,而情感分值低于0.5的才会判断为消极。

可以看到在如此进行阈值,判定,设置的前提下,积极的弹幕比消极的弹幕多很多。接下来对弹幕内容进行分词处理,弹幕是以句子呈现的,这里进行分词处理将弹幕转化成词语的形式。

导入停用词表,并将停用词加载到一个列表当中:

同样使用lambda新增两列,分别存放的jieba分词结果和经过停用词过滤的结果。这样处理将一些不重要的标点符号和语气词过滤掉。

然后使用for循环,将分好的每一个词放到一个列表当中。

然后开始构建情感字典,使用gensim里面的corpora.dictionary得出来的pos_dict结果是一个惰性对象,因此需要将[*pos_dict]展开,才能看到结果。

得到情感字典后,构建训练用的语料库:

最后使用LDA模型进行训练,使用num_topics分成五个主题。并将上面构建的情感字典(pos_dict)作为机器学习的依据,最后得到积极和消极主题模型。

积极主题分析:

topic 1

0.334*"致敬" + 0.074*"!" + 0.024*"的" + 0.023*"," + 0.020*"" + 0.012*"" + 0.012*"了" + 0.009*"英雄" + 0.008*"我" + 0.008*"刘翔"

topic 2

0.053*"," + 0.043*"刘翔" + 0.039*"!" + 0.025*"是" + 0.021*"的" + 0.018*"排面" + 0.016*"了" + 0.015*"刘长春" + 0.014*"他" + 0.010*"我"

topic 3

0.035*"," + 0.030*"致敬" + 0.028*"了" + 0.023*"的" + 0.023*"刘翔" + 0.017*"传承" + 0.016*"是" + 0.016*"。" + 0.013*"为" + 0.012*""

topic 4

0.059*"" + 0.050*"的" + 0.037*"刘翔" + 0.030*"," + 0.023*"!" + 0.015*"是" + 0.014*"致敬" + 0.010*"永远" + 0.010*"肉蛋" + 0.010*"刘长春"

topic 5

0.068*"的" + 0.052*"," + 0.034*"刘翔" + 0.025*"致敬" + 0.024*"" + 0.021*"是" + 0.019*"我" + 0.017*"了" + 0.017*"永远" + 0.012*"刘长春"

同理,可以得到消极主题的LDA主题模型。根据肘形图分析,调节参数将消极词分成三个主题:

消极主题分析:

topic 1

0.053*"了" + 0.039*"," + 0.037*"" + 0.026*"我" + 0.025*"的" + 0.019*"苏神" + 0.014*"刘翔" + 0.013*"?" + 0.011*"他" + 0.011*"道歉"

topic 2

0.035*"了" + 0.026*"破防" + 0.021*"的" + 0.020*"!" + 0.018*"" + 0.018*"," + 0.015*"我" + 0.013*"没有" + 0.012*"是" + 0.010*"刘翔"

topic 3

0.228*"!" + 0.055*"了" + 0.034*"你" + 0.030*"做到" + 0.025*"的" + 0.017*"," + 0.016*"苏神" + 0.013*"?" + 0.013*"刘翔" + 0.012*"都"

通过主题分析之后,我们可以继续延伸扩展,通过聚类分析和因子分析等手段获取更有价值的结论


(三)评论相关数据可视化分析

1.抓取评论

通过F12,找到评论栏对应的HTML文件,由于哔哩哔哩前端更新,评论无法通过,点击下一页来监测网页发出的请求来找到类似的目标。可以通过点击评论的排序方式“最新”和“最热”来获取新的发送请求。这里通过监视点击最新按钮的时候,网页对服务器发出的请求以及服务器的回答进行分析。点击F12,在开发工具上方的network栏里找到列表中刷新出来的script文件。

但是实际上这个url并不能进入服务器,服务器也拒绝我们的请求,通过删除该url一些额外的部分就可以正常的访问。最后得到的url网址如下,

https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next={}&type=1&oid=935396966&mode=2&plat=1&_=1645769043427

运行以后5000条评论就被抓取到了,然后使用time. localtime和time strftime将评论时间这一列转换一下并保存数据。

导入可视化用到的库,并读取数据,对数据做一个简单的统计分析。

可以看到在5549条评论中平均每条是每个评论的点赞量为3.96个,并且出现了最大值是2766个赞的优质评论。通过rank可以发现评论用户的等级的均值是4.7。这意味着前5548条评论者都是非常高级别的用户。

使用pyecharts制作点赞top30的柱状图,首先导入相关的库,并写上相关代码制作出柱状图。

以用户等级为索引,使用value counts降序查看各等级用户分布,并以此作为第二个图的数据绘图源制作用户等级分布图。

有26%的评论用户为四级用户,49%的评论用户为五级用户可以看出此条视频的评论用户等级非常高可以看出视频的优质的质量。这样我们就完成了相关的可视化工作

这样我们就完成了所有的工作,让我不断试错和尝试中发现问题解决问题。明白了很多相关的理论和技术。未来希望能够在实习和工作中不断进步,越来越专业,嘿嘿。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/140823
推荐阅读
相关标签
  

闽ICP备14008679号