查看原文
其他

2020年B站跨年晚会弹幕内容分析

大邓 大邓和他的Python 2022-07-09

倒计时5天|Python&Stata数据分析课寒假工作坊 

观后感只有两个字



昨天刷B站看到B站跨年晚会9.9分好评,抱着试试的态度,结果控制不住自己刷了两遍,书到用时方恨少,只想用两个字概括"卧槽"。

B站内容安排精彩,拿捏住了不同年代的情怀点,比如1980-1990的港台风、1990-2000年代数码宝贝柯南、2000-2020年代魔兽世界,每个人的时代联结略有不同,这仅是我自己的感受。

除了内容,弹幕互动也是挺令人舒爽的事情,精彩来临时刻也就是弹幕大军压镜的时候,我把我认为比较精彩的部分截图制作成了小视频。

这次我采集了跨年晚会的两种数据

  • 弹幕数据,正在观看时用户的感受

  • 评论数据,已观看完成的用户感受

爬虫制作成视频教程已经上传至千聊课程中,感兴趣的同学可以关注一下

Python网络爬虫与文本数据分析(学术)   

本文的小目标




我们只是想看一下在时间线上弹幕量的分布情况,下图是怎么做出的

  • 横坐标为分钟刻度

  • 纵坐标为弹幕量


数据准备(清洗)




B站晚会有三个篇章,每个篇章视频长度大约60-70min。我们采集的数据集字段包括:

  • Date:采集时间2019.01.03,所以有三天的弹幕

  • Chapter: 第几个篇章,B站跨年有三个篇章,每个篇章60min左右

  • VideoTime: 在Chapter中的当前播放时间(相对于篇章开头的秒数)

  • SenderId: 弹幕发送者的匿名ID

  • DanMuContent: 弹幕文本内容

  1. import pandas as pd


  2. df = pd.read_csv('data/弹幕new.csv')

  3. #剔去重复项

  4. df.drop_duplicates(inplace=True)

  5. #查看数据个数

  6. print(len(df))

  7. #显示前5行

  8. df.head()

VideoTime很可能是字符串,我们先将其变为浮点数。然后我们查看每个章节最大时间长度。

  1. def str2float(string):

  2. #将VideoTime从字符串变为浮点数

  3. try:

  4. return float(string)

  5. except:

  6. return 0.0


  7. df['VideoTime'] = df['VideoTime'].apply(str2float)

  8. print('Chapter 1', df[df['Chapter']==1]['VideoTime'].max())

  9. print('Chapter 2', df[df['Chapter']==2]['VideoTime'].max())

  10. print('Chapter 3', df[df['Chapter']==3]['VideoTime'].max())

  1. Chapter 1 4253.188

  2. Chapter 2 4000.27

  3. Chapter 3 4555.0

我们想做弹幕的时间线上的分布,所以需要把三个在时间上考虑先后

  1. chapter1 = df[df['Chapter']==1]

  2. chapter2 = df[df['Chapter']==2]

  3. chapter3 = df[df['Chapter']==3]


  4. #将时间放在一个时间线上

  5. chapter2['VideoTime'] = chapter2['VideoTime']+ 4253.188

  6. chapter3['VideoTime'] = chapter3['VideoTime']+ 4253.188 + 4000.27


  7. #合并chapter1, chapter2, chapter3

  8. chapter = pd.concat([chapter1, chapter2, chapter3])

  9. #VideoTime升序

  10. chapter.sort_values(by='VideoTime', ascending=True, inplace=True)

  11. chapter

我们想看一下各个章节在时间上弹幕量的分布情况(以min为单位),

  • 横坐标为分钟刻度

  • 纵坐标为弹幕量

  1. def second2minute(second):

  2. #将VideoTime从秒数变为分钟数

  3. try:

  4. return int(float(second)/60)

  5. except:

  6. return 0



  7. chapter['VideoTime'] = chapter['VideoTime'].apply(second2minute)

  8. chapter

  1. import matplotlib.pyplot as plt

  2. %matplotlib inline


  3. plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']

  4. danmudf = chapter.groupby('VideoTime').agg({'DanMuContent': ['count']})

  5. danmudf.plot(kind='line', figsize=(20, 10), legend=False)

  6. plt.title("2020年B站跨年晚会弹幕量趋势图", fontweight='bold', fontsize=25)

  7. plt.xlabel('时间点', fontweight='bold', fontsize=20)

  8. plt.ylabel('弹幕量', fontweight='bold', fontsize=20, rotation=0)

  9. plt.show()

从上图可以看到用户发弹幕量相对比较集中的区间为:

  • (37, 63)

  • (100, 120)

  • 之后都是独峰

37-63阶段

这是第一篇章中后期,也是整个晚会高潮迭起的阶段。依次有冯提莫、动漫歌曲(如butterfly)、种花组曲(如钢铁洪流进行曲)三种不同类型的表演杂糅在一起。

冯提莫的甜美

动漫歌曲的青春回忆

有一种家叫“国家”

115附近

115min,也就是第二篇章40min附近。附近的节目

骄傲的少年(曲子是《那年那兔那些事》)

后面的比较陡峭的小山峰时间点上还有几个大碗,比如邓紫棋、吴亦凡、五月天,就不粘贴截图了。


整体内容分析




  1. import re

  2. import jieba

  3. import csv

  4. from pyecharts import options as opts

  5. from pyecharts.charts import Page, WordCloud

  6. from pyecharts.globals import SymbolType



  7. # 读取文件中的文本

  8. text = ''.join(df['DanMuContent'])

  9. #剔除非中文的内容(只保留中文)

  10. text = ''.join(re.findall(r'[\u4e00-\u9fa5]+', text))

  11. wordlist = jieba.lcut(text)

  12. wordset = [w for w in set(wordlist) if len(w)>1]

  13. wordfreq = []

  14. #词语计数

  15. for word in wordset:

  16. freq = wordlist.count(word)

  17. wordfreq.append((word, freq))

  18. # 词频排序

  19. wordfreq = sorted(wordfreq, key=lambda k:k[1], reverse=True)


  20. wordcloud =WordCloud()

  21. wordcloud.add("",

  22. wordfreq,

  23. word_size_range=[20,100])

  24. wordcloud.set_global_opts(title_opts=opts.TitleOpts(title="2020年B站跨年晚会"))

  25. wordcloud.render('B站跨年.html')

  26. wordcloud.render_notebook()

这几个大词“啊啊啊”、“哈哈哈”、“卧槽”、 “新年快乐”, “哔哩”, 

凑在一起感觉就是

在B站有一群逗比陪你一起过年,这感觉很欢乐啊哈哈。


局部内容分析(暂无)




弹幕随时间的起起伏伏,我暂时想到的是可以做的

  • 弹幕量维持在较高水平的阶段,弹幕内容有什么特点

  • 弹幕量变化的拐点附近,弹幕内容有什么特点

今天分享的时间区间是固定长度,是一个个的1min,直接求整数就解决了。

但是要做上面提到的两个问题,时间区间就是不固定的,程序比较智能的划分成几个区间。嘿嘿,我这里没有答案,不要找我问😜



近期文章





Python网络爬虫与文本数据分析(学术)

杭州见|Python&Stata数据分析课寒假工作坊

综述:文本分析在市场营销研究中的应用

Lazy Prices公司年报内容变动碰上股价偷懒

使用pandas做数据可视化

用statsmodels库做计量分析

YelpDaset: 酒店管理类数据集10+G

NRC词语情绪词典和词语色彩词典

Loughran&McDonald金融文本情感分析库

股评师分析报告文本情感分析预测股价

使用分析师报告中含有的情感信息预测上市公司股价变动

【公开视频课】Python语法快速入门

【公开视频课】Python爬虫快速入门

一行pandas代码生成哑变量

使用Python读取图片中的文本数据

代码不到40行的超燃动态排序图




jupyter notebook代码获取方式,公众号后台回复关键词“20200104” 




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存