當前位置:
首頁 > 知識 > 手把手教你用 R 語言分析歌詞

手把手教你用 R 語言分析歌詞

本文為雷鋒字幕組編譯的技術博客,原標題 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 眼鏡可能會更有意義!

目標

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

問題

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

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

數據

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

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

導入類庫

讀取數據

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

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

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

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

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

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

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

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

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

數據調整

基本的清理

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

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

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

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

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

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

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

加入一些新的項

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

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

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

描述性的統計

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

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

歌曲統計

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

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

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

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

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

洞見

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

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

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

第一的歌曲

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

文本挖掘

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

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

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

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

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

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

整潔文本的格式

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

數據格式和標記化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

辭彙頻率

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

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

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

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

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

辭彙榜首

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

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

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

詞雲

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

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

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

流行辭彙

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

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

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

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

永不過時的辭彙

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

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

辭彙長度

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

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

辭彙多樣性

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

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

辭彙密度

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

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

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

你可以觀察到過去幾年間,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() 運行公式並且建立新的列。

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

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

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

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

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

總結

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

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

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

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

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

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

更多文章,關注 AI 研習社,添加雷鋒字幕組微信號(leiphonefansub)為好友

備註「我要加入」,To be an AI Volunteer !

【限時拼團】

NLP 工程師入門實踐班

三大模塊,五大應用,知識點全覆蓋;

海外博士講師,豐富項目分享經驗;

理論 + 實踐,帶你實戰典型行業應用;

專業答疑社群,結交志同道合夥伴。

新人福利

關注 AI 研習社(okweiwu),回復1領取

【超過 1000G 神經網路 / AI / 大數據,教程,論文】

一文詳解如何用 R 語言繪製熱圖


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

從星際2深度學習環境到神經機器翻譯,上手機器學習這些開源項目必不可少
Github 「stars」 平均 3558,最棒的 30 個機器學習實例

TAG:AI研習社 |