【導(dǎo)語】:今天我們來聊聊——B站聯(lián)合毛不易發(fā)布的畢業(yè)季主題曲《入夯醢》,以及背后不一樣的毛不易斯够。Python技術(shù)部分請看第三部分囚玫。
Show me data喧锦,用數(shù)據(jù)說話!今天我們聊一聊 毛不易的《入鹤ザ剑》燃少,沒錯(cuò),還是那個(gè)B站铃在,在520這個(gè)既浪漫且有營銷價(jià)值的一天又「搞事情」了阵具。
5月20日, B站聯(lián)合毛不易發(fā)布畢業(yè)季主題曲《入河磕拢》怔昨。這首歌主題是“獻(xiàn)給即將或已經(jīng)畢業(yè)的人們”雀久,歌曲MV中以主人公畢業(yè)的時(shí)候?yàn)樵c(diǎn)宿稀,追憶過去,并用大量篇幅展現(xiàn)普通人畢業(yè)后的社會生活赖捌。
這首歌一經(jīng)發(fā)布就在B站引爆了話題點(diǎn)祝沸,截止到5月24日在B站播放量達(dá)到了800萬+,收獲了5.2萬彈幕越庇,最高全站日排行1名罩锐。
今天我們就帶你來解讀這首《入海》卤唉,以及背后不一樣的毛不易涩惑。
01、毛不易的歌里桑驱,都喜歡唱些什么竭恬?
毛不易,本名王維家熬的。本來畢業(yè)于杭州師范大學(xué)護(hù)理專業(yè)的他一直有個(gè)歌手夢痊硕。在2017年,參加騰訊視頻選秀音樂娛樂節(jié)目《明日之子》押框,獲得全國總決賽冠軍岔绸,從而正式進(jìn)入演藝圈。誰又能想到最后拿到冠軍是這個(gè)長相平平橡伞,沒有什么優(yōu)勢盒揉,甚至有點(diǎn)害羞憨厚的毛不易了。
隨著《消愁》《像我這樣的人》等歌曲的大火兑徘,毛不易這個(gè)名字也被越來越多的人知曉刚盈。同時(shí)在今年鵝廠的女團(tuán)選秀節(jié)目《創(chuàng)造營2020》中,毛不易更是以導(dǎo)師的身份加入道媚,呆萌的毛老師這次也收獲了不少的粉絲扁掸。
聽著《消愁》里的“一杯敬朝陽翘县,一杯敬月光“,大概是因?yàn)椴湃A谴分,毛不易在這個(gè)年紀(jì)能寫出人生的無奈和糾葛锈麸,這是一種大的勇氣。
那么毛不易的歌里都在唱些什么呢牺蹄?下面讓我們來盤一盤:
我們分析整理了毛不易在網(wǎng)易云音樂的歌曲忘伞,一共83首,歌詞字?jǐn)?shù)加起來45577字沙兰,我們用Python對這些歌詞進(jìn)行分析氓奈。
歌曲時(shí)長分布
首先在歌曲時(shí)長方面,時(shí)長為4-5分鐘的最多高達(dá)43.9%鼎天,3-4分鐘為29.27%舀奶,2-3分鐘的為13.41%。要知道一般歌曲時(shí)長多為3分鐘左右斋射,看來毛不易的歌時(shí)長還是偏長的育勺。
歌曲正向情感得分
我們使用boson庫對每首歌的歌詞的情感進(jìn)行打分,分?jǐn)?shù)介于0~100分罗岖,高于50分為積極涧至,分?jǐn)?shù)越高,積極傾向性越高桑包。從分布圖可以看出南蓬,在83首歌曲中,大部分的歌曲正向積極情感為主哑了。
毛不易最喜歡的詞TOP15
毛不易最喜歡的歌里最喜歡用哪些詞呢赘方?我們分析整理得出了歌詞中出現(xiàn)頻率最高的TOP15±菔郑可以看到"等待"蒜焊、"生活"、"時(shí)光"等詞出現(xiàn)頻率最高科贬,位列前三泳梆。
"慢慢"、"遇見"榜掌、"江水"优妙、"角落"等比較文藝的詞也上榜了。有意思的是"有錢"出現(xiàn)頻率也較高憎账,位列第四套硼。
02、《入喊澹》全站日排名第一邪意,這首獻(xiàn)給畢業(yè)季的歌好在哪兒九妈?
我們使用Python獲取并分析了B站上《入海》這首MV的評論數(shù)據(jù)雾鬼,經(jīng)過去重之后得到19099條樣本萌朱,下面讓我們看到評論的具體分析。
評論用戶性別占比
首先策菜,在評論用戶性別占比方面晶疼,男性用戶占比略高,男性用戶占比54.69%又憨,女性用戶占比45.31%翠霍。
評論用戶客戶端分布
那么看《入海》的用戶在看視頻時(shí)都用的什么移動設(shè)備呢蠢莺?經(jīng)過分析發(fā)現(xiàn)寒匙,用iphone的用戶占了很大的比例,遠(yuǎn)超Andrio系統(tǒng)的用戶浪秘。第三位是使用ipad的用戶蒋情。
評論用戶等級分布
同時(shí)我們知道埠况,b站上用戶因?yàn)閰⑴c程度等因素耸携,等級從0-6分布,數(shù)字越大等級越高辕翰。在《入憾嵫埽》這首歌的評論用戶上,評論中5級的占比最高為36.1%喜命,其次是4級占比26.31%沟沙,6級占比僅為3.24%,這也是因?yàn)楫吘挂蔀榱壌罄袑?shí)在太難了壁榕。
各時(shí)段評論人數(shù)
在評論時(shí)間段方面矛紫,《入海》是在5月20日 8:30發(fā)布的牌里,在發(fā)布后評論的人數(shù)越來越多颊咬,在12點(diǎn)左右評論達(dá)到最高峰,這個(gè)時(shí)段共有2萬7千余人進(jìn)行評論牡辽,遠(yuǎn)高于其他時(shí)段喳篇,之后隨著時(shí)間推移評論人數(shù)也越來越少,趨于平緩态辛。
評論關(guān)鍵詞TOP15
在評論中大家說得最多的是什么呢麸澜?
經(jīng)過分析整理可以看到,"畢業(yè)"是提到最多的詞奏黑,其次第二位是"后浪"炊邦,畢竟作為同樣聚焦在年輕人身上的話題编矾,這次的《入海》很容易讓大家聯(lián)系到5月4日B站發(fā)布的《后浪》視頻馁害。
同時(shí)洽沟,"快樂"、"入海"蜗细、"大哭"等詞也被頻頻提到裆操。
03、Python分析:B站《入郝剑》評論數(shù)據(jù)
我們使用Python獲取并分析了B站上《入鹤偾》這首MV的評論數(shù)據(jù)。經(jīng)過去重之后得到19099條樣本吊骤,來分析一下這周MV的用戶的評論信息缎岗。整個(gè)分析流程分為以下幾步:
數(shù)據(jù)獲取數(shù)據(jù)整理數(shù)據(jù)可視化
數(shù)據(jù)獲取
在獲取視頻評論之前,我們首要做的就是分析其網(wǎng)頁結(jié)構(gòu)白粉,尋找目標(biāo)數(shù)據(jù)传泊,也就是我們要評論的數(shù)據(jù)在哪里。
經(jīng)過抓包分析鸭巴,在network-json選項(xiàng)卡下眷细,很容易找到了數(shù)據(jù)傳輸?shù)牡刂罚?jīng)過分析和精簡鹃祖,目標(biāo)數(shù)據(jù)的url鏈接為:
https://api.bilibili.com/x/v2/reply?&type=1&oid=795637027&pn=1
其中oid是視頻的專屬oid,pn是頁面數(shù)溪椎。
由上圖可看出,其評論數(shù)據(jù)是以json數(shù)據(jù)形式存在于網(wǎng)頁端的恬口,目前顯示的頁數(shù)是976頁校读,每頁20條評論,追評數(shù)據(jù)暫時(shí)不做抓取祖能。
接下來歉秫,就爬取思路很明確,從第一頁的JSON文件開始养铸,爬完20條評論雁芙,循環(huán)pn頁數(shù),直到爬完所有的評論數(shù)據(jù)揭厚。
代碼如下:
# 導(dǎo)入所需包import requestsimport jsonimport pandas as pdimport timedef get_bili_comment_one(url): """ 功能:定義函數(shù)却特,獲取一頁的信息 """ # 添加headers headers = { 'Host': 'api.bilibili.com', 'Referer': 'https://www.bilibili.com/video/BV1YZ4y1j7s5', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36' } # 添加cookies cookies = { "cookie": "復(fù)制您的瀏覽器cookie信息" } # 發(fā)起請求 try: r = requests.get(url, headers=headers, cookies=cookies, timeout=3) except Exception as e: print(e) r = requests.get(url, headers=headers, cookies=cookies, timeout=3) # 解析為字典 r_json = json.loads(r.text) # 提取信息 replies_data = r_json['data']['replies'] # 用戶名 user_name = [i['member'].get('uname') for i in replies_data] # 性別 sex = [i['member'].get('sex') for i in replies_data] # 簽名 sign = [i['member'].get('sign') for i in replies_data] # 用戶等級 current_level = [i['member']['level_info'].get('current_level') for i in replies_data] # 評論內(nèi)容 content = [i['content'].get('message') for i in replies_data] # 用戶設(shè)備 device = [i['content'].get('device') for i in replies_data] # 評論時(shí)間 content_time = [i.get('ctime') for i in replies_data] # 回復(fù)數(shù) reply_count = [i['rcount'] for i in replies_data] # 存儲數(shù)據(jù) df = pd.DataFrame({ 'user_name': user_name, 'sex': sex, 'sign': sign, 'current_level': current_level, 'content': content, 'device': device, 'content_time': content_time, 'reply_count': reply_count }) return dfdef get_bili_comment_all(oid, num): """ 功能:定義函數(shù),獲取B站視頻指定頁評論信息 """ # 循環(huán)構(gòu)建URL df_all = pd.DataFrame() for page_num in range(1, num): try: # 構(gòu)建URL url = 'https://api.bilibili.com/x/v2/reply?&pn={}&type=1&oid={}&sort=2'.format(page_num, oid) # 調(diào)用函數(shù) df = get_bili_comment_one(url) # 判斷 if df.shape[0] == 0: break else: # 循環(huán)追加 df_all = df_all.append(df, ignore_index=True) # 打印進(jìn)度 print('我正在獲取第{}頁的信息'.format(page_num)) except: break # 休眠一秒 time.sleep(0.5) return df_all# 《入荷冈玻》bilibili X 毛不易 | 躍入人海裂明,各有風(fēng)雨?duì)N爛df = get_bili_comment_all(oid='795637027', num=973)
獲取到的數(shù)據(jù)以DataFrame的形式存儲,格式如下:
# 讀入數(shù)據(jù)df.head()
數(shù)據(jù)集有19099個(gè)樣本,8個(gè)字段闽晦,字段名稱為:用戶名扳碍、用戶性別、用戶簽名仙蛉、用戶等級笋敞、用戶評論、設(shè)備名稱荠瘪、評論時(shí)間夯巷、點(diǎn)贊數(shù)。
df.info()
<class 'pandas.core.frame.DataFrame'>RangeIndex: 19099 entries, 0 to 19098Data columns (total 8 columns):user_name 19099 non-null objectsex 19099 non-null objectsign 9896 non-null objectcurrent_level 19099 non-null int64content 19099 non-null objectdevice 4159 non-null objectcontent_time 19099 non-null int64reply_count 19099 non-null int64dtypes: int64(3), object(5)memory usage: 1.2+ MB
數(shù)據(jù)整理
此處我們主要對以上獲取的數(shù)據(jù)集進(jìn)行部分清洗工作以方便后續(xù)的處理:
重復(fù)值處理類型轉(zhuǎn)化時(shí)間戳數(shù)據(jù)處理評論數(shù)據(jù)jieba分詞處理-(代碼暫略)
# 導(dǎo)入包import numpy as np import pandas as pd# 讀入數(shù)據(jù)df = pd.read_excel('../data/B站評論數(shù)據(jù)-入海5.23.xlsx')# 去重df = df.drop_duplicates()# 轉(zhuǎn)換類型df['content'] = [str(i) for i in df.content] # 定義轉(zhuǎn)換時(shí)間def transform_timestamp(time_second): timeArray = time.localtime(time_second) otherStyleTime = time.strftime('%Y-%m-%d %H:%M:%S', timeArray) return otherStyleTime# 提取時(shí)間df['content_time'] = df['content_time'].apply(lambda x:transform_timestamp(x))
數(shù)據(jù)可視化分析
我們將進(jìn)行以下部分的數(shù)據(jù)可視化分析哀墓,首先導(dǎo)入所需包趁餐,其中pyecharts用于繪制動態(tài)圖形,stylecloud用于繪制詞云圖篮绰,關(guān)鍵代碼如下:
from pyecharts.charts import Bar, Pie, Line, WordCloud, Pagefrom pyecharts import options as opts from pyecharts.globals import SymbolTypeimport stylecloudfrom IPython.display import Image
評論性別占比
# 總體評分分布sex_num = df['sex'].value_counts()sex_num.drop('保密', inplace=True) # 繪制餅圖data_pair = [list(z) for z in zip(sex_num.index.tolist(), sex_num.values.tolist())]# 繪制餅圖pie1 = Pie(init_opts=opts.InitOpts(width='1350px', height='750px'))pie1.add('', data_pair, radius=['35%', '60%'])pie1.set_global_opts(title_opts=opts.TitleOpts(title='評論用戶性別占比'), legend_opts=opts.LegendOpts(orient='vertical', pos_top='15%', pos_left='2%'))pie1.set_series_opts(label_opts=opts.LabelOpts(formatter="后雷:hdp3r3x%"))pie1.set_colors(['#EF9050', '#3B7BA9', '#6FB27C'])pie1.render()
用戶客戶端分布
device_num = df.device.value_counts(ascending=True) # 柱形圖bar1 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px'))bar1.add_xaxis(device_num.index.tolist())bar1.add_yaxis('', device_num.values.tolist(), label_opts=opts.LabelOpts(position='right'))bar1.set_global_opts(title_opts=opts.TitleOpts(title='評論客戶端分布'), visualmap_opts=opts.VisualMapOpts(max_=3000))bar1.reversal_axis()bar1.render()
用戶等級分布
# 用戶等級level_num = df.current_level.value_counts()data_pair2 = [list(z) for z in zip(['LV' + i for i in level_num.index.astype('str').tolist()] , level_num.values.tolist())]# 繪制餅圖pie2 = Pie(init_opts=opts.InitOpts(width='1350px', height='750px'))pie2.add('', data_pair=data_pair2, radius=['35%', '60%'])pie2.set_global_opts(title_opts=opts.TitleOpts(title='評論用戶等級分布'), legend_opts=opts.LegendOpts(orient='vertical', pos_top='15%', pos_left='2%'))pie2.set_series_opts(label_opts=opts.LabelOpts(formatter=":{c}(zxpnr73%)"))pie2.set_colors(['#EF9050', '#3B7BA9', '#6FB27C', '#FFAF34'])pie2.render()
評論時(shí)間走勢圖
# 時(shí)間數(shù)據(jù)處理df['time'] = df.content_time.str.split('-').str[1] + '-' + df.content_time.str.split('-').str[2]df['time'] = df.time.str.split(':').str[0]time_num = df.time.value_counts().sort_index()# 產(chǎn)生數(shù)據(jù)x1_line1 = time_num.index.values.astype('str').tolist()y1_line1 = time_num.values.tolist() # 繪制面積圖line1 = Line(init_opts=opts.InitOpts(width='1350px', height='750px'))line1.add_xaxis(x1_line1)line1.add_yaxis('', y1_line1, areastyle_opts=opts.AreaStyleOpts(opacity=0.3), markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(type_='max', name='最大值') ])) line1.set_global_opts(title_opts=opts.TitleOpts('各個(gè)時(shí)段評論人數(shù)'), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate='30')) ) line1.set_series_opts(label_opts=opts.LabelOpts(is_show=False), axisline_opts=opts.AxisLineOpts() )line1.render()
評論詞云圖
import stylecloudfrom IPython.display import Image # 用于在jupyter lab中顯示本地圖片stylecloud.gen_stylecloud(text=' '.join(word_num), # txt需要傳入str格式 collocations=False, font_path=r'C:\Windows\Fonts\msyh.ttc', icon_name='fas fa-graduation-cap', size=768, output_name='B站評論詞云圖.png')Image(filename='B站評論詞云圖.png')
原文鏈接:https://baijiahao.baidu.com/s?id=1667723272482255770&wfr=spider&for=pc