<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用Python分析《令人心動的offer2》的13萬條彈幕,網(wǎng)友們都在吐槽什么?

          共 6445字,需瀏覽 13分鐘

           ·

          2020-12-04 18:29

          擊上方“Python爬蟲與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注

          回復(fù)“書籍”即可獲贈Python從入門到進(jìn)階共10本電子書

          凄凄不似向前聲,滿座重聞皆掩泣。

          前言

          大家好,我是J哥。

          綜藝,是我們勞累了一天的放松方式,也是我們飯后的談資??粗约合矚g的綜藝,時光足夠美。而《令人心動的offer》,就是一個不錯的綜藝選擇。

          《令人心動的offer》目前為止已經(jīng)播出了兩季,第一季在豆瓣為8.3分,共有5萬余人評分,第二季目前評分低于第一季,評分僅7.1分。本文通過爬取《令人心動的offer》第二季13萬+彈幕,進(jìn)行可視化分析和情感分析,完整代碼后臺回復(fù)「offer」即可免費(fèi)獲取。

          數(shù)據(jù)獲取

          《令人心動的offer》第二季在騰訊視頻獨(dú)家播出,目前已播出四期(含面試篇),本文采取分集爬取。彈幕數(shù)據(jù)爬蟲在往期原創(chuàng)文章中已詳細(xì)講解,本文不做贅述,感興趣的朋友可點(diǎn)擊:視頻彈幕爬蟲,看這一篇就夠了。以下以爬取面試篇彈幕為例,并給出完整代碼:

          #-*- coding = uft-8 -*-
          #@Time : 2020/11/30 21:35
          #@Author : 公眾號 菜J學(xué)Python
          #@File : tengxun_danmu.py

          import requests
          import json
          import time
          import pandas as pd

          target_id = "6130942571%26" #面試篇的target_id
          vid = "%3Dt0034o74jpr" #面試篇的vid
          df = pd.DataFrame()
          for page in range(15, 3214, 30): #視頻時長共3214秒
          headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}
          url = 'https://mfm.video.qq.com/danmu?otype=json×tamp={0}&target_id={1}vid{2}&count=80'.format(page,target_id,vid)
          print("正在提取第" + str(page) + "頁")
          html = requests.get(url,headers = headers)
          bs = json.loads(html.text,strict = False) #strict參數(shù)解決部分內(nèi)容json格式解析報錯
          time.sleep(1)
          #遍歷獲取目標(biāo)字段
          for i in bs['comments']:
          content = i['content'] #彈幕
          upcount = i['upcount'] #點(diǎn)贊數(shù)
          user_degree =i['uservip_degree'] #會員等級
          timepoint = i['timepoint'] #發(fā)布時間
          comment_id = i['commentid'] #彈幕id
          cache = pd.DataFrame({'彈幕':[content],'會員等級':[user_degree],'發(fā)布時間':[timepoint],'彈幕點(diǎn)贊':[upcount],'彈幕id':[comment_id]})
          df = pd.concat([df,cache])
          df.to_csv('面試篇.csv',encoding = 'utf-8')

          分別爬取完成后,將四個彈幕csv文件放入一個文件夾中。打開面試篇csv文件,預(yù)覽如下:

          數(shù)據(jù)清洗

          合并彈幕數(shù)據(jù)

          首先,將四個彈幕csv文件進(jìn)行數(shù)據(jù)合并,采用concat方法。

          import pandas as pd
          import numpy as np
          df1 = pd.read_csv("/菜J學(xué)Python/彈幕/騰訊/令人心動的offer/面試篇.csv")
          df1["期數(shù)"] = "面試篇"
          df2 = pd.read_csv("/菜J學(xué)Python/彈幕/騰訊/令人心動的offer/第1期.csv")
          df2["期數(shù)"] = "第1期"
          df3 = pd.read_csv("/菜J學(xué)Python/彈幕/騰訊/令人心動的offer/第2期.csv")
          df3["期數(shù)"] = "第2期"
          df4 = pd.read_csv("/菜J學(xué)Python/彈幕/騰訊/令人心動的offer/第3期.csv")
          df4["期數(shù)"] = "第3期"
          df = pd.concat([df1,df2,df3,df4])

          預(yù)覽下合并后的數(shù)據(jù):

          df.sample(10)
          合并后數(shù)據(jù)

          查看數(shù)據(jù)信息

          df.info()
          <class 'pandas.core.frame.DataFrame'>
          Int64Index:
          133627 entries, 0 to 34923
          Data columns (total 8 columns):
          # Column Non-Null Count Dtype
          --- ------ -------------- -----
          0 Unnamed: 0 133627 non-null int64
          1 用戶名 49040 non-null object
          2 內(nèi)容 133626 non-null object
          3 會員等級 133627 non-null int64
          4 評論時間點(diǎn) 133627 non-null int64
          5 評論點(diǎn)贊 133627 non-null int64
          6 評論id 133627 non-null int64
          7 期數(shù) 133627 non-null object
          dtypes: int64(5), object(3)
          memory usage: 9.2+ MB

          發(fā)現(xiàn)數(shù)據(jù)存在以下幾個問題:1.字段名稱可調(diào)整(個人潔癖)2.Unnamed字段多余 3.用戶名字段有缺失值,可填充 4.內(nèi)容和評論時間點(diǎn)字段類型需要調(diào)整 5.評論id對分析無意義,可刪除

          重命名字段

          df = df.rename(columns={'用戶名':'用戶昵稱','內(nèi)容':'彈幕內(nèi)容','評論時間點(diǎn)':'發(fā)送時間','評論點(diǎn)贊':'彈幕點(diǎn)贊','期數(shù)':'所屬期數(shù)'})

          過濾字段

          #選擇需要分析的字段
          df = df[["用戶昵稱","彈幕內(nèi)容","會員等級","發(fā)送時間","彈幕點(diǎn)贊","所屬期數(shù)"]]

          缺失值處理

          df["用戶昵稱"] = df["用戶昵稱"].fillna("無名氏")

          發(fā)送時間處理

          發(fā)送時間字段是秒數(shù),需要改成時間,這里自定義一個time_change函數(shù)進(jìn)行處理。

          def time_change(seconds):
          m, s = divmod(seconds, 60)
          h, m = divmod(m, 60)
          ss_time = "%d:%02d:%02d" % (h, m, s)
          print(ss_time)
          return ss_time
          time_change(seconds=8888)

          將time_change函數(shù)應(yīng)用于發(fā)送時間字段:

          df["發(fā)送時間"] = df["發(fā)送時間"].apply(time_change)

          設(shè)置為需要的時間格式:

          df['發(fā)送時間'] = pd.to_datetime(df['發(fā)送時間'])
          df['發(fā)送時間'] = df['發(fā)送時間'].apply(lambda x : x.strftime('%H:%M:%S'))

          彈幕內(nèi)容處理

          將object數(shù)據(jù)類型更改為str:

          df["彈幕內(nèi)容"] = df["彈幕內(nèi)容"].astype("str")

          機(jī)械壓縮去重:

          #定義機(jī)械壓縮函數(shù)
          def yasuo(st):
          for i in range(1,int(len(st)/2)+1):
          for j in range(len(st)):
          if st[j:j+i] == st[j+i:j+2*i]:
          k = j + i
          while st[k:k+i] == st[k+i:k+2*i] and k k = k + i
          st = st[:j] + st[k:]
          return st
          yasuo(st="菜J學(xué)Python真的真的真的很菜很菜")
          #調(diào)用機(jī)械壓縮函數(shù)
          df["彈幕內(nèi)容"] = df["彈幕內(nèi)容"].apply(yasuo)

          特殊字符過濾:

          df['彈幕內(nèi)容'] = df['彈幕內(nèi)容'].str.extract(r"([\u4e00-\u9fa5]+)") #提取中文內(nèi)容
          df = df.dropna() #純表情彈幕直接刪除

          清洗后數(shù)據(jù)預(yù)覽如下:

          數(shù)據(jù)分析

          各期彈幕數(shù)量對比

          《令人心動的offer》第二季已播出四期(含面試篇),第1期:規(guī)則升級,實(shí)習(xí)生面臨高壓考核彈幕數(shù)量最多,達(dá)到42422個,面試篇:實(shí)習(xí)生面試遭靈魂拷問彈幕數(shù)量最少,僅為17332個。

          import pyecharts.options as opts
          from pyecharts.charts import *
          from pyecharts.globals import ThemeType

          df7 = df["所屬期數(shù)"].value_counts()
          print(df7.index.to_list())
          print(df7.to_list())
          c = (
          Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK))
          .add_xaxis(df7.index.to_list())
          .add_yaxis("",df7.to_list())
          .set_global_opts(title_opts=opts.TitleOpts(title="各期彈幕數(shù)量",subtitle="數(shù)據(jù)來源:騰訊視屏 \t制圖:菜J學(xué)Python",pos_left = 'left'),
          xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=13)), #更改橫坐標(biāo)字體大小
          yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=13)), #更改縱坐標(biāo)字體大小
          )
          .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='top'))
          )
          c.render_notebook()
          各期彈幕數(shù)量

          誰是彈幕發(fā)射機(jī)

          用戶昵稱為想太多de貓幾期下來共發(fā)射彈幕227個,遙遙領(lǐng)先其他彈幕黨,名副其實(shí)的彈幕發(fā)射機(jī)。

          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.DARK))
          .add_xaxis(df8.index.to_list())
          .add_yaxis("",df8.to_list()).reversal_axis() #X軸與y軸調(diào)換順序
          .set_global_opts(title_opts=opts.TitleOpts(title="彈幕發(fā)送數(shù)量TOP10",subtitle="數(shù)據(jù)來源:騰訊視頻 \t制圖:菜J學(xué)Python",pos_left = 'left'),
          xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=13)), #更改橫坐標(biāo)字體大小
          yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=13)), #更改縱坐標(biāo)字體大小
          )
          .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right'))
          )
          c.render_notebook()

          隨機(jī)抽取想太多de貓彈幕信息,發(fā)現(xiàn)其對《令人心動的offer》第二季愛的深沉。彈幕內(nèi)容透露出其觀看視頻還是相當(dāng)之認(rèn)真,幾乎每個彈幕都獲得了一定的點(diǎn)贊。

          df[df["用戶昵稱"]=="想太多de貓"].sample(10)
          彈幕發(fā)射機(jī)彈幕抽樣

          會員等級分布

          在觀看《令人心動的offer》第二季的觀眾中,高達(dá)74.31%的用戶和J哥一樣不是騰訊視頻的會員,占比第二的會員等級3占5.6%,共計(jì)7419人,占比第三的會員等級1占5.39%,共計(jì)7153人。

          df2 = df["會員等級"].astype("str").value_counts()
          print(df2)
          df2 = df2.sort_values(ascending=False)
          regions = df2.index.to_list()
          values = df2.to_list()
          c = (
          Pie(init_opts=opts.InitOpts(theme=ThemeType.DARK))
          .add("", list(zip(regions,values)))
          .set_global_opts(legend_opts = opts.LegendOpts(is_show = False),title_opts=opts.TitleOpts(title="會員等級分布",subtitle="數(shù)據(jù)來源:騰訊視頻\t制圖:菜J學(xué)Python",pos_top="0.5%",pos_left = 'left'))
          .set_series_opts(label_opts=opts.LabelOpts(formatter="等級占比:go7utgvlrp%",font_size=14))

          )
          c.render_notebook()
          會員等級分布

          彈幕在討論些什么

          通過對13+彈幕制作詞云圖,我們發(fā)現(xiàn),彈幕中出現(xiàn)頻率較高的詞匯有「丁輝、律師、喜歡、加油、徐律、干飯、撒老師」等。丁輝作為8個實(shí)習(xí)生里本科學(xué)校最差、年齡最大的成員,從一開始就被觀眾所熱議。徐律作為第1季的帶教導(dǎo)師,其雷厲風(fēng)行又知性溫柔的風(fēng)范,早已贏得廣大觀眾的喜愛。干飯作為最近非常熱門的網(wǎng)絡(luò)詞匯,出現(xiàn)在熱播綜藝中也不足為奇。而撒老師作為這一季的搞笑擔(dān)當(dāng)和凡爾賽擔(dān)當(dāng),也被廣大觀眾所熱議。

          # 定義分詞函數(shù)
          def get_cut_words(content_series):
          # 讀入停用詞表
          stop_words = []
          with open("/菜J學(xué)Python/offer/stop_words.txt", 'r', encoding='utf-8') as f:
          lines = f.readlines()
          for line in lines:
          stop_words.append(line.strip())
          # 添加關(guān)鍵詞
          my_words = ['撒老師', '范丞丞','第一季']
          for i in my_words:
          jieba.add_word(i)
          # 自定義停用詞
          my_stop_words = ['好像', '真的','感覺']
          stop_words.extend(my_stop_words)
          # 分詞
          word_num = jieba.lcut(content_series.str.cat(sep='。'), cut_all=False)
          # 條件篩選
          word_num_selected = [i for i in word_num if i not in stop_words and len(i)>=2]
          return word_num_selected
          # 繪制詞云圖
          text1 = get_cut_words(content_series=df['彈幕內(nèi)容'])
          stylecloud.gen_stylecloud(text=' '.join(text1), max_words=100,
          collocations=False,
          font_path='字酷堂清楷體.ttf',
          icon_name='fas fa-square',
          size=653,
          #palette='matplotlib.Inferno_9',
          output_name='./offer.png')
          Image(filename='./offer.png')
          整體彈幕詞云

          大家如何評論8個實(shí)習(xí)生

          我們首先看下8位實(shí)習(xí)生的照片:

          在所有彈幕中,丁輝被觀眾提及次數(shù)遠(yuǎn)超過另外7個實(shí)習(xí)生,共計(jì)9298次,其次是詹秋怡,被觀眾提及2455次,劉煜成被觀眾提及最少,僅有526次。

          df8 = df["人物提及"].value_counts()[1:11]
          print(df8.index.to_list())
          print(df8.to_list())
          c = (
          Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK))
          .add_xaxis(df8.index.to_list())
          .add_yaxis("",df8.to_list())
          .set_global_opts(title_opts=opts.TitleOpts(title="人物提及次數(shù)",subtitle="數(shù)據(jù)來源:騰訊視頻 \t制圖:菜J學(xué)Python",pos_left = 'left'),
          xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=13)), #更改橫坐標(biāo)字體大小
          yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=13)), #更改縱坐標(biāo)字體大小
          )
          .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='top'))
          )
          c.render_notebook()

          分別繪制8個實(shí)習(xí)生的彈幕詞云圖,我們發(fā)現(xiàn),還是有很多觀眾認(rèn)可「丁輝」的,「加油、喜歡、看好、支持」等詞出現(xiàn)頻率較高;對于性格較為內(nèi)向的詹秋怡,觀眾也非常喜歡,從「漂亮、劉亦菲、好看」等高頻詞可看出,不少人喜歡她是基于顏值;作為來自頂級學(xué)府斯坦福的王驍來說,觀眾呈現(xiàn)兩邊倒的局勢,有人說「王驍好」,也有人認(rèn)為他是「凡爾賽」;朱一暄也一樣,有人覺得她很「可愛」,也有人「討厭」她;瞿澤林則被表揚(yáng)「情商高、可愛」;李晉曄的「帥氣」被觀眾贊不絕口,甚至有很多人認(rèn)為他很像第1季的人氣實(shí)習(xí)生何運(yùn)晨;人大畢業(yè)的王穎飛也被觀眾夸贊「好看、漂亮」;高分過司考的劉煜成被觀眾夸贊「專業(yè)知識不錯」,由于在第3期中被王驍搶話,受了委屈,觀眾紛紛表示「心疼」

          情感分析

          通過運(yùn)用百度開源NLP對彈幕內(nèi)容進(jìn)行情感分值計(jì)算,我們發(fā)現(xiàn),《令人心動的offer》第二季整體情感分值高于0.5,觀眾表現(xiàn)出較高的積極傾向。會員等級較高的觀眾越能堅(jiān)持觀看到最后,彈幕點(diǎn)贊量從視頻播放開始呈增長趨勢,在最后15分鐘時驟降。情感分值則表現(xiàn)為視頻播放首尾高,中間低。

          import paddlehub as hub
          #這里使用了百度開源的成熟NLP模型來預(yù)測情感傾向
          senta = hub.Module(name="senta_bilstm")
          texts = df['彈幕內(nèi)容'].tolist()
          input_data = {'text':texts}
          res = senta.sentiment_classify(data=input_data)
          df['情感分值'] = [x['positive_probs'] for x in res]
          #重采樣至15分鐘
          df.index = df['發(fā)送時間']
          data = df.resample('15min').mean().reset_index()

          #給數(shù)據(jù)表添加調(diào)色板
          import seaborn as sns
          color_map = sns.light_palette('orange', as_cmap=True) #light_palette調(diào)色板
          data.style.background_gradient(color_map)
          情感分值表
          c = (
          Line(init_opts=opts.InitOpts(theme=ThemeType.DARK))
          .add_xaxis(data["發(fā)送時間"].to_list())
          .add_yaxis('情感傾向', list(data["情感分值"].round(2)), is_smooth=True,is_connect_nones=True,areastyle_opts=opts.AreaStyleOpts(opacity=0.5))
          .set_global_opts(title_opts=opts.TitleOpts(title="情感傾向",subtitle="數(shù)據(jù)來源:騰訊視頻 \t制圖:菜J學(xué)Python",pos_left = 'left'))
          )
          c.render_notebook()

          -------------------?End?-------------------

          往期精彩文章推薦:

          歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學(xué)習(xí)群請?jiān)诤笈_回復(fù)【入群

          萬水千山總是情,點(diǎn)個【在看】行不行

          /今日留言主題/

          隨便說一兩句吧~~

          瀏覽 47
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩黄色大全 | 综合偷拍网 | 夜色88V精品国产 | 乱伦AV影视 | 久久午夜无码鲁丝午夜精品 |