社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python分析《哈哈哈哈哈》47687条弹幕,看看大家都在说些啥!

Python中文社区 • 3 年前 • 390 次点击  


图片来源:豆瓣


最近由腾讯视频、爱奇艺联合出品综艺《哈哈哈哈哈》(又名五哈)话题不断,节目中由邓超、陈赫、鹿晗组成的兄弟旅行团,开启了一段由东到西穿越中国的真实旅行。作为首个双平台联播的超级网综给广大观众带来了无限欢乐,妥妥登上了综艺热搜榜第一。


腾讯视频综艺热搜TOP3


本文通过爬取腾讯视频《哈哈哈哈哈》47687条弹幕,进行可视化分析和情感分析



01

数据获取


《哈哈哈哈哈》目前已播出10期,本文爬取了第10期上下两篇弹幕。以下给出完整代码:


#-*- coding = uft-8 -*-
#@Time : 2021/1/20 20:35
#@Author : 菜J学Python
#@File : 哈哈哈哈哈.py

import requests
import json
import time
import pandas as pd

df = pd.DataFrame()
for page in range(15397330):
    headers = {'User-Agent''Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
    url = 'https://mfm.video.qq.com/danmu?otype=json&timestamp={}&target_id=6384458060%26vid%3Dd0035ka5c02&count=80'.format(page)
    print("正在提取第" + str(page) + "页")
    html = requests.get(url,headers = headers)
    bs = json.loads(html.text,strict = False)  #strict参数解决部分内容json格式解析报错
    time.sleep(1)
    #遍历获取目标字段
    for i in bs['comments']:
        name = i['opername']    #昵称
        content = i['content']  #弹幕
        upcount = i['upcount']  #点赞数
        user_degree =i['uservip_degree'#会员等级
        timepoint = i['timepoint']  #发布时间
        comment_id = i['commentid']  #弹幕id
        cache = pd.DataFrame({'用户名':[name],'弹幕':[content],'会员等级':[user_degree],
                              '发布时间':[timepoint],'弹幕点赞':[upcount],'弹幕id':[comment_id]})
        df = pd.concat([df,cache])
df.to_csv('haha-1.csv',encoding = 'utf-8')
print(df.shape)



02

数据处理


1.数据读取并预览


首先,将两个弹幕csv文件进行数据合并,采用concat方法。


import pandas as pd
import numpy as np

df1 = pd.read_csv("/弹幕/腾讯/哈哈哈哈哈/haha-1.csv")
df1["期数"] = "10期上"
df2 = pd.read_csv("/弹幕/腾讯/哈哈哈哈哈/haha-2.csv")
df2["期数"] = "10期下"
df = pd.concat([df1,df2])
df.sample(10)


抽样10条弹幕数据,预览效果如下:



2.查看数据信息


df.info()


<class 'pandas.core.frame.DataFrame'>
Int64Index:
 47687 entries, 0  to 21820
Data columns (total 8 columns):
 #   Column      Non-Null Count  Dtype 
---  ------      --------------  ----- 
 0   Unnamed: 0  47687 non-null  int64 
 1   用户名         13433 non-null  object
 2   弹幕          47687 non-null  object
 3   会员等级        47687 non-null  int64 
 4   发布时间        47687 non-null  int64 
 5   弹幕点赞        47687 non-null  int64 
 6   弹幕id        47687 non-null  int64 
 7   期数          47687 non-null  object
dtypes: int64(5), object(3)
memory usage: 3.3+ MB


发现数据存在以下几个问题:

(1)字段名称可调整

(2)Unnamed、弹幕id字段多余 

(3)用户名字段有缺失值,可填充 

(4)发布时间字段类型需要调整 


3.数据清洗


#重命名字段
df = df.rename(columns={'用户名':'用户昵称','弹幕':'弹幕内容','发布时间':'发送时间','评论点赞':'弹幕点赞','期数':'所属期数'})

#过滤不需要的字段
df = df[["用户昵称","弹幕内容","会员等级","发送时间","弹幕点赞","所属期数"]]

#缺失值填充
df["用户昵称"] = df["用户昵称"].fillna("无名氏")


清洗后,数据预览如下:




03

数据可视化


1.弹幕在讨论些什么


通过对4万+弹幕制作词云图,我们发现,弹幕中出现频率较高的词汇有「哈哈哈、鹿晗、晨艺、虞书欣」等。这综艺的初衷,是让观众在看节目的过程中频繁大笑,由弹幕可知,效果还是很明显的。鹿晗在这一期表现亮眼,躺赢刺杀游戏,被很多观众夸赞。



#绘制词云图
text1 = get_cut_words(content_series=df['弹幕内容'])
stylecloud.gen_stylecloud(text=' '.join(text1), max_words=200,
                          collocations=False,
                          font_path='simhei.ttf',
                          icon_name='fas fa-video',
                          size=653,
                          #palette='matplotlib.Inferno_9',
                          output_name='./haha.png')
Image(filename='./haha.png'


2.弹幕里都提到了谁


鹿晗被观众提及7329次,王晨艺3222次,张颜齐1632次。鹿晗的吸粉体质为这个综艺带来了较大的流量,而陈赫在最新一期的节目中似乎被一些观众遗忘。


df8 = df["人物提及"].value_counts()[1:11]
print(df8.index.to_list())
print(df8.to_list())
c = (
    Bar(init_opts=opts.InitOpts(theme=ThemeType.WALDEN))
    .add_xaxis(df8.index.to_list())
    .add_yaxis("",df8.to_list()) 
    .set_global_opts(title_opts=opts.TitleOpts(title="人物提及次数",subtitle="数据来源:腾讯视频 \t制图:菜J学Python",pos_left = 'left'),
                       xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=13)), #更改横坐标字体大小
                       yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=13)), #更改纵坐标字体大小
                       )
    .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='top'))
    )
c.render_notebook()


我们分别对六位主要提及演员进行词云图绘制,发现他们的人缘是真的好,几乎看不到负面的评价。陈赫的外号还挺多:赫赫、赫哥,不做词云我还不知道呢,看来要补充知识点了。



3.谁是弹幕发射机


每天都是小春日共发射弹幕158条,遥遥领先其他弹幕党,名副其实的弹幕发射机。想太多de猫紧随其后,发射了97条弹幕,如果大家还有印象的话,他(她)还是《令人心动的offer》第2季弹幕发射机。



df8 = df["用户昵称"].value_counts()[1:11]
df8 = df8.sort_values(ascending=True)
df8 = df8.tail(10)
print(df8.index.to_list())
print(df8.to_list())
c = (
    Bar(init_opts=opts.InitOpts(theme=ThemeType.WALDEN,width="1100px",height="500px"))
    .add_xaxis(df8.index.to_list())
    .add_yaxis("",df8.to_list()).reversal_axis() #X轴与y轴调换顺序
    .set_global_opts(title_opts=opts.TitleOpts(title="弹幕发送数量TOP10",subtitle="数据来源:腾讯视频 \t制图:菜J学Python",pos_left = 'left'),
                       xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=13)), #更改横坐标字体大小
                       yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=13)), #更改纵坐标字体大小
                     #yaxis_opts=opts.AxisOpts(axislabel_opts={"rotate":40})#更改纵坐标字体大小
                       )
    .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right'))
    )
c.render_notebook()


我们来看看弹幕发射机讨论了些啥,通过弹幕点赞数降序排列,筛选出点赞数最多的10条弹幕,弹幕内容几乎全为王勉相关内容,死忠粉无疑了。


df_first = df[df["用户昵称"]=="每天都是小春日和"]
df_first.sort_values('弹幕点赞',inplace=True,ascending=False)
df_first[:10]




04

情感分析


通过运用百度开源NLP对弹幕内容进行情感分值计算,我们发现,《哈哈哈哈哈》第1季情感分值整体高于0.6,观众表现出较高的积极倾向。情感分值变化趋势则表现为视频播放开始和中期高,播放快结束时有所下滑。



import paddlehub as hub
#这里使用了百度开源的成熟NLP模型来预测情感倾向
senta = hub.Module(name="senta_bilstm")
texts = df['弹幕内容'].tolist()
input_data = {'text':texts}
res = senta.sentiment_classify(data=input_data)
df['情感分值'] = [x['positive_probs'for x in res]
#重采样至15分钟
df.index = df['发送时间']
data = df.resample('15min').mean().reset_index()


import pyecharts.options as opts
from pyecharts.charts import *
from pyecharts.globals import ThemeType  
c = (
        Line(init_opts=opts.InitOpts(theme=ThemeType.WALDEN))
       .add_xaxis(data["发送时间"].to_list())
       .add_yaxis('情感倾向', list(data["情感分值"].round(2)), is_smooth=True,is_connect_nones=True,areastyle_opts=opts.AreaStyleOpts(opacity=0.5))
       #.add_yaxis('弹幕点赞',list(df["弹幕点赞"].round(2)), is_smooth=True,areastyle_opts=opts.AreaStyleOpts(opacity=0.5))
       #.add_yaxis('会员等级',list(df["会员等级"].round(2)), is_smooth=True,areastyle_opts=opts.AreaStyleOpts(opacity=0.5))
       .set_global_opts(title_opts=opts.TitleOpts(title="情感倾向",subtitle="数据来源:腾讯视频 \t制图:菜J学Python",pos_left = 'left'))
    )
c.render_notebook()


更多阅读


[视频]GitHub趋势榜(2021年1月上旬)

特别推荐




点击下方阅读原文加入社区会员

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/106723
 
390 次点击