天天看點

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

前幾天,文摘菌發現了一個Kaggle上的聖誕歌曲資料禮包。這裡有你能想到所有的聖誕歌曲,總計超過5萬首。而Kaggle上的資料科學家用各種方式要把它們玩兒壞了,一起看看有哪些有趣的結論!

又是聖誕節,有沒有被大街小巷的聖誕歌曲洗耳朵?有沒有想過這些聖誕歌曲到底有什麼魔力?他們的歌詞又有什麼共同點?

我們把所有跟聖誕有關的歌曲都打包起來,總計超過5萬首歌曲。在這篇文章裡,文摘菌将首先用樸素貝葉斯對這些歌曲文本進行全面分析,來快速識别出,到底什麼樣的歌曲才能被成為真正意義上的聖誕歌曲。

之後,我們還可以一起看看,kaggle上的資料科學家用這個資料包分析出了的這些有趣的結論:

與聖誕關系最密切的歌詞TOP20;

聖誕歌産量最高的歌手TOP20;

聖誕歌詞中,什麼樣的雙音節詞最受歡迎?

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

這個資料集取自55000多段歌詞,同時涵蓋了超過55000首歌曲。你能想到的全都有,包括Jinglebell :)如下:這是一個有55000多行和4列的資料框:

藝術家

歌曲

連結

文本

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

我們的目标是對歌曲文本進行全面分析,幫助我們快速識别出聖誕歌曲。為此,我們首先在資料框中添加一個額外的列,給每首歌曲一個“聖誕”或“非聖誕”的标簽,也就是歌詞中包含“Christmas”,“Xmas”或“X-mas”的歌曲将被标記為“聖誕”,不包含的則标成“非聖誕”。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

這還隻是标簽的初始化,我們之後會将樸素貝葉斯應用于一組訓練集以識别其他聖誕歌曲。但現在,我們将通過一些直覺的描述性方法來探索資料集。看看會得到一些什麼有趣的結果。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

探索初始的聖誕歌曲

清理 & 标記化

首先我們從資料清理和标記化開始~随後,聖誕歌曲将被選中并被儲存為一個變量。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

相關性分析

現在我們可以從不同的角度由相關性來分析原始的聖誕歌曲。接下來,我們運用networkD3 html widget将相關性可視化:具有相同總連接配接數的節點将被賦予相同的顔色,而邊的顔色意味着由兩個節點共享的公共鄰居的數量。而且,一個節點的大小表明它的中心性,中心性由中間性(即通過它的最短路徑的數量)定義。在兩個節點之間的距離是1的最小最大變換減去相關度,這是有意義的,因為直覺來說,相關性越高,兩個節點應該越近。而且,距離越短,邊緣越寬。

請注意,相關性永遠要基于歌詞才行

單詞之間的相關性

出現超過100次的單詞與至少另一個相關度大于0.55的單詞相關。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

歌曲之間的相關性

一首歌曲與其他至少3首相關的歌曲之間的相關性大于0.75-通過這個方法,我們可以檢測到類似或被略微修改的歌曲。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

特定的詞之間的相關性

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

藝術家之間的相關性

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

詞雲

原始聖誕歌曲的詞雲

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

樸素貝葉斯

樸素貝葉斯是一種流行的監督機器學習算法,它能處理具有大量特征的分類問題。它是基于一個類,這個類的特征是被假定獨立分布的,是以從這種意義上說,它是“樸素”的。在我們的例子中,我們想知道,給定一組特征之後,即文檔中單詞的tf-idf,一首歌曲是否應該被樸素貝葉斯分類為聖誕歌曲。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

構造最大似然估計的難點是先驗分布的選擇,即類的機率分布。通常假定它是按類頻率均勻分布或估計的。在我們的例子中,我們使用了先驗分布的多項式分布和均勻分布,這意味着我們在沒有進一步資訊的情況下對歌曲的分類是沒有偏見。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

我們識别出2965首隐藏的聖誕歌曲,在最初的500首聖誕歌曲中,有2首歌曲被樸素貝葉斯拒絕認定為聖誕歌曲。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

是以我們已經成功地識别出一些宗教聖誕歌曲,它們的标題通常不包含“Christmas”或“X-mas”單詞。

潛在狄利克雷分布&t統計随機鄰域嵌入

資料準備

隻有包括隐藏在内的聖誕歌曲的前300項特征,将被用來計算Rtsne和LDA,否則存儲空間會不足。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

LDA是潛在狄利克雷分布,2003年在Blei, Ng, Jordan的論文中被提出。這是一個生成語料庫的機率模型,其中的文檔被表示為關于潛在主題的随機混合物,一個單獨的文檔通常隻有幾個主題,被配置設定了不可忽視的機率。此外,每個主題的特點是單詞的分布,通常隻有一小部分詞被大機率配置設定給某個主題。變分期望最大化算法或吉布斯抽樣用于參數的統計推斷。

LDA需要固定數量的主題,也就是說,在應用該算法之前,應該先知道主題的數目。然而,有可能通過不同的性能度量來确定主題的最佳數量,比如Nikita,用ldatuning包。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

是以,我們将選擇8作為主題的最佳數量。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

我們可以使用tidytext包 來檢查每個文檔的主題分布,即對于每個文檔,它屬于從1到8某個主題的機率的總和等于1。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

同樣,我們也可以獲得每個主題詞的機率分布,即每個主題産生不同的單詞的機率總和等于1。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

每個主題的關鍵詞是:

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

t-SNE

由van der Maaten和Hinton于2008年開發,t-SNE代表統計随機鄰域嵌入,這是一種降維技術,用公式表示出捕獲的原始資料點的局部聚類結構。它是非線性的和不确定性的。

下面的計算大約需要30分鐘。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

如果我們重複以上過程在不隻一次疊代上呢?

到目前為止,我們隻運作了一次疊代的樸素貝葉斯。然而,我們可以為多個疊代重複這個過程,即訓練一個樸素貝葉斯分類器并重新标記所有的假陽性為隐藏聖誕/聖誕,所有的假陰性為隐藏非聖誕/非聖誕,一遍遍重複進行。

首先,我們再次準備資料以避免錯誤。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

運作10次疊代。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

然後,精度和f1得分開始時單調增長,然後收斂到大約0.95的值,這意味着沒有遺留很多待檢測的“隐藏聖誕歌曲”和“隐藏非聖誕歌曲”。然而,在這個過程中,我們始終相信樸素貝葉斯分類器是100%準确的,這實際上幾乎是不可能的。是以,在每一次疊代中,有一些歌曲被樸素貝葉斯錯誤地分類為“聖誕節”,在訓練集的下一個疊代中用于訓練樸素貝葉斯分類器。有了這個不斷累積的錯誤,我們可能會擔心,随着疊代次數的增加,結果實際上會更糟。

5萬餘首聖誕歌詞資料包+Kaggle資料科學家的腦洞=?(附資料包+代碼)

最後,我們大約有一半的歌曲被歸類為“聖誕節”,而另一半為“不是聖誕節”,這似乎是非常不可信的。這倒是引出了一個問題:是否存在一個最佳的疊代次數?我們不能簡單地手動控制這57650首歌是否被正确分類。是以這仍然是一個有待回答的開放式問題!

還有哪些有趣的結論

之後,我們用這些資料,還分析出了以下這些有趣的結論,基于篇幅的原因,我們直接貼出kaggle上的一些有趣結論,不再在微信推文中po出實作代碼,想親手嘗試的同學,請拉到文末檢視kaggle上的代碼和資料傳送門~

原文釋出時間為:2017-12-25

本文作者:文摘菌

上一篇: 【mel】

繼續閱讀