0
本文作者: AI研習(xí)社-譯站 | 2018-03-23 17:07 |
雷鋒網(wǎng)按:本文為雷鋒字幕組編譯的技術(shù)博客,原標(biāo)題Lyric Analysis with NLP & Machine Learning with R,作者為Debbie Liske。
翻譯 | 劉朋 Noddleslee 程思婕 余杭 整理 | 凡江
基于R語言對Prince的音樂的歌詞研究:用文本挖掘和探索性數(shù)據(jù)分析(EDA)來了解這位藝術(shù)家的生涯。
這是由三部分組成的系列輔導(dǎo)教程的第一部分,在這個系列里,你將會使用R語言對傳奇藝術(shù)家Prince的歌詞通過各種分析任務(wù)進(jìn)行實例研究。這三個教程覆蓋以下內(nèi)容。
第一部分:文本挖掘和探索性數(shù)據(jù)分析
第二部分:情感分析和自然語言處理的主題模型
第三部分:基于機(jī)器學(xué)習(xí)的預(yù)測分析
介紹
音樂的歌詞經(jīng)常會代表著一個藝術(shù)家的觀點(diǎn),但是流行歌曲揭示的是社會大眾所想聽到的東西。歌詞分析不是一件容易的工作,因為它的結(jié)構(gòu)通常和散文有著很大的區(qū)別,它需要謹(jǐn)慎的假設(shè)和特定的分析技巧選擇。音樂的歌詞滲透到我們的生活以及無所不在地細(xì)微地影響著我們的思想。預(yù)測性歌詞的概念正在興起,同時作為研究論文和畢業(yè)論文的主題變得越來越流行。這個案例分析會涉及這個新興學(xué)科的幾個部分而已。
Prince: 藝術(shù)家
為了慶祝Prince留下的令人激動的和多樣化的作品,你將在他的歌詞中探索偶爾清晰卻時常隱晦的信息。然而,你不必喜歡Prince的音樂進(jìn)而欣賞他對全球?qū)υS多流派發(fā)展的影響?!稘L石》雜志將Prince列為一直以來的第18位最優(yōu)秀的作曲家,僅次于鮑勃·迪倫(Bob Dylan)、約翰·列儂(John Lennon)、保羅·西蒙(Paul Simon)、喬尼·米歇爾(Joni Mitchell)和史提夫·旺德 (Stevie Wonder)等人。隨著預(yù)測“熱門歌曲”接近現(xiàn)實的可能性,歌詞分析正在慢慢地進(jìn)入數(shù)據(jù)科學(xué)界。
“Prince 是一個著魔于音樂的人 – 一個狂野的多產(chǎn)作曲家,也是吉他,鍵盤和鼓的演奏家,同時也是驟停打擊樂,搖滾,R&B和流行音樂的大師。雖然他的音樂和大眾流派背道而馳。” – 喬治.帕雷萊斯(紐約時報)
在本教程中,該系列的第一部分,你將會使用整潔文本框架在一組歌詞上使用文本挖掘技術(shù)。整潔數(shù)據(jù)集有一種特定的結(jié)構(gòu),其中每個變量是一列,每個觀察是一行,每個觀察單元是一個表。在清理和調(diào)整數(shù)據(jù)集之后,在觀察Prince歌詞的不同方面的同時,你將會創(chuàng)建描述性的統(tǒng)計和探索性的可視化。
前提
本系列的第一部分需要有著對整潔數(shù)據(jù)的基本理解 – 特別是像用于數(shù)據(jù)轉(zhuǎn)換的dplyr,可視化的ggplot2 以及來自于magrittr管道操作的%>% 等幾個包。每個教程會描述你可以用于分析的工具,但是并不是每一步的細(xì)節(jié)。你將會注意到一些步驟是通常結(jié)合使用%>%操作符。由于這是一個案例學(xué)習(xí),重要的是記住你所做的推論都只是觀察性的;因此,相關(guān)性并不意味著因果關(guān)系。
提示:關(guān)于你使用的工具的背景,Garrett Grolemund 和 Hadley Wickham的《基于R語言的數(shù)據(jù)科學(xué)》,和Julia Silge 和 David Robinson的《基于R語言的文本挖掘》是兩個很好的資源。
第2和第3部分
在其中一個教程中,第二部分,你將會了解涵蓋情感分析和主題模型來捕捉Prince的音樂中的所有情緒和主題以及它們在社會方面的應(yīng)用。你將會使用一個情感詞匯,評估二元的和分類的情緒,畫出隨著時間的發(fā)展趨勢,查看n-grams模型和單詞的關(guān)聯(lián)。你還將使用自然語言處理和聚類技術(shù),比如潛在狄利克雷分配(DLA)和 K近鄰,對歌詞中的主題進(jìn)行梳理。
在另一個教程中,第三部分,你將會使用你的探索性結(jié)果來預(yù)測一首歌曲的發(fā)布時間,更有趣的是,預(yù)測一首歌是否會基于它的歌詞登入Billboard 排行榜。你將會使用機(jī)器學(xué)習(xí)工具,比如決策樹(rPart和C50),K近鄰(class)和樸素貝葉斯(e1071)來產(chǎn)生可接受文本的分類器。
所有這三部分都將會使用相同的數(shù)據(jù)集,即Prince的歌詞,發(fā)布年份,BillBoard位置。 這次研究的技術(shù)也可以應(yīng)用于其他類型的文本。事實上,標(biāo)準(zhǔn)散文的結(jié)果更容易解釋,因為歌詞一般常常是用間接的信息和細(xì)微的差別來設(shè)計的。
總之,歌詞分析有很多方法。這些教程覆蓋了下面圖表中高亮紅色的部分。注意的是這個圖表是一個非常模糊的圖片的簡單的高級表示,并不代表圖片本身。事實上,建模和機(jī)器學(xué)習(xí)的很多方面都是模糊的,并不一定適合下面展示的單一框。所以,在看圖片時帶上3D眼鏡可能會更有意義!
目標(biāo)
除了學(xué)習(xí)和實踐新技能,這個教程旨在闡述歌詞分析概念的基本問題。最近的研究表明“歌詞智力”在流行音樂中正在走下坡路。一些研究甚至表明在排名第一的熱門歌曲中,使用的詞匯與美國三年級學(xué)生的閱讀水平是一致的。是否可以使用文本挖掘、自然語言處理、機(jī)器學(xué)習(xí)或其他的數(shù)據(jù)科學(xué)方法來對這樣的主題進(jìn)行深入了解? 是否可以根據(jù)一首歌曲的被接受程度來確定對社會具有吸引力的主題? 是否可以預(yù)測是否一首歌曲會做的很好僅僅依賴于歌詞分析? 在第一個教程中,作為探索性的練習(xí),你將會檢查Prince音樂的歌詞復(fù)雜程度。
問題
在深入之前,思考一下你正在試圖發(fā)現(xiàn)什么,還有感興趣的問題是什么。首先你將會對數(shù)據(jù)集進(jìn)行分析,它看起來什么樣子的?有多少歌曲?歌詞是什么樣的結(jié)構(gòu)? 需要做多少清理和爭論?事實是什么?頻率這個詞是什么以及它為什么重要?從技術(shù)的角度,你想要理解并為情感分析、自然語言處理以及機(jī)器學(xué)習(xí)模型準(zhǔn)備數(shù)據(jù)。
“音樂一直以來都是一個和大眾交流的有效方式,歌詞在這其中扮演著重要的角色。然而,對歌詞在社會福祉中扮演的角色的研究機(jī)會卻被大大的低估了 --帕特里夏·??怂埂ぬm瑟姆”
數(shù)據(jù)
為文本挖掘獲得數(shù)據(jù)的流行辦法是使用rvest包來從網(wǎng)上搜取內(nèi)容。我能夠從不同的網(wǎng)站上搜取BillBoard信息和Prince歌詞,并把他們加入到歌曲的標(biāo)題中。因為不一致的標(biāo)題命名約定,導(dǎo)致了一些爭論。然后我做了一個主觀的決定,去除了不是原版的所有歌曲,即混音,擴(kuò)展版本,俱樂部混音,重制等等。為了避免重復(fù),我還刪除了收錄了他熱門歌曲的歷史合集的專輯。我做了一些小清理,并保存結(jié)果為可以用于本教程的csv文件。
由于第一部分專注于文本挖掘,我沒有在這里提供代碼,但是如果你愿意的話,數(shù)據(jù)集是可以在這里下載。
導(dǎo)入類庫
讀取數(shù)據(jù)
從csv文件中有幾種方式讀入數(shù)據(jù),我傾向于使用read.csv()加載數(shù)據(jù)框架,即歌詞、發(fā)布年份、Billboard排名位置。需要注意的是,默認(rèn)情況下,R語言把所有的字符串轉(zhuǎn)換成因子。這可能會導(dǎo)致下游問題,但是你可以通過設(shè)置stringAsFactor參數(shù)為FALSE來解決這個問題。
你可以使用names()函數(shù)來看數(shù)據(jù)框架中的列。
因為我創(chuàng)建了這個文件,我知道X是行數(shù),text是實際的歌詞。其他必需的項包括song, year, peak(代表它在Billboard中的位置), US Pop 和 US R.B 代表著在美國(流行音樂和R&B排名)峰值圖位置,所以保存好這些,刪去其他的項。
使用原始的數(shù)據(jù)集來做這件事 prince_orig,然后使用%>%管道操作傳入select()。這樣的方式你能夠從左到右的讀取代碼。
另外,注意的是,select()允許你一次重新命名所有的列。因此將文本設(shè)置成歌詞然后用_代替.重命名US列項。然后存儲為Prince,之后再整個教程中你都將會用到。Dplyr提供了一個函數(shù)叫g(shù)limpse()會使你在轉(zhuǎn)置視圖中更容易地查看數(shù)據(jù)。
第一個顯而易見的問題是有多少個觀察和列項?
使用dim()函數(shù),你將看到結(jié)果是7個列項和824個觀察,每個觀察都是一首歌。如我所說。多產(chǎn)?。?/p>
請看其中一首歌的lyrics項,你可以了解一下它們的結(jié)構(gòu)。
這里有很多機(jī)會來清理它們,讓我們開始吧。
數(shù)據(jù)調(diào)整
基本的清理
有很多不同的方法使你來清理數(shù)據(jù)。其中一個選擇是使用tm文本挖掘包把數(shù)據(jù)框架轉(zhuǎn)換成語料庫和文本術(shù)語表,然后使用tm_map()函數(shù)做清理。但是本教程目前將專注基礎(chǔ),使用gsub和apply()函數(shù)來做臟工作。
首先,通過使用gsub()創(chuàng)建一個小函數(shù)來處理大部分場景以避免那些煩人的收縮,然后再所有歌詞上應(yīng)用該函數(shù)。
你還將注意到特殊字符弄臟了文本。你可以用gsub()函數(shù)和簡單的正則化表達(dá)式來去除它們。 請注意,在這步驟之前,擴(kuò)充收縮是非常重要的!
為了一致性,使用tolower()函數(shù)來把所有的內(nèi)容都轉(zhuǎn)換成小寫格式。
檢查歌詞,現(xiàn)在它們展示了原始文本之上一個很好的、更簡潔的版本。
在文本挖掘中調(diào)整數(shù)據(jù)的另一個普遍的步驟是詞干,或者叫拆分單詞為它們的詞根含義。這是可以在以后討論的話題,現(xiàn)在,看一下Prince的數(shù)據(jù)框架。
如你看到的,有37年的歌曲,而排名最低的歌曲是在88的位置。你也可以看到對于year和peak項有很多NAs。因為你將要做不同類型的分析,在Prince數(shù)據(jù)框架中保留完整的數(shù)據(jù)集,僅在需要的時候進(jìn)行篩選。
加入一些新的項
因為你的一個目標(biāo)問題是尋找跨越時間的歌曲趨勢,并且數(shù)據(jù)集包含著個人發(fā)行年份,你可以創(chuàng)建存儲桶來以十年劃分年份。使用dplyr的mutate()函數(shù)來創(chuàng)建新的decade項。創(chuàng)建存儲桶的一個辦法是采用ifelse()和%in%操作符來根據(jù)年份過濾歌曲轉(zhuǎn)換成十年。然后存儲結(jié)果到Prince(實際是增加了一個新的項)
你可以對chart_level做同樣的事,它代表著一首歌是否進(jìn)入了前10名,前100名或者沒有上榜。它們是互相排斥的,所以前100并不包含前10。
另外,創(chuàng)建一個叫做charted的二值項表明一首歌是否入圍Billboard榜單。使用write.csv()來保存為了以后的教程中使用。
描述性的統(tǒng)計
為了個性化圖表,我喜歡創(chuàng)建一個唯一的顏色列來保持視覺的一致性。Web上有很多可以通過下面所展示的十六進(jìn)制碼來獲得不同的顏色的地方。如果你有對于圖表有這樣的喜好,你也可以在需要的時候通過使用ggplot()創(chuàng)建自己的主題。
在開始進(jìn)行文本挖掘之前,先從基本的角度看看你的數(shù)據(jù)在歌曲級別的位置。現(xiàn)在是一個很好的時機(jī)來了解一下Prince每十年發(fā)行的數(shù)量。提醒一下,他于1978年開始自己的職業(yè)生涯并一直持續(xù)到2015年(在上面總結(jié)的數(shù)據(jù)中可見)。但是因為我們現(xiàn)在關(guān)注的是趨勢,而且數(shù)據(jù)集上在year項有很多空白值,你將想要在第一張圖表中過濾掉所有的發(fā)行年為NAs的數(shù)據(jù)。
歌曲統(tǒng)計
通過使用dplyr的filter(),group_by()以及summarise()函數(shù),你能夠按照decade來分組,然后計算出歌曲的數(shù)量。函數(shù)n()是多個聚合函數(shù)之一,也是對于在分組數(shù)據(jù)上使用summarise()有用的。然后使用ggplot()和geom_bar()創(chuàng)建條形圖然后將分類填充到條形圖中。
這清楚地展示了20世紀(jì)90年代是他最活躍的十年。
現(xiàn)在創(chuàng)建一個類似的圖表叫chart_level。
記得對decade和chart_level使用group_by()函數(shù),你將會看到趨勢。
在這個圖表中,你僅需要看一下表上的歌曲,使用peak > 0來過濾掉其他的東西。將group_by對象導(dǎo)入到summarise()然后使用n()來統(tǒng)計歌曲的數(shù)量。當(dāng)你把它存到一個變量中便可以導(dǎo)入到ggplot()來繪制一個簡單的條形圖。
洞見
注意到所有Prince的上排行表的歌曲,大部分都是前10名。但是更有趣的是在他創(chuàng)作新歌最多產(chǎn)的十年是90年代,但是更多上排行表的是在80年代。為什么會發(fā)生這樣的事兒?請在看文本挖掘部分的時候記住這個問題。
為了使用完整數(shù)據(jù)集來分析歌詞,你可以刪除參考圖表級別和發(fā)布年份來獲得更大量的歌曲去挖掘。
如你看到的,Prince寫過成百上千首在數(shù)據(jù)中沒有發(fā)布日期的歌曲。對于情感分析和探索性分析來說,你可以使用所有的數(shù)據(jù),但是對于隨時間的變化趨勢,你僅有一個更小的處理集合。這沒問題,僅僅知道就好了。
第一的歌曲
對于那些Prince狂熱的粉絲來說,下面是一個快速瀏覽排行榜第一的歌曲(請注意,你可以用來自于knitr包的kable() 和來自于kableExtra包的kable_styling()以及來自于formattable包的color_tile()來創(chuàng)建一個更規(guī)范的HTML輸出)
文本挖掘
文本挖掘也可以被認(rèn)為文本分析。目標(biāo)是發(fā)掘可能未知的或者被隱藏在字面意思之下的相關(guān)信息。自然語言處理是一種用于挖掘文本的方法。它試圖通過標(biāo)記、聚類、提取實體和單詞關(guān)系來解釋書面語言的模糊性,并使用算法來明確主題和量化主觀信息。首先你將打破詞匯復(fù)雜性的概念。
詞匯復(fù)雜性在不同上下文環(huán)境中可能意味著不同東西,但是現(xiàn)在,假設(shè)它可以被這些測量的組合所描述。
單詞頻率:每首歌單詞的數(shù)量
單詞長度:文本中每個單詞的平均長度
詞匯多樣性:在文本中不單詞的數(shù)量(歌曲詞匯)
詞匯密度:不同單詞的數(shù)量除以所有單詞總數(shù)(字詞重疊)
整潔文本的格式
分析之前,你需要把歌詞分解為一個個單詞,然后開始深入挖掘。這個過程叫做標(biāo)記化。
數(shù)據(jù)格式和標(biāo)記化
請記住有不同的方法和數(shù)據(jù)格式可以用做文本挖掘。
語料庫:用tm文本挖掘包來創(chuàng)建的文檔的集合
文檔-詞矩陣:一個列出在語料庫出現(xiàn)的所有單詞的矩陣,其中文檔是行,單詞是列。
整潔文本:每行都有一個令牌的表。在本例中,令牌即一個單詞(或者是在第二部分討論的n-gram)。標(biāo)記化是一個將歌詞拆分為令牌的過程。本教程將用tidytext的unnest_tokens()函數(shù)來完成。詳細(xì)信息,請查閱tidytext文檔。
但是在你開始令牌化任何東西之前,清理數(shù)據(jù)還有一個步驟。很多歌詞在轉(zhuǎn)錄的時候會包括像“重復(fù)合唱”或者“橋牌”“詩歌”等這樣的標(biāo)簽。還有很多不希望的單詞會弄臟結(jié)果。有了之前的分析,我選擇一些可以擺脫的方法。
下面是需要手動刪除的多余單詞的列表。
要取消標(biāo)記,使用己加載的tidytext類庫。你可以開始利用dplyr的強(qiáng)大功能同時一起加入幾個步驟。
在文本整潔框架中,你既需要將文本分解成單獨(dú)的標(biāo)記又需要把文本轉(zhuǎn)換成一個整潔的數(shù)據(jù)結(jié)構(gòu)。使用tidytext的unnest_tokens()函數(shù)來做這個。Unnest_token() 需要至少兩個參數(shù):列輸出名將被在文檔取消后創(chuàng)建(本例中的word), 列輸入保存當(dāng)前文本(歌詞)
你可以使用prince數(shù)據(jù)集,并導(dǎo)入unnest_tokens()函數(shù),然后刪除停止單詞。停止單詞是什么?你很了解它們。它們是對結(jié)果沒有增加任何意義的很普通的單詞。有不同的列表可供選擇,但是你可以使用tidytext包的stop_words函數(shù)。
使用sample()展示一個這些停止單詞的隨機(jī)列表,使用head()限制在15個單詞。
因此,在你將歌詞標(biāo)記為單詞之后,使用dplyr的anti_join()函數(shù)刪除停止單詞。接下來,使用dplyr的filter()函數(shù)和%in%操作符來刪除之前定義的不想要的單詞。然后使用distinct()來去掉重復(fù)的單詞。最后,你可以刪除所有少于4個字符的單詞。這是另一個主觀決定,但是在歌詞中,很多感嘆詞比如“是,嘿”,然后把結(jié)果存到prince_words_filtered。
注意:為了之后的參考,prince_words_filtered 是Prince數(shù)據(jù)的整潔文本版本: 沒有了停止單詞,沒有不想要的單詞,沒有1-3個字符的單詞。你會在一部分而并不是所有的分析中使用它們。
注意的是stop_words有一個word列,有一個叫做word的新列是被unnest_tokens()函數(shù)所創(chuàng)建的,所以anti_join()自動加入到word列
你可以檢查你的新的整潔數(shù)據(jù)的結(jié)構(gòu)的類別和維度。
Prince_words_filtered是一個有著36916個單詞(不是唯一的單詞)和10個列的數(shù)據(jù)。這有一個快照(我只選擇一個單詞,并將它限制在10首歌之中然后使用select()按順序打印感興趣項,再次使用knitr來格式化)。這里向你展示了標(biāo)記化,未總結(jié)的,整潔的數(shù)據(jù)結(jié)構(gòu)。
你能看到每行包含各自的能夠在每首歌中重復(fù)出現(xiàn)的單詞。
詞匯頻率
音樂中的個性化詞頻占有非常重要的一席之地,無論是常見詞匯還是罕見詞匯。這兩方面都會影響整首歌的流行度。流行歌曲的作者都想知道的一個問題是詞頻和打榜歌曲是否有關(guān)聯(lián)性。所以現(xiàn)在你需要利用簡潔的數(shù)據(jù)做更深一步的探究,以得到每首歌的詞匯統(tǒng)計。
為了測試Prince歌詞的格式,可以根據(jù)歌曲名稱和公告牌是否上榜分組,建立直方圖來展示詞頻的分布。利用源Prince歌詞得到一個真實的詞頻計數(shù)。再一次利用 group_by() 和summarise()函數(shù)計數(shù)。隨后使用dplyr 和 arrange()排序。首先,看一下詞頻最高的歌曲,再使用ggplot()的直方圖展示。
注意到上圖是右偏的??紤]到歌詞轉(zhuǎn)錄的性質(zhì),我懷疑是歌詞輸入的錯誤。所以,出自好奇,我觀察打榜前十名且超過800個單詞的歌曲。
我做了一點(diǎn)研究后發(fā)現(xiàn)這首歌曲有一段嘉賓表演的說唱。這就說得通了!記住,這份數(shù)據(jù)包含流行歌曲和R&B全球榜單,所以歌曲類型和地理因素可以影響你的假設(shè)。注意到這首歌曲在美國流行音樂榜的排名要遠(yuǎn)低于其它國家,比如在加拿大榜單其位列第五名。在心里記住這件事。
挑戰(zhàn):如果你想要親自動手進(jìn)行音樂分析,你可能需要查看The Million Song Dataset,它擁有超過50000名表演者的50個特征(例如:節(jié)奏,響度,舞蹈表現(xiàn)力等等)。將音樂特征融入到歌詞有利于做非常全面的分析。
詞匯榜首
為了粗略估計全部歌詞集中最頻繁使用的詞匯,你可以在你干凈的、過濾過的數(shù)據(jù)集使用count() 和 top_n()兩個函數(shù),得到前n名頻繁使用的詞匯。
然后根據(jù)計數(shù)結(jié)果,利用reorder()函數(shù)對詞匯再度排名,使用dplyr的 mutate()函數(shù)生成有序的word變量。這方便使用ggplot()進(jìn)行更友好的展示。
在最為流行的音樂中,愛是最為常見的主題。僅憑借這些最常用的詞匯我不會做任何假設(shè),但是你可以從中窺探藝術(shù)家的洞察力,當(dāng)然不是全貌。在移步進(jìn)行更深層次的調(diào)查之前,花一些時間獲得一些視覺上的享受吧!
詞云
詞云在很多人中受到負(fù)面評價,如果你不謹(jǐn)慎地使用詞云,那么在某些時候他們就會超出文本框。然而從本質(zhì)上來說,我們都是視覺動物,能夠以洞察力從這些可視化圖中獲得真正有意義的信息??匆恍㏒andy McKe的實例,并謹(jǐn)慎地使用詞云圖。
但是現(xiàn)在,使用一個新的、名為wordcloud2的包做一些酷的事情。這個包提供關(guān)于詞云生成HTML控件的創(chuàng)造性的集合。你可以圍繞一個單詞觀察其在文本的頻率。(這個包在rMarkdown平臺上面更新速率非常緩慢,并且對使用的瀏覽器有非常多的限制條件。希望它會有所提升。)
想獲得更多樂趣的話,你可以加入一點(diǎn)數(shù)據(jù)美感。
流行詞匯
截至目前我們已經(jīng)觀察所有歌曲中的流行詞匯。如果你根據(jù)打榜名次分組后會發(fā)生什么?在上榜歌曲和未上榜歌曲中是否存在更流行的詞匯?這些被認(rèn)為是社會中流行的詞匯。
注意到下圖代碼中使用slice(seq_len(n))的作用是為了獲得chart_level不同類別的前幾名。它的作用和top_n()是不同的,并且如果你在圖形中使用刻面的話,這是更加方便的選擇。(需要謹(jǐn)記這類技巧有不同方法)你可以使用row_number() 函數(shù)來確保在圖形中你可以按照正確順序呈現(xiàn)單詞)。ggplot()默認(rèn)設(shè)置是按照字母排序,并且實際操作中排序要優(yōu)先于畫圖。
你現(xiàn)在從上面得到的見解是什么?
好吧,不同打榜歌曲中流行詞匯是如此接近。這對于我們想通過歌詞來預(yù)測一首歌是否成功打榜不是件好事。但是你僅僅了解到文本挖掘,自然語言和預(yù)測模型中的皮毛知識。
永不過時的詞匯
音樂中一些詞匯是永不過時的。永不過時的詞匯超越了時間,能夠吸引一大批聽眾。如果你按照每十年劃分你的數(shù)據(jù),這些詞匯會上榜。使用過濾,分組和聚合獲得Prince歌詞每十年的流行詞匯,觀察什么詞匯屬于永不過時的,哪些是一閃即逝的。你可以使用ggplot() 中的 facet_wrap()繪制每十年的數(shù)據(jù)。
顯而易見:愛,時間和女孩是歷久彌新的詞匯。但是識別流行詞匯到底多容易呢?一個世紀(jì)就會輪換流行詞匯是否為事實?能否簡單認(rèn)為上述的詞匯在歌曲中是高度重復(fù)的呢?詞頻是否是識別歌曲主題的依據(jù)呢?這種分析歌詞的方法是否適用于其它文本挖掘的任務(wù)呢,例如分析州政府的演講?
詞匯長度
對歌曲作者來說,詞匯長度是一個有趣的話題。詞匯越長,越難押韻和形成一種模式。下面的詞匯長度的直方圖展示正如你所期待的,僅有少數(shù)詞匯的長度是非常長的。
這些瘋狂的長詞匯是哪些呢?我想這需要一個非常有趣的詞云圖!這是基于詞的長度而非詞頻。顯示如下:
詞匯多樣性
一個文本包含的詞匯越多,其詞匯多樣性就越高。宋的詞匯表呈現(xiàn)的是一首歌曲中有多少獨(dú)特的詞匯。可以用一個簡單的圖顯示過去平均一首歌中有多少詞匯是獨(dú)一無二的。
這說明什么呢?過去的數(shù)十年間,Prince的歌詞多樣性具有一點(diǎn)輕微向上的趨勢。這和打榜成功有多少相關(guān)呢?很難說,畫出密度圖和打榜歷史再做更近一步的分析吧!
詞匯密度
回憶本教程,詞匯多樣性等于獨(dú)特詞匯除以文章詞匯的長度。這是詞匯重復(fù)性的一個指標(biāo),詞匯重復(fù)是歌曲作者的一個關(guān)鍵工具。詞匯密度提升,重復(fù)性降低。(注意:這不同于順序重復(fù),那是歌曲作者的另一個技巧)
觀察過去幾年間Prince的詞匯密度??紤]密度的話,最好保留所有詞,包括停詞。所以從原始的數(shù)據(jù)集和未經(jīng)過濾的詞匯開始。根據(jù)歌曲和年份分組,用n_distinct() 和 n()計算密度,把結(jié)果用 geom_smooth()傳給ggplot() 。此外用stat_smooth()的lm模型做一個線性平滑模型。
為比較趨勢,可以可視化打榜歷史數(shù)據(jù)(例如:打榜成功的歌曲)和比較其多樣性和密度。使用gridExtra的grid.arrange()函數(shù)并排地繪圖。
你可以觀察到過去幾年間,Prince的詞匯多樣性和密度呈輕微上升趨勢。怎樣比較這個趨勢和所有流行歌曲的關(guān)系呢?有研究顯示打榜歌曲的詞匯多樣性和密度呈下降趨勢,暗示重復(fù)性有所提升(例如:詞匯更多,說得更少)。這個趨勢和Prince的歌曲不同。另一個研究證明所有流行歌曲,多樣性(獨(dú)特詞匯)在過去年間呈現(xiàn)上升趨勢,這和Prince歌曲正相關(guān)。這可能是因為過去榜單排名試圖豐富類型多樣性。類型是數(shù)據(jù)的關(guān)鍵部分,但是這個變量在我們的數(shù)據(jù)集并不存在。這是否是因為榜單歷史對流行歌曲的影響力日益衰微,對R&B/Rap的影響力日益加深?
挑戰(zhàn):我希望你能考慮這些結(jié)果,甚至鼓勵你尋找不同數(shù)據(jù)集,并且自己動手練習(xí)。記住:相關(guān)性不同于因果關(guān)系。
TF-IDF
目前為止在整個數(shù)據(jù)集中使用的方法并沒有強(qiáng)調(diào)如何量化文檔中不同詞匯在整個文檔集中的重要性。你已經(jīng)查看詞頻,并且移除停詞,但這可能還不是最復(fù)雜的方法。
進(jìn)入TF-IDF。TF代表詞頻。IDF代表逆向文件頻率,它賦予經(jīng)常使用的詞匯低權(quán)重,同時給文本中罕見詞匯更多權(quán)重。當(dāng)你聯(lián)合TF和IDF時,一個詞匯的重要性調(diào)整為它在使用過程中的罕見程度。TF-IDF背后的假設(shè)是文本中更頻繁使用的詞匯應(yīng)賦予更高的權(quán)重,除非它出現(xiàn)在很多文檔中。公式總結(jié)如下:
? 詞頻(TF):一個單詞在文檔中出現(xiàn)次數(shù)
? 文件頻率(DF):包含單詞的文檔數(shù)量
? 逆向文件頻率 (IDF) =1/DF
? TF-IDF = TF * IDF
因此對于在集合中僅見于少數(shù)文檔的任何單詞,IDF是非常高的。你可以通過tidytext中的 bind_tf_idf() 函數(shù)來使用這個方法,以便檢查每個打榜名次分類中最重要的詞匯。這個函數(shù)用TF*IDF的乘積來計算和聯(lián)合TF與IDF。它用經(jīng)過過濾的數(shù)據(jù)集作為輸入,每一行是一篇文件(歌曲)中的一個表示(詞匯)。你會在新的一列看到結(jié)果。
所以,利用你原始的Prince的數(shù)據(jù)框和經(jīng)過過濾的標(biāo)記詞,并且消除不受歡迎的詞匯,但是保留停詞。然后使用bind_tf_idf()運(yùn)行公式并且建立新的列。
現(xiàn)在如你所見,對于最最常見的單詞,IDF and TF-IDF都是0.(更科學(xué)地說,IDF的表現(xiàn)形式是自然對數(shù) ln(1),所以那些詞匯的IDF 以及 TF-IDF的值是0.)把你的結(jié)果作為參數(shù)傳遞給arrange() 然后以降序的方式展示tf-idf。通過增加這些步驟,你會以一種不同的視角觀察Prince的歌詞。
使用TF-IDF為觀察潛在的重要詞匯提供一種不同的視角。當(dāng)然,解釋是完全主觀性的。注意到其中的模式了嗎?
接下來,觀察隨時間變化的TF-IDF。
現(xiàn)在你看待這個問題已經(jīng)有了更深層次的見解。‘永不過時’的詞匯不再流行。僅僅利用每組一些詞匯就能觀察到新出現(xiàn)的主題是否可行呢?你將會在第二個教程學(xué)習(xí)這方面的知識以達(dá)到新的高度(第二部分:自然語言處理的情感分析和主題模型)
這個方法的詞云圖以全新的視角顯Prince中的歌詞的重要詞匯,事情變的越來越有趣。
總結(jié)
在這個案例中,首先你以最基礎(chǔ)的角度快速觀察真實數(shù)據(jù)。然后進(jìn)行一些處理:例如數(shù)據(jù)清洗和刪除不提供信息的詞匯,并開始歌曲的探索分析。
接下來,你通過把歌詞轉(zhuǎn)換詞的表示以便于觀察歌詞復(fù)雜性的方法,更加深入地鉆研文本挖掘。分析結(jié)果為接下來的情感分析和主題建模提供關(guān)鍵視角。
最后,你通過TF-IDF分析得到在文本中詞匯背后的信息,并收獲一些有趣的結(jié)論。你或許認(rèn)為這是一個識別音樂主題的好方法,但此時你僅僅只是一知半解。第二部分強(qiáng)調(diào)運(yùn)用無監(jiān)督的LDA方法。在數(shù)據(jù)科學(xué)的各個層面,有很多方法可以獲得內(nèi)在的見解。在此案例的第二部分和第三部分,你將會學(xué)習(xí)到更多觀點(diǎn)
希望你和我一樣迫不及待想繼續(xù)接下來的探索分析旅程:情感分析,話題建模和預(yù)測見解。
謝謝你的閱讀,期待接下來教程能繼續(xù)同行。
博客原址 https://www.datacamp.com/community/tutorials/R-nlp-machine-learning
更多文章,關(guān)注雷鋒網(wǎng) 雷鋒網(wǎng)
添加雷鋒字幕組微信號(leiphonefansub)為好友
備注「我要加入」,To be an AI Volunteer !
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。