最近這部《隱祕的角落》徹底火了,目前在豆瓣高達8.9分,有45萬餘人進行了評論。
一時間劇中張東昇那句「爬山」、「你說我還有機會嗎」 承包了6月份的梗。各種表情包和段子齊飛。
作爲主演秦昊當年的同學,章子怡都出來打call。
刷完劇,那首「小白船」簡直成了新的恐怖童謠,讓人在腦海中無限循環,太上頭了。
那麼這部製作精良的國產劇爲何能收穫到觀衆的一致好評?大家在看劇時都在討論些什麼?今天我們就用數據來帶你看看。
01拿拍電影的態度拍網劇 ,不好看纔怪
該劇改編自紫金陳推理小說《壞小孩》 ,講述了沿海小城的三個孩子在景區遊玩時無意拍攝記錄了一次謀殺,他們的冒險也由此展開。撲朔迷離的案情,將幾個家庭裹挾其中,帶向不可預知的未來…
劇剛開始的畫面就是,文質彬彬的男青年帶着一對老人在山頂拍照,二老坐在石頭上,背後就是萬丈深淵,男青年上前親自指導姿勢,而就在一瞬間,他眼神一冷,兩隻手同時發力,將二老從山頂推了下去,甚至在推完還在佯作驚慌失措的樣子大喊:“爸!媽!”而這一切卻被三個遊玩的小孩無意拍了下來。
這一開場就把觀衆嚇了一跳,甚至都起了雞皮疙瘩。同時也讓人慾罷不能想看看接下來會發生什麼故事。
劇情不拖沓,演技全員在線
不同於國產劇一般動輒四五十集的篇幅,《隱祕的角落》只有短短的12集,故事緊湊,劇情毫不拖泥帶水。
而整部劇中,無論是從挑大樑的秦昊,到三位小演員,還是王景春、張頌文等一衆演員都奉獻出了無可挑剔的演技。
令人印象深刻的配樂
配樂也是《隱祕的角落》中的亮點之一。配合影視劇的懸疑劇情,這些配樂聽起來確實分外驚悚恐怖,也給大家留下了不可磨滅的陰影,被網友調侃:“能不能整點陽間的音樂?”如果問爲什麼本劇配樂這麼講究,要知道《隱祕的角落》的導演辛爽可是樂隊音樂人出身的。
02豆瓣8.9分 年度國劇之光!
首先,我們看到豆瓣的數據。這部劇一開播在豆瓣評分就衝上9.0分,一度衝到9.2分,隨着劇集完結,目前穩定在8.9分,已經有45萬餘人進行了評分。
總體評分
細看評分的分佈可以發現,有54.4%的人都給出了五星好評,其次23.4%的人給出四星。這個成績還是很不錯的。
評論熱度走勢圖
從評論走勢圖可以看到,《隱祕的角落》在6月16日首播,評論熱度最高。之後不同於其他劇,隨着播出時間評論數量趨於平緩,這部劇再播出後也不時帶來熱度,引發觀衆的評論潮。
評論中提及主演
大家在評論時都提到哪些角色了呢?
分析發現,主演張東昇的討論度果然是最高的,其次是三個小演員之一的朱朝陽。演技派演員王景春和張頌文飾演的陳警官和朝陽爸爸討論度也很高。
主演評價分佈
我們分析了豆瓣短評中用戶關於主演的好評/一般/差評分佈佔比。
細緻到個人表演來看,小演員們的表現相當突出,比如朱朝陽的扮演者榮梓杉,有超過9成的觀衆肯定了他的表現。秦昊、王景春兩位的表現自然也是很厲害的。他們在劇中的表現,分別獲得了88.08%和89.29%的好評率。
0320萬條彈幕告訴你
追劇時大家都在說些什麼?
接下來我們分析一下《隱祕的角落》在愛奇藝的彈幕數據,我們分析整理了全部12集的彈幕,共200672條。下面看到分析結論:
用戶使用的彈幕角色
觀衆在愛奇藝追劇發彈幕時,可以選擇自己喜歡的角色頭像。那麼觀衆都最喜歡用哪些用人物角色發彈幕呢?
可以看到,這方面張東昇在這方面是榜首。其次是朱朝陽,然後可愛的小妹妹普普位居第三。
彈幕字數分佈
在彈幕的字數上我們可以看到,5-10個字的是最多的,共有11萬餘條彈幕。其次是10-15個字,48032條彈幕。0-5個字的彈幕也有不少,共25420條。可見在追劇發彈幕時,大家還是傾向多說點,表達自己的想法。
整體彈幕詞雲
在整體彈幕詞雲中,「孩子」、「嚴良」、「普普」被提到的頻率很高。看到三位小主演的一舉一動還是牽動着觀衆的心的。
接下來,我們分別看到幾位主演的人物彈幕詞雲吧。
張東昇
首先就是張東昇了,不同於一般臉譜化的反派角色。在張東昇的身上,大家既看到他的冷酷,兇殘,也看到他的無奈和隱忍。在彈幕中,關於他,提到「爬山」、「機會」的特別多,這幾句張東昇的話實在太出圈了。
有意思的是,張東昇的「頭髮」也被頻頻提及,畢竟這個禿頭造型實在是太令人印象深刻了。
朱朝陽
下面再看到三位小主演中最受關注的朱朝陽。品學兼優的他,因爲父母離異性格有些內向和孤僻。在詞雲中,他與「爸爸」、「媽媽」的感情也是大家討論最多的。其次他與「張東昇」間的對手戲,以及後面他角色的「黑化」也是討論焦點。
普普
劇中的小妹妹普普也是很多人喜歡的角色了,在詞雲中可以看到觀衆對她的「喜歡」,以及對她「演技」的肯定。此外,「善良」等詞也常被提到。
嚴良
劇中的另一位小演員角色——嚴良也是彈幕中關注度很高的。關於他,大家經常會提到跟他形影不離的「普普」,此外「演技不錯」「厲害」等詞也頻出。
04教你用Python分析愛奇藝彈幕數據
我們使用Python獲取並分析愛奇藝的彈幕數據,整個數據分析的流程分爲以下三個部分:
數據讀入
數據預處理
數據可視化分析
下面看到具體步驟:
首先導入所需包,其中pandas用於數據讀入和數據處理,os用於文件操作,jieba用於中文分詞,pyecharts和stylecolud用於數據可視化。
# 導入庫
import pandas as pd
import os
import jieba
from pyecharts.charts import Bar, Pie, Line, WordCloud, Page
from pyecharts import options as opts
from pyecharts.globals import SymbolType, WarningType
WarningType.ShowWarning = False
import stylecloud
from IPython.display import Image
我們將爬取的數據存放在data文件夾下,使用os操作獲取需要讀取的csv文件列表。
# 文件列表
data_list = os.listdir('../data/')
data_list
['df_第一集.csv',
'df_第七集.csv',
'df_第三集.csv',
'df_第九集.csv',
'df_第二集.csv',
'df_第五集.csv',
'df_第八集.csv',
'df_第六集.csv',
'df_第十一集.csv',
'df_第十二集.csv',
'df_第十集.csv',
'df_第四集.csv']
然後使用pandas將csv文件讀入並循環追加到總表df_all中,打印以下數據集大小看一下,一共有200672條。
# 存儲數據
df_all = pd.DataFrame()
# 循環寫入
for i in data_list:
df_one = pd.read_csv(f'../data/{i}', engine='python', encoding='utf-8', index_col=0)
df_all = df_all.append(df_one, ignore_index=False)
# 打印數據集大小
print(df_all.shape)
(200672, 6)
再預覽一下前五行數據。
# 預覽數據
df_all.head()
數據讀入之後,接下來簡單對數據集進行預處理的工作,我們針對name字段進行以下處理:使用strip操作去除字符串前後的空格;定義一個轉換函數,根據name字段新增name_level字段,標註用戶等級,效果如下:
# 字符串處理
df_all['name'] = df_all.name.str.strip()
def transform_name(x):
if x=='張東昇' or x=='朱朝陽' or x=='普普' or x=='嚴良' or x=='陳冠聲' or x=='周春紅' or x=='朱永平' or x=='葉軍':
return 'VIP用戶'
elif x=='未知用戶':
return '未知用戶'
else:
return '普通用戶'
# 新增列
df_all['name_level'] = df_all.name.apply(transform_name)
df_all.head()
接下來使用pyecharts進行數據可視化。主要分析內容包含:
用戶最喜歡使用的彈幕角色-條形圖
彈幕發送字數分佈-條形圖
彈幕角色-詞雲圖
首先統計不同等級用戶的數量。
level_num = df_all.name_level.value_counts()
level_num
未知用戶 157722
VIP用戶 41127
普通用戶 1823
Name: name_level, dtype: int64
使用pyecharts中的Pie類繪製餅圖,效果如下:
data_pair = [list(z) for z in zip(level_num.index.tolist(), level_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="{b}:{d}%"))
pie1.set_colors(['#3B7BA9', '#6FB27C', '#FFAF34'])
pie1.render()
name字段中標註了用戶發送彈幕時候使用的彈幕角色,統計並篩選不同彈幕角色的使用頻次。
role_num = df_all.name.value_counts()[1:9]
role_num
張東昇 18734
朱朝陽 8742
普普 4688
嚴良 2595
陳冠聲 2122
周春紅 1879
朱永平 1333
葉軍 1034
Name: name, dtype: int64
然後使用pyecharts中的Bar類繪製一張餅圖。
# 柱形圖
bar1 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px'))
bar1.add_xaxis(role_num.index.tolist())
bar1.add_yaxis("", role_num.values.tolist(), category_gap='5%')
bar1.set_global_opts(title_opts=opts.TitleOpts(title="VIP用戶最喜歡使用的彈幕角色"),
visualmap_opts=opts.VisualMapOpts(max_=18734),
)
bar1.render()
content字段記錄了用戶評論的彈幕信息,此處根據這個字段計算字數並按照步長5進行分箱處理,得到不同字數段下的頻次分佈。
word_num = df_all.content.apply(lambda x:len(x))
# 分箱
bins = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
word_num_cut = pd.cut(word_num, bins, include_lowest=False).value_counts()
word_num_cut = word_num_cut.sort_index()
word_num_cut
(0, 5] 25420
(5, 10] 113834
(10, 15] 48032
(15, 20] 9864
(20, 25] 2385
(25, 30] 645
(30, 35] 274
(35, 40] 109
(40, 45] 49
(45, 50] 46
Name: content, dtype: int64
同樣使用Bar類繪製一張條形圖。
# 柱形圖
bar2 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px'))
bar2.add_xaxis(word_num_cut.index.astype('str').tolist())
bar2.add_yaxis("", word_num_cut.values.tolist(), category_gap='4%')
bar2.set_global_opts(title_opts=opts.TitleOpts(title="彈幕發送字數分佈"),
visualmap_opts=opts.VisualMapOpts(max_=113834),
)
bar2.render()
接下來我們定義一個分詞函數get_cut_words,這個函數的功能是傳入一列數據,得到使用jieba分詞之後的列表。
# 定義分詞函數
def get_cut_words(content_series):
# 讀入停用詞表
stop_words = []
with open(r"C:\Users\wzd\Desktop\CDA\CDA_Python\Python文本分析\10.文本摘要\stop_words.txt", 'r', encoding='utf-8') as f:
lines = f.readlines()
for line in lines:
stop_words.append(line.strip())
# 添加關鍵詞
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_all[df_all.name=='張東昇']['content'])
text1[:5]
Building prefix dict from the default dictionary ...
Dumping model to file cache C:\Users\wzd\AppData\Local\Temp\jieba.cache
Loading model cost 1.280 seconds.
Prefix dict has been built successfully.
['爬山', '老弟', '十二集', '知足', '伊能靜']
然後使用stylecloud工具包繪製一張心形的詞雲圖,效果如下:
# 繪製詞雲圖
stylecloud.gen_stylecloud(text=' '.join(text1), max_words=1000,
collocations=False,
font_path=r'C:\Windows\Fonts\msyh.ttc',
icon_name='fas fa-heart',
size=653,
output_name='./詞雲圖/彈幕角色-張東昇詞雲圖.png')
Image(filename='./詞雲圖/彈幕角色-張東昇詞雲圖.png')