我分析了王力宏、周杰倫、林俊傑和潘瑋柏的32萬字歌詞:為了找到最傷感的一首歌
更新於2017年5月5日,調整了情感分析介面,重新計算了前十榜單,並且提供了本次項目涉及歌曲的情感查詢,大家可以自己輸入歌名查到它屬於正面情緒還是負面情緒——王力宏周杰倫林俊傑潘瑋柏歌曲情感查詢
前言
我分析了王力宏、周杰倫、林俊傑和潘瑋柏的32萬字歌詞,就是為了找到最傷感的一首歌。
本項目受到《我分析了42萬字歌詞,就為了搞清楚民謠歌手們在唱些什麼》一文的啟發以及下面的這幅圖,一張讓我更加確定了「已經年紀不小了」這個殘酷事實的圖。
說實話,這上面的歌手我大概只認識一半,聽過的歌更是少的可憐,大概只有《青春修鍊手冊》,《演員》還有張傑翻唱的《街角的祝福》。
關於華語男歌手的認識應該是停在初中了吧。那時火的是周杰倫,王力宏,林俊傑和潘瑋柏——
我們班幾個男生因為經常唱他們的歌有了諸如「宗杰倫」,「溫俊傑」,「魚力宏」的外號;
我們全寢室在社會實踐表演會上合唱了一首《楓》,由於有我這種跑調天王的存在,我們沒有拿到最佳歌曲節目獎;
有一個學期在操場撿了一個用電池的mp3,只有512MB。我們在電腦課上把歌拷進去,然後每晚輪流聽,聽了好久;
由於他們的歌都爛熟於心,所以有幾個同學就養成了一個不良愛好——改編歌詞,往往會改得很惡俗,《菊花殘》這種還算普通,印象中最惡俗的歌就是——《腋毛海》。
。
。
。
好了,雖然類似的回憶還有很多,但就此打住吧,畢竟這篇文章的主要目的,是從數據分析的角度對王力宏,周杰倫,林俊傑和潘瑋柏的歌詞進行分析。主要研究幾個有趣的問題,比如:
1. 他們最正面情緒的十首歌是哪些?
2. 他們最負面情緒的十首歌是哪些?
3. 總的來說,哪個人的歌詞最傷感?
4. 總的來說,哪個人的歌詞最歡快!
5. 他們最喜歡季節是什麼?
6. 他們最常用「你」,「我」還是「她」?
7. 誰最會說「愛」字?
當然,因為歌詞和歌手存在著一定程度的割裂,有些作詞並不是歌手本身,但本次研究不考慮這些問題。換個角度想,這些歌是被歌手不斷演唱而知名,所以裡面肯定蘊含了歌手本身的情感和認知,不然也不會唱火,你說是吧?(突然自己感覺自己說的很有道理,嗯)
數據來源
本次數據來源於百度音樂。我用第三方工具pyspider寫了一個爬蟲自動抓取了1000多條數據。說實話,從百度音樂抓下來的歌詞數據格式不是特別好看,亂糟糟,比如歌詞開頭兩三行介紹歌手、作曲、作詞的順序不太一樣。這讓我想起了以前用酷狗聽歌的時候,歌詞都是雲端匹配,良莠不齊。很多歌詞前面都會帶著一個QQ號,大概是製作這個歌詞的人,有的甚至會寫一兩段話,諸如「XXX,你要知道我一直很愛你」之類的話,有點莫名其妙。但是,因為一些版權和爬蟲抓取難易程度的原因,百度音樂是目前的最佳選擇,所以只好用它。最終,我獲得的數據包含了以下欄位:
專輯名album,歌手singer, 歌詞lyrics 和歌名title
歌詞部分共有32萬個字元。由於有些歌曲存在著歌詞缺失,不得不做處理。在數據清洗之後的有效歌曲數如下:
接著就開始今天的重頭戲——情感分析。
情感分析
在情感分析中,我用到了BosonNLP這個工具,直接可以在python調用對字元串進行情感分析,免費用戶只能一天五百次的調用次數,不過已經夠用了(我註冊了三四個號)。
它是這麼介紹他的情感分析功能的:基於上百萬條社交網路平衡語料和數十萬條新聞平衡語料的機器學習模型,結合自主開發的半監督學習技術,正負面情感分析準確度達到80%~85% ,
在BosonNLP工具中,情感分析的結果由兩部分構成,正面情緒分和負面情緒分,兩者加起來等於1。
心理學上把焦慮、緊張、憤怒、沮喪、悲傷、痛苦等情緒統稱為負面情緒。而正面情緒是指人的一種積極的情緒,開心、樂觀、自信、欣賞、放鬆等等。所以之前我用消極和積極有點不妥(雖然negative和positive翻譯過來是這樣),畢竟漢語博大精深。例如,我發現一些rap歌曲被分到了負面情緒,但它並不是消極的,只是包含了緊張激動的情緒,這點受到了@伍宇倫的啟發。
在整體情感分析前,我挑了一些歌對即將用到的工具進行了測試。在下面表格sentiment一欄中,左側的數字代表著積極情緒分,右側的數字代表著消極情緒分。
首先測試的是周杰倫的《安靜》,結果測出來是絕對的負面,似乎還不錯:
再來一首《陽光宅男》,結果是絕對的正面,符合預期:
最後來測一首潘瑋柏的《我對天空說》,這首歌真的悲傷啦,看來這個工具也能正確的識別:
在測試完這三個後我就放心的開始整體探索(其實我還測了很多),畢竟人家都把這個工具出來賣了,準確性肯定很高。
受到@蘇格蘭折耳喵的提醒,我修改了下BosonNLP的介面,把通用介面換成了微博介面,重新跑了一次情感分數,已經更新如下。後面的榜單也做了更新,個人感覺稍微又合理些。但是微博語料和歌詞還是差很多,最好的條件應該是自己有個針對歌詞的訓練樣本,這樣準確率會提高很多。
最後得到了一個整體的結果,我發現四位歌手中,積極情緒分數最高的是林俊傑,其次是潘瑋柏,王力宏第三,周杰倫最低。因為互加為1,消極情緒的分數的排名就剛好相反。
周杰倫的歌之所以積極情緒最低,消極情緒最高可能是有兩個原因造成的:1)他的歌很多本身歌詞就比較悲傷 2)周杰倫的歌總體數量比其他三位要多,而他們大部分的歌都是屬於情歌,而情歌呢有大部分都很悲傷,所以就會拉低這積極情緒的評分。
接下來看一下每位歌手最正面情緒和最負面情緒的十大金曲吧!
王力宏
王力宏十大「負面情緒」歌曲:
周杰倫
周杰倫十大「負面情緒」歌曲:
周杰倫十大「正面情緒」歌曲:
林俊傑
林俊傑十大「負面情緒」歌曲:
林俊傑十大「正面情緒」歌曲:
潘瑋柏
潘瑋柏十大「負面情緒」歌曲:
潘瑋柏十大「正面情緒」歌曲:
基於以上榜單,我終於找到了最傷感的歌——《倒帶》,消極指數高達0.99726。(雖然周杰倫只是唱過倒帶)
大家說某某一歌曲怎麼沒有入選十大榜單,那是因為BosonNLP給的分數稍微低了點。但是大家提到的歌曲我都回頭看了下,基本分類正確,即大家認為它應該是負面情緒的,BosonNLP算出來的負面情緒就是大於0.5。只不過在小數點之後的數值差異受到訓練樣本和演算法的影響,有差距。所以前十的榜單只是一個參考作用。畢竟情感分析的首要目的是分類正確(正面or負面),而不是在分類後的排序中的準確。
歌曲查詢地址:王力宏周杰倫林俊傑潘瑋柏歌曲情感查詢,用了金數據的一個功能,大家點進去之後輸入你想查的歌名就會得到相應的回饋,如圖所示:
趣味探索
在結束了主要部分情感分析內容後,我對歌詞的用詞和意象也做了一些探索。我把每首歌的歌詞進行拆分,排除掉了停用詞,對剩下的詞做了一個頻率統計。
你我還是她?
我首先對「你」,「我」,「他/她」三個詞進行分析。大部分的歌以第一人稱和第二人稱為主。其中王力宏的歌詞中第一人稱出現比率較高,潘瑋柏的歌詞中第二人稱出現的比較多。相對而言,第三人稱在周杰倫的歌詞中出現的比率比較高。
我們可以推斷出什麼呢?王力宏是個自我意識比較強,善於表達自己的人;潘瑋柏擅長與別人溝通,會站在對方角度考慮;周杰倫則像是站在旁觀者的角度描述別人,有一種距離感(以上這是我的瞎扯)
「愛」你有多深?
在流行歌曲中,情歌的比重佔了絕大部分,所以「愛」一字出現的頻率比較高,我也對此做了一個統計。結果顯示,在王力宏的所有歌曲里,「愛」出現的頻率略高於其他三位男歌手,周杰倫的反而最低。這也可能和他的「旁觀者」角度也有關係。王力宏因為對「我」字用的比較頻繁,所以就經常表達自己的愛意,這麼一想也就解釋的通了。
四個人最喜歡的季節?
通過詞頻分析,周杰倫的歌詞中有關秋天的意象出現的最多,王力宏則比較喜歡冬天和春天,林俊傑對夏天的熱愛比較濃烈,潘瑋柏的歌詞中表現出的傾向性不大。
林俊傑和潘瑋柏歌詞中對季節描述相對較少
總結與展望
本次項目主要從數據分析的角度對四位華語男歌手的歌詞進行了探索,分析了歌詞的情感,找出了消極和積極的前十排行,也對幾個字詞進行了趣味性的探索。
這是我第一次接觸中文文本分析這塊內容,自然有很大的不足。一開始我是想自己寫情感分析模塊,但是因為如果自己寫的話會涉及到情感詞典,否定詞,程度詞權重等諸多問題,我在嘗試後得到的結果不盡如人意,又意外找到了一個快捷的工具,所以就放棄了自建情感分析。希望以後有機會可以自己再嘗試,應用機器學習的方式做出自己的文本分析模型。
感謝大家的留言,基本每條都看啦,並且根據大家的意見重新修改了一下內容。再次感謝大家對本文不足之處的指正。另外代碼都放在了我的github上,有需要自取(不過這次notebook寫的有點亂)。作為一個小白,希望和大家多多交流,相互學習!
推薦閱讀:
※由需求而產生的一款db導出excel的工具
※五步教你設計成功而有價值的數據可視化
※Python幾種分組計數方法比較
※數據化管理-商品採購
※談談流計算