手把手教你用R語言分析歌詞(附代碼)

 2018-03-23 17:07:00.0

本文原標題為Lyric Analysis with NLP & Machine Learning with R,作者爲Debbie Liske。

翻譯 | 劉朋  Noddleslee  程思婕  餘杭     整理 |  凡江

基於R語言對Prince的音樂的歌詞研究:用文本挖掘和探索性數據分析(EDA)來了解這位藝術家的生涯。

這是由三部分組成的系列輔導教程的第一部分,在這個系列裏,你將會使用R語言對傳奇藝術家Prince的歌詞通過各種分析任務進行實例研究。這三個教程覆蓋以下內容。

  • 第一部分:文本挖掘和探索性數據分析

  • 第二部分:情感分析和自然語言處理的主題模型

  • 第三部分:基於機器學習的預測分析

介紹

音樂的歌詞經常會代表着一個藝術家的觀點,但是流行歌曲揭示的是社會大衆所想聽到的東西。歌詞分析不是一件容易的工作,因爲它的結構通常和散文有着很大的區別,它需要謹慎的假設和特定的分析技巧選擇。音樂的歌詞滲透到我們的生活以及無所不在地細微地影響着我們的思想。預測性歌詞的概念正在興起,同時作爲研究論文和畢業論文的主題變得越來越流行。這個案例分析會涉及這個新興學科的幾個部分而已。

Prince: 藝術家

爲了慶祝Prince留下的令人激動的和多樣化的作品,你將在他的歌詞中探索偶爾清晰卻時常隱晦的信息。然而,你不必喜歡Prince的音樂進而欣賞他對全球對許多流派發展的影響。《滾石》雜誌將Prince列爲一直以來的第18位最優秀的作曲家,僅次於鮑勃·迪倫(Bob Dylan)、約翰·列儂(John Lennon)、保羅·西蒙(Paul Simon)、喬尼·米歇爾(Joni Mitchell)和史提夫·旺德 (Stevie Wonder)等人。隨着預測「熱門歌曲」接近現實的可能性,歌詞分析正在慢慢地進入數據科學界。

「Prince 是一個着魔於音樂的人 – 一個狂野的多產作曲家,也是吉他,鍵盤和鼓的演奏家,同時也是驟停打擊樂,搖滾,R&B和流行音樂的大師。雖然他的音樂和大衆流派背道而馳。」 – 喬治.帕雷萊斯(紐約時報)

在本教程中,該系列的第一部分,你將會使用整潔文本框架在一組歌詞上使用文本挖掘技術。整潔數據集有一種特定的結構,其中每個變量是一列,每個觀察是一行,每個觀察單元是一個表。在清理和調整數據集之後,在觀察Prince歌詞的不同方面的同時,你將會創建描述性的統計和探索性的可視化。

前提

本系列的第一部分需要有着對整潔數據的基本理解 – 特別是像用於數據轉換的dplyr,可視化的ggplot2 以及來自於magrittr管道操作的%>% 等幾個包。每個教程會描述你可以用於分析的工具,但是並不是每一步的細節。你將會注意到一些步驟是通常結合使用%>%操作符。由於這是一個案例學習,重要的是記住你所做的推論都只是觀察性的;因此,相關性並不意味着因果關係。

提示:關於你使用的工具的背景,Garrett Grolemund 和 Hadley Wickham的《基於R語言的數據科學》,和Julia Silge 和 David Robinson的《基於R語言的文本挖掘》是兩個很好的資源。

第2和第3部分

在其中一個教程中,第二部分,你將會了解涵蓋情感分析和主題模型來捕捉Prince的音樂中的所有情緒和主題以及它們在社會方面的應用。你將會使用一個情感詞彙,評估二元的和分類的情緒,畫出隨着時間的發展趨勢,查看n-grams模型和單詞的關聯。你還將使用自然語言處理和聚類技術,比如潛在狄利克雷分配(DLA)和 K近鄰,對歌詞中的主題進行梳理。

在另一個教程中,第三部分,你將會使用你的探索性結果來預測一首歌曲的發佈時間,更有趣的是,預測一首歌是否會基於它的歌詞登入Billboard 排行榜。你將會使用機器學習工具,比如決策樹(rPart和C50),K近鄰(class)和樸素貝葉斯(e1071)來產生可接受文本的分類器。

所有這三部分都將會使用相同的數據集,即Prince的歌詞,發佈年份,BillBoard位置。 這次研究的技術也可以應用於其他類型的文本。事實上,標準散文的結果更容易解釋,因爲歌詞一般常常是用間接的信息和細微的差別來設計的。

總之,歌詞分析有很多方法。這些教程覆蓋了下面圖表中高亮紅色的部分。注意的是這個圖表是一個非常模糊的圖片的簡單的高級表示,並不代表圖片本身。事實上,建模和機器學習的很多方面都是模糊的,並不一定適合下面展示的單一框。所以,在看圖片時帶上3D眼鏡可能會更有意義!

手把手教你用R語言分析歌詞(附代碼)

目標

除了學習和實踐新技能,這個教程旨在闡述歌詞分析概念的基本問題。最近的研究表明「歌詞智力」在流行音樂中正在走下坡路。一些研究甚至表明在排名第一的熱門歌曲中,使用的詞彙與美國三年級學生的閱讀水平是一致的。是否可以使用文本挖掘、自然語言處理、機器學習或其他的數據科學方法來對這樣的主題進行深入瞭解? 是否可以根據一首歌曲的被接受程度來確定對社會具有吸引力的主題? 是否可以預測是否一首歌曲會做的很好僅僅依賴於歌詞分析? 在第一個教程中,作爲探索性的練習,你將會檢查Prince音樂的歌詞複雜程度。

問題

在深入之前,思考一下你正在試圖發現什麼,還有感興趣的問題是什麼。首先你將會對數據集進行分析,它看起來什麼樣子的?有多少歌曲?歌詞是什麼樣的結構? 需要做多少清理和爭論?事實是什麼?頻率這個詞是什麼以及它爲什麼重要?從技術的角度,你想要理解併爲情感分析、自然語言處理以及機器學習模型準備數據。

「音樂一直以來都是一個和大衆交流的有效方式,歌詞在這其中扮演着重要的角色。然而,對歌詞在社會福祉中扮演的角色的研究機會卻被大大的低估了 --帕特里夏·福克斯·蘭瑟姆」

數據

爲文本挖掘獲得數據的流行辦法是使用rvest包來從網上搜取內容。我能夠從不同的網站上搜取BillBoard信息和Prince歌詞,並把他們加入到歌曲的標題中。因爲不一致的標題命名約定,導致了一些爭論。然後我做了一個主觀的決定,去除了不是原版的所有歌曲,即混音,擴展版本,俱樂部混音,重製等等。爲了避免重複,我還刪除了收錄了他熱門歌曲的歷史合集的專輯。我做了一些小清理,並保存結果爲可以用於本教程的csv文件。

由於第一部分專注於文本挖掘,我沒有在這裏提供代碼,但是如果你願意的話,數據集是可以在這裏下載。

導入類庫

手把手教你用R語言分析歌詞(附代碼)

讀取數據

從csv文件中有幾種方式讀入數據,我傾向於使用read.csv()加載數據框架,即歌詞、發佈年份、Billboard排名位置。需要注意的是,默認情況下,R語言把所有的字符串轉換成因子。這可能會導致下游問題,但是你可以通過設置stringAsFactor參數爲FALSE來解決這個問題。

手把手教你用R語言分析歌詞(附代碼)

你可以使用names()函數來看數據框架中的列。

手把手教你用R語言分析歌詞(附代碼)

因爲我創建了這個文件,我知道X是行數,text是實際的歌詞。其他必需的項包括song, year, peak(代表它在Billboard中的位置), US Pop 和 US R.B 代表着在美國(流行音樂和R&B排名)峯值圖位置,所以保存好這些,刪去其他的項。

使用原始的數據集來做這件事 prince_orig,然後使用%>%管道操作傳入select()。這樣的方式你能夠從左到右的讀取代碼。

另外,注意的是,select()允許你一次重新命名所有的列。因此將文本設置成歌詞然後用_代替.重命名US列項。然後存儲爲Prince,之後再整個教程中你都將會用到。Dplyr提供了一個函數叫glimpse()會使你在轉置視圖中更容易地查看數據。

手把手教你用R語言分析歌詞(附代碼)

第一個顯而易見的問題是有多少個觀察和列項?

手把手教你用R語言分析歌詞(附代碼)

使用dim()函數,你將看到結果是7個列項和824個觀察,每個觀察都是一首歌。如我所說。多產啊!

請看其中一首歌的lyrics項,你可以瞭解一下它們的結構。

手把手教你用R語言分析歌詞(附代碼)

這裏有很多機會來清理它們,讓我們開始吧。

數據調整

基本的清理

有很多不同的方法使你來清理數據。其中一個選擇是使用tm文本挖掘包把數據框架轉換成語料庫和文本術語表,然後使用tm_map()函數做清理。但是本教程目前將專注基礎,使用gsub和apply()函數來做髒工作。

首先,通過使用gsub()創建一個小函數來處理大部分場景以避免那些煩人的收縮,然後再所有歌詞上應用該函數。

手把手教你用R語言分析歌詞(附代碼)

你還將注意到特殊字符弄髒了文本。你可以用gsub()函數和簡單的正則化表達式來去除它們。 請注意,在這步驟之前,擴充收縮是非常重要的!

手把手教你用R語言分析歌詞(附代碼)

爲了一致性,使用tolower()函數來把所有的內容都轉換成小寫格式。

手把手教你用R語言分析歌詞(附代碼)

檢查歌詞,現在它們展示了原始文本之上一個很好的、更簡潔的版本。

手把手教你用R語言分析歌詞(附代碼)

在文本挖掘中調整數據的另一個普遍的步驟是詞幹,或者叫拆分單詞爲它們的詞根含義。這是可以在以後討論的話題,現在,看一下Prince的數據框架。

手把手教你用R語言分析歌詞(附代碼)

如你看到的,有37年的歌曲,而排名最低的歌曲是在88的位置。你也可以看到對於year和peak項有很多NAs。因爲你將要做不同類型的分析,在Prince數據框架中保留完整的數據集,僅在需要的時候進行篩選。

加入一些新的項

因爲你的一個目標問題是尋找跨越時間的歌曲趨勢,並且數據集包含着個人發行年份,你可以創建存儲桶來以十年劃分年份。使用dplyr的mutate()函數來創建新的decade項。創建存儲桶的一個辦法是採用ifelse()和%in%操作符來根據年份過濾歌曲轉換成十年。然後存儲結果到Prince(實際是增加了一個新的項)

你可以對chart_level做同樣的事,它代表着一首歌是否進入了前10名,前100名或者沒有上榜。它們是互相排斥的,所以前100並不包含前10。

手把手教你用R語言分析歌詞(附代碼)

另外,創建一個叫做charted的二值項表明一首歌是否入圍Billboard榜單。使用write.csv()來保存爲了以後的教程中使用。

手把手教你用R語言分析歌詞(附代碼)

描述性的統計

爲了個性化圖表,我喜歡創建一個唯一的顏色列來保持視覺的一致性。Web上有很多可以通過下面所展示的十六進制碼來獲得不同的顏色的地方。如果你有對於圖表有這樣的喜好,你也可以在需要的時候通過使用ggplot()創建自己的主題。

手把手教你用R語言分析歌詞(附代碼)

在開始進行文本挖掘之前,先從基本的角度看看你的數據在歌曲級別的位置。現在是一個很好的時機來了解一下Prince每十年發行的數量。提醒一下,他於1978年開始自己的職業生涯並一直持續到2015年(在上面總結的數據中可見)。但是因爲我們現在關注的是趨勢,而且數據集上在year項有很多空白值,你將想要在第一張圖表中過濾掉所有的發行年爲NAs的數據。

歌曲統計

通過使用dplyr的filter(),group_by()以及summarise()函數,你能夠按照decade來分組,然後計算出歌曲的數量。函數n()是多個聚合函數之一,也是對於在分組數據上使用summarise()有用的。然後使用ggplot()和geom_bar()創建條形圖然後將分類填充到條形圖中。

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

這清楚地展示了20世紀90年代是他最活躍的十年。

現在創建一個類似的圖表叫chart_level。

記得對decade和chart_level使用group_by()函數,你將會看到趨勢。

在這個圖表中,你僅需要看一下表上的歌曲,使用peak > 0來過濾掉其他的東西。將group_by對象導入到summarise()然後使用n()來統計歌曲的數量。當你把它存到一個變量中便可以導入到ggplot()來繪製一個簡單的條形圖。

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

洞見

注意到所有Prince的上排行表的歌曲,大部分都是前10名。但是更有趣的是在他創作新歌最多產的十年是90年代,但是更多上排行表的是在80年代。爲什麼會發生這樣的事兒?請在看文本挖掘部分的時候記住這個問題。

爲了使用完整數據集來分析歌詞,你可以刪除參考圖表級別和發佈年份來獲得更大量的歌曲去挖掘。

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

如你看到的,Prince寫過成百上千首在數據中沒有發佈日期的歌曲。對於情感分析和探索性分析來說,你可以使用所有的數據,但是對於隨時間的變化趨勢,你僅有一個更小的處理集合。這沒問題,僅僅知道就好了。

第一的歌曲

對於那些Prince狂熱的粉絲來說,下面是一個快速瀏覽排行榜第一的歌曲(請注意,你可以用來自於knitr包的kable() 和來自於kableExtra包的kable_styling()以及來自於formattable包的color_tile()來創建一個更規範的HTML輸出)

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

文本挖掘

文本挖掘也可以被認爲文本分析。目標是發掘可能未知的或者被隱藏在字面意思之下的相關信息。自然語言處理是一種用於挖掘文本的方法。它試圖通過標記、聚類、提取實體和單詞關係來解釋書面語言的模糊性,並使用算法來明確主題和量化主觀信息。首先你將打破詞彙複雜性的概念。

詞彙複雜性在不同上下文環境中可能意味着不同東西,但是現在,假設它可以被這些測量的組合所描述。

  • 單詞頻率:每首歌單詞的數量

  • 單詞長度:文本中每個單詞的平均長度

  • 詞彙多樣性:在文本中不單詞的數量(歌曲詞彙)

  • 詞彙密度:不同單詞的數量除以所有單詞總數(字詞重疊)

整潔文本的格式

分析之前,你需要把歌詞分解爲一個個單詞,然後開始深入挖掘。這個過程叫做標記化。

數據格式和標記化

請記住有不同的方法和數據格式可以用做文本挖掘。

語料庫:用tm文本挖掘包來創建的文檔的集合

文檔-詞矩陣:一個列出在語料庫出現的所有單詞的矩陣,其中文檔是行,單詞是列。

整潔文本:每行都有一個令牌的表。在本例中,令牌即一個單詞(或者是在第二部分討論的n-gram)。標記化是一個將歌詞拆分爲令牌的過程。本教程將用tidytext的unnest_tokens()函數來完成。詳細信息,請查閱tidytext文檔。

但是在你開始令牌化任何東西之前,清理數據還有一個步驟。很多歌詞在轉錄的時候會包括像「重複合唱」或者「橋牌」「詩歌」等這樣的標籤。還有很多不希望的單詞會弄髒結果。有了之前的分析,我選擇一些可以擺脫的方法。

下面是需要手動刪除的多餘單詞的列表。

手把手教你用R語言分析歌詞(附代碼)

要取消標記,使用己加載的tidytext類庫。你可以開始利用dplyr的強大功能同時一起加入幾個步驟。

在文本整潔框架中,你既需要將文本分解成單獨的標記又需要把文本轉換成一個整潔的數據結構。使用tidytext的unnest_tokens()函數來做這個。Unnest_token() 需要至少兩個參數:列輸出名將被在文檔取消後創建(本例中的word), 列輸入保存當前文本(歌詞)

你可以使用prince數據集,並導入unnest_tokens()函數,然後刪除停止單詞。停止單詞是什麼?你很瞭解它們。它們是對結果沒有增加任何意義的很普通的單詞。有不同的列表可供選擇,但是你可以使用tidytext包的stop_words函數。

使用sample()展示一個這些停止單詞的隨機列表,使用head()限制在15個單詞。

手把手教你用R語言分析歌詞(附代碼)

因此,在你將歌詞標記爲單詞之後,使用dplyr的anti_join()函數刪除停止單詞。接下來,使用dplyr的filter()函數和%in%操作符來刪除之前定義的不想要的單詞。然後使用distinct()來去掉重複的單詞。最後,你可以刪除所有少於4個字符的單詞。這是另一個主觀決定,但是在歌詞中,很多感嘆詞比如「是,嘿」,然後把結果存到prince_words_filtered。

注意:爲了之後的參考,prince_words_filtered 是Prince數據的整潔文本版本: 沒有了停止單詞,沒有不想要的單詞,沒有1-3個字符的單詞。你會在一部分而並不是所有的分析中使用它們。

手把手教你用R語言分析歌詞(附代碼)

注意的是stop_words有一個word列,有一個叫做word的新列是被unnest_tokens()函數所創建的,所以anti_join()自動加入到word列

你可以檢查你的新的整潔數據的結構的類別和維度。

手把手教你用R語言分析歌詞(附代碼)

Prince_words_filtered是一個有着36916個單詞(不是唯一的單詞)和10個列的數據。這有一個快照(我只選擇一個單詞,並將它限制在10首歌之中然後使用select()按順序打印感興趣項,再次使用knitr來格式化)。這裏向你展示了標記化,未總結的,整潔的數據結構。

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

你能看到每行包含各自的能夠在每首歌中重複出現的單詞。

詞彙頻率

音樂中的個性化詞頻佔有非常重要的一席之地,無論是常見詞彙還是罕見詞彙。這兩方面都會影響整首歌的流行度。流行歌曲的作者都想知道的一個問題是詞頻和打榜歌曲是否有關聯性。所以現在你需要利用簡潔的數據做更深一步的探究,以得到每首歌的詞彙統計。

爲了測試Prince歌詞的格式,可以根據歌曲名稱和公告牌是否上榜分組,建立直方圖來展示詞頻的分佈。利用源Prince歌詞得到一個真實的詞頻計數。再一次利用 group_by() 和summarise()函數計數。隨後使用dplyr 和 arrange()排序。首先,看一下詞頻最高的歌曲,再使用ggplot()的直方圖展示。

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

注意到上圖是右偏的。考慮到歌詞轉錄的性質,我懷疑是歌詞輸入的錯誤。所以,出自好奇,我觀察打榜前十名且超過800個單詞的歌曲。

手把手教你用R語言分析歌詞(附代碼)

我做了一點研究後發現這首歌曲有一段嘉賓表演的說唱。這就說得通了!記住,這份數據包含流行歌曲和R&B全球榜單,所以歌曲類型和地理因素可以影響你的假設。注意到這首歌曲在美國流行音樂榜的排名要遠低於其它國家,比如在加拿大榜單其位列第五名。在心裏記住這件事。

挑戰:如果你想要親自動手進行音樂分析,你可能需要查看The Million Song Dataset,它擁有超過50000名錶演者的50個特徵(例如:節奏,響度,舞蹈表現力等等)。將音樂特徵融入到歌詞有利於做非常全面的分析。

詞彙榜首

爲了粗略估計全部歌詞集中最頻繁使用的詞彙,你可以在你乾淨的、過濾過的數據集使用count() 和 top_n()兩個函數,得到前n名頻繁使用的詞彙。

然後根據計數結果,利用reorder()函數對詞彙再度排名,使用dplyr的 mutate()函數生成有序的word變量。這方便使用ggplot()進行更友好的展示。

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

在最爲流行的音樂中,愛是最爲常見的主題。僅憑藉這些最常用的詞彙我不會做任何假設,但是你可以從中窺探藝術家的洞察力,當然不是全貌。在移步進行更深層次的調查之前,花一些時間獲得一些視覺上的享受吧!

詞雲

詞雲在很多人中受到負面評價,如果你不謹慎地使用詞雲,那麼在某些時候他們就會超出文本框。然而從本質上來說,我們都是視覺動物,能夠以洞察力從這些可視化圖中獲得真正有意義的信息。看一些Sandy McKe的實例,並謹慎地使用詞雲圖。

但是現在,使用一個新的、名爲wordcloud2的包做一些酷的事情。這個包提供關於詞雲生成HTML控件的創造性的集合。你可以圍繞一個單詞觀察其在文本的頻率。(這個包在rMarkdown平臺上面更新速率非常緩慢,並且對使用的瀏覽器有非常多的限制條件。希望它會有所提升。)

手把手教你用R語言分析歌詞(附代碼)

想獲得更多樂趣的話,你可以加入一點數據美感。

手把手教你用R語言分析歌詞(附代碼)

流行詞彙

截至目前我們已經觀察所有歌曲中的流行詞彙。如果你根據打榜名次分組後會發生什麼?在上榜歌曲和未上榜歌曲中是否存在更流行的詞彙?這些被認爲是社會中流行的詞彙。

注意到下圖代碼中使用slice(seq_len(n))的作用是爲了獲得chart_level不同類別的前幾名。它的作用和top_n()是不同的,並且如果你在圖形中使用刻面的話,這是更加方便的選擇。(需要謹記這類技巧有不同方法)你可以使用row_number() 函數來確保在圖形中你可以按照正確順序呈現單詞)。ggplot()默認設置是按照字母排序,並且實際操作中排序要優先於畫圖。

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

你現在從上面得到的見解是什麼?

好吧,不同打榜歌曲中流行詞彙是如此接近。這對於我們想通過歌詞來預測一首歌是否成功打榜不是件好事。但是你僅僅瞭解到文本挖掘,自然語言和預測模型中的皮毛知識。

永不過時的詞彙

音樂中一些詞彙是永不過時的。永不過時的詞彙超越了時間,能夠吸引一大批聽衆。如果你按照每十年劃分你的數據,這些詞彙會上榜。使用過濾,分組和聚合獲得Prince歌詞每十年的流行詞彙,觀察什麼詞彙屬於永不過時的,哪些是一閃即逝的。你可以使用ggplot() 中的 facet_wrap()繪製每十年的數據。

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

顯而易見:愛,時間和女孩是歷久彌新的詞彙。但是識別流行詞彙到底多容易呢?一個世紀就會輪換流行詞彙是否爲事實?能否簡單認爲上述的詞彙在歌曲中是高度重複的呢?詞頻是否是識別歌曲主題的依據呢?這種分析歌詞的方法是否適用於其它文本挖掘的任務呢,例如分析州政府的演講?

詞彙長度

對歌曲作者來說,詞彙長度是一個有趣的話題。詞彙越長,越難押韻和形成一種模式。下面的詞彙長度的直方圖展示正如你所期待的,僅有少數詞彙的長度是非常長的。

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

這些瘋狂的長詞彙是哪些呢?我想這需要一個非常有趣的詞雲圖!這是基於詞的長度而非詞頻。顯示如下:

手把手教你用R語言分析歌詞(附代碼)

詞彙多樣性

一個文本包含的詞彙越多,其詞彙多樣性就越高。宋的詞彙表呈現的是一首歌曲中有多少獨特的詞彙。可以用一個簡單的圖顯示過去平均一首歌中有多少詞彙是獨一無二的。

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

這說明什麼呢?過去的數十年間,Prince的歌詞多樣性具有一點輕微向上的趨勢。這和打榜成功有多少相關呢?很難說,畫出密度圖和打榜歷史再做更近一步的分析吧!

詞彙密度

回憶本教程,詞彙多樣性等於獨特詞彙除以文章詞彙的長度。這是詞彙重複性的一個指標,詞彙重複是歌曲作者的一個關鍵工具。詞彙密度提升,重複性降低。(注意:這不同於順序重複,那是歌曲作者的另一個技巧)

觀察過去幾年間Prince的詞彙密度。考慮密度的話,最好保留所有詞,包括停詞。所以從原始的數據集和未經過濾的詞彙開始。根據歌曲和年份分組,用n_distinct() 和 n()計算密度,把結果用 geom_smooth()傳給ggplot() 。此外用stat_smooth()的lm模型做一個線性平滑模型。

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

爲比較趨勢,可以可視化打榜歷史數據(例如:打榜成功的歌曲)和比較其多樣性和密度。使用gridExtra的grid.arrange()函數並排地繪圖。

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

你可以觀察到過去幾年間,Prince的詞彙多樣性和密度呈輕微上升趨勢。怎樣比較這個趨勢和所有流行歌曲的關係呢?有研究顯示打榜歌曲的詞彙多樣性和密度呈下降趨勢,暗示重複性有所提升(例如:詞彙更多,說得更少)。這個趨勢和Prince的歌曲不同。另一個研究證明所有流行歌曲,多樣性(獨特詞彙)在過去年間呈現上升趨勢,這和Prince歌曲正相關。這可能是因爲過去榜單排名試圖豐富類型多樣性。類型是數據的關鍵部分,但是這個變量在我們的數據集並不存在。這是否是因爲榜單歷史對流行歌曲的影響力日益衰微,對R&B/Rap的影響力日益加深?

挑戰:我希望你能考慮這些結果,甚至鼓勵你尋找不同數據集,並且自己動手練習。記住:相關性不同於因果關係。

TF-IDF

目前爲止在整個數據集中使用的方法並沒有強調如何量化文檔中不同詞彙在整個文檔集中的重要性。你已經查看詞頻,並且移除停詞,但這可能還不是最複雜的方法。

進入TF-IDF。TF代表詞頻。IDF代表逆向文件頻率,它賦予經常使用的詞彙低權重,同時給文本中罕見詞彙更多權重。當你聯合TF和IDF時,一個詞彙的重要性調整爲它在使用過程中的罕見程度。TF-IDF背後的假設是文本中更頻繁使用的詞彙應賦予更高的權重,除非它出現在很多文檔中。公式總結如下:

• 詞頻(TF):一個單詞在文檔中出現次數

• 文件頻率(DF):包含單詞的文檔數量

• 逆向文件頻率 (IDF) =1/DF

• TF-IDF = TF * IDF

因此對於在集合中僅見於少數文檔的任何單詞,IDF是非常高的。你可以通過tidytext中的 bind_tf_idf() 函數來使用這個方法,以便檢查每個打榜名次分類中最重要的詞彙。這個函數用TF*IDF的乘積來計算和聯合TF與IDF。它用經過過濾的數據集作爲輸入,每一行是一篇文件(歌曲)中的一個表示(詞彙)。你會在新的一列看到結果。

所以,利用你原始的Prince的數據框和經過過濾的標記詞,並且消除不受歡迎的詞彙,但是保留停詞。然後使用bind_tf_idf()運行公式並且建立新的列。

手把手教你用R語言分析歌詞(附代碼)

現在如你所見,對於最最常見的單詞,IDF and TF-IDF都是0.(更科學地說,IDF的表現形式是自然對數 ln(1),所以那些詞彙的IDF 以及 TF-IDF的值是0.)把你的結果作爲參數傳遞給arrange()  然後以降序的方式展示tf-idf。通過增加這些步驟,你會以一種不同的視角觀察Prince的歌詞。

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

使用TF-IDF爲觀察潛在的重要詞彙提供一種不同的視角。當然,解釋是完全主觀性的。注意到其中的模式了嗎?

接下來,觀察隨時間變化的TF-IDF。

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

現在你看待這個問題已經有了更深層次的見解。‘永不過時’的詞彙不再流行。僅僅利用每組一些詞彙就能觀察到新出現的主題是否可行呢?你將會在第二個教程學習這方面的知識以達到新的高度(第二部分:自然語言處理的情感分析和主題模型)

這個方法的詞雲圖以全新的視角顯Prince中的歌詞的重要詞彙,事情變的越來越有趣。

手把手教你用R語言分析歌詞(附代碼)

手把手教你用R語言分析歌詞(附代碼)

總結

在這個案例中,首先你以最基礎的角度快速觀察真實數據。然後進行一些處理:例如數據清洗和刪除不提供信息的詞彙,並開始歌曲的探索分析。

接下來,你通過把歌詞轉換詞的表示以便於觀察歌詞複雜性的方法,更加深入地鑽研文本挖掘。分析結果爲接下來的情感分析和主題建模提供關鍵視角。

最後,你通過TF-IDF分析得到在文本中詞彙背後的信息,並收穫一些有趣的結論。你或許認爲這是一個識別音樂主題的好方法,但此時你僅僅只是一知半解。第二部分強調運用無監督的LDA方法。在數據科學的各個層面,有很多方法可以獲得內在的見解。在此案例的第二部分和第三部分,你將會學習到更多觀點

希望你和我一樣迫不及待想繼續接下來的探索分析旅程:情感分析,話題建模和預測見解。

謝謝你的閱讀,期待接下來教程能繼續同行。

博客原址 https://www.datacamp.com/community/tutorials/R-nlp-machine-learning



文章來源:雷鋒網