赞
踩
最近江湖中涌现出了一位风云人物,他的语录成为了不少小伙的“精神食粮”,而其名场面也是数不胜数,他便是——混元形意太极门掌门马大师!
今天,kimol君将通过B站上马大师视频的弹幕分析出其中的高潮部分(即名场面),选取其中播放量靠前的视频(视频地址)进行分析,效果如下:
红色部分代表视频中弹幕数较多的位置,而这通常出现在视频的高潮部分,图中时间点表示高潮部分出现在视频中的位置。对照着原视频进行比较,结果定会让你大吃一惊!
详细分析过程,客官您往下看~
理论来说,该方法是通用的,完全可以用来分析不同的视频,发现其中高潮的部分(通常是戏剧冲突、高潮桥段、爆点等部分)。因此,具有较高的实用性!
爬取马大师视频(bvid为BV1HJ411L7DP)的弹幕,并将结果存于本地csv中:
一共有3W+条弹幕。至于弹幕的具体爬取过程,由于篇幅原因这里不在赘述,大家可以参考我的另一篇博文。
弹幕分析的思路也比较简单,通过统计弹幕在视频中不同时间出现的频数来表示出当时观众的反映:通常来讲,当视频出现高潮时,弹幕数量也会相应增加。那么,整个分析过程可以分为三步:
按照指定的视频播放时间间隔来统计弹幕的数量,定义一个函数:
def count_fre(time_list,second=1):
'''
统计弹幕出现时间的频数(按指定second划分)
输入:出现时间的列表,划分的秒数
输出:频数分布
'''
f = lambda x:(x//second)*second
time_list = time_list.apply(f) # 按照second将时间进行划分
counter = dict(Counter(time_list)) # 统计各时间段出现的频数
counter = sorted(counter.items(),key=lambda d:d[0]) # 按照字典的key排序
return dict(counter)
统计后的输出为一个字典,key为时间段,value为对应的弹幕数:
利用python中的matplotlib库将统计好的频数分布绘制出来:
# 绘制分布图
plt.title('弹幕频数分布')
plt.xlabel('播放时间(秒)')
plt.ylabel('弹幕评论频数(个)')
plt.grid()
plt.plot(x,y)
结果如下:
为了更直观地反映出高潮部分,用红色将其标出,并加上对应的时间点:
# 标红高潮部分 flag = False start = 0 # 开始位置 end = 0 # 结束位置 level = np.percentile(y,90) for i in range(len(y)): if flag == False and y[i] >= level: flag = True start = i-1 if i-1 >= 0 else 0 # 避免低于0 if flag == True and y[i] < level: flag = False end = i+1 end = i+1 if i+1 <= len(x) else len(x) # 避免超过最大值 plt.plot(x[start:end],y[start:end],color='red') # 标红 pos_y = max(y[start:end]) # 高潮 pos_x = y[start:end].index(pos_y)+start # 找到高潮对应的点 pos_x = x[pos_x] # 找到高潮对应的时间(秒) m,s = divmod(pos_x,60) text = '%02d:%02d'%(m,s) # 转为mm:ss的格式 plt.text(pos_x+1,pos_y,text)
其中level变量取弹幕数的X分位数,是高潮的阈值,即认为当弹幕数大于level才认为是高潮部分。通过对它的设定,即可控制高潮标红的部分。
通过对高潮部分进行标红后,可以得到下图:
可以看出,短短2分多钟的视频可谓是高潮迭起。(小声嘀咕:“不要想歪了…”)
其中02:27的位置弹幕数量最高,打开视频一看,妹有错,名场面来了,年轻人耗子尾汁呀:
其中01:39的位置同样是名场面,我大E了啊,没有闪:
其余的部分也是类似的,由于时间原因这里就不全都展示了,感兴趣的小伙伴可以自己一一对应看看。
通过简单的测试,该代码除了可以发掘马大师的名场面外,在诸如其他电影、电视剧上的分析效果也都不错。理论上来说,只要有比较充足的弹幕数据,就能找到视频的高潮所在,您还不心动吗?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。