天天看點

R語言資料分析有意思的小例子:Prince的歌詞挖掘 — 1

原文位址

Lyric Analysis with NLP & Machine Learning with R

原文的主要内容

深入挖掘Prince音樂的歌詞,通過文本挖掘和探索性資料分析來進一步了解這位偉大藝術家的職業生涯。

原文的内容可以分為三個部分

  • 文本挖掘和探索新資料分析
  • 情感分析和 Topic Modeling with NLP()
  • 機器學習預測分析

對于自己這樣一個不太了解音樂的人來說首先提出的問題就是

Prince是誰?

R語言資料分析有意思的小例子:Prince的歌詞挖掘 — 1

image.png

Prince(1958年6月7日—2016年4月21日),原名普林斯·羅傑斯·内爾森(Prince Rogers Nelson),美國流行歌手、詞曲作家、音樂家、演員,以全面的音樂才能,華麗的服裝及舞台表演著稱。

Prince是位高産的音樂人,至今已發行近40張個人專輯,創作歌曲已超過千首。他精通各類樂器,絕大部分專輯的詞曲創作,樂器演奏都由他自己一人包辦。同時,Prince頗具實驗精神,音樂風格橫跨黑白樂界,幾乎每次出新專輯都會融合新的音樂元素。上世紀80年代初,他所開創的獨特音樂風格,被稱為“明尼阿波利斯之聲”,影響了許多音樂人。截止2018年,prince專輯銷量已經達到1億3千萬張。此外,Prince還以膽大敢為,性格頗為古怪而著稱。

Prince獲得過1次奧斯卡獎、1次金球獎、7次格萊美獎、6次全美音樂獎、3次全英音樂獎、4次MTV音樂錄影帶大獎。他也先後在2004年入選美國搖滾名人堂、2006年入選英國音樂名人堂。2004年,《滾石雜志》評選的“100位最傑出藝人”(100 Greatest Artists of All Time),Prince名列第27。

2016年4月21日清晨,流行音樂傳奇人物、以多才多藝且多産而聞名的美國歌手“王子”(Prince)納爾遜,在明尼蘇達州派斯裡園宅邸辭世,享年57歲。

以上内容來自百度百科。

下面開始資料分析的内容

第一部分:資料預處理

1、讀入資料,檢視變量,檢視資料次元

prince_orig<-read.csv("Taylor/prince_raw_data_1.csv",
                        stringsAsFactors = F,
                        header=T)
names(prince_orig)
dim(prince_orig)
           

複制

2、 選擇用到的變量,包括

  • 歌詞文本 text
  • 歌名 song
  • 發行年份 year
  • 專輯 album
  • peak (which shows its placement on the Billboard charts)Billboard上的排名
  • US.Pop 和 US.R.B (peak positions for the US Pop and R&B charts)我了解為另外兩個排行榜上的排名
prince<-prince_orig%>%
  select(lyrics=text,song,year,album,peak,
         us_pop=US.Pop,us_rnb=US.R.B)
which(prince$song == "controversy")
glimpse(prince[138,])
           

複制

3、 檢視資料次元

dim(prince)
           

複制

我用到的資料和原文有些出入少了兩行,因為讀入原始資料的時候有提示

Warning message:
In scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  :
  EOF within quoted string
           

複制

我手動删掉了一些内容後,沒有了這個警告

4、使用gsub()函數替換掉歌詞文本的一些像won't can't等内容

fix.contractions<-function(doc){
  doc <- gsub("won't","will not",doc)
  doc <- gsub("can't", "can not", doc)
  doc <- gsub("n't", " not", doc)
  doc <- gsub("'ll", " will", doc)
  doc <- gsub("'re", " are", doc)
  doc <- gsub("'ve", " have", doc)
  doc <- gsub("'m", " am", doc)
  doc <- gsub("'d", " would", doc)
  doc <- gsub("'s","",doc)
  return(doc)
}
prince$lyrics<-sapply(prince$lyrics,fix.contractions)
           

複制

5、删除一些特殊字元

removeSpecialChars<-function(x)gsub("[^a-zA-Z0-9]"," ",x)
prince$lyrics<-sapply(prince$lyrics,removeSpecialChars)
           

複制

6、将字元轉化為小寫字母

prince$lyrics<-sapply(prince$lyrics,tolower)
           

複制

7、使用summary()函數檢視資料的基本情況

> summary(prince)
    lyrics              song                year         album                peak          us_pop             us_rnb         
 Length:822         Length:822         Min.   :1978   Length:822         Min.   : 0.00   Length:822         Length:822        
 Class :character   Class :character   1st Qu.:1989   Class :character   1st Qu.: 2.00   Class :character   Class :character  
 Mode  :character   Mode  :character   Median :1996   Mode  :character   Median : 7.00   Mode  :character   Mode  :character  
                                       Mean   :1995                      Mean   :15.68                                        
                                       3rd Qu.:1999                      3rd Qu.:19.50                                        
                                       Max.   :2015                      Max.   :88.00                                        
                                       NA's   :495                       NA's   :750                                          
    decade          chart_level          charted         
 Length:822         Length:822         Length:822        
 Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character
           

複制

從以上結果我們可以看到

  • 這些歌的前後跨度有37年
  • year和peak變量中有一些缺失值

缺失值可以先保留,根據後續的具體分析内容在做處理

8、将年份劃分為年代

library(dplyr)
prince<-prince%>%
  mutate(decade=
           ifelse(prince$year%in% 1978:1979,"1970s",
                  ifelse(prince$year %in% 1980:1989,"1980s",
                         ifelse(prince$year %in% 1990:1999, "1990s",
                                ifelse(prince$year %in% 2000:2009, "2000s",
                                       ifelse(prince$year %in% 2010:2015, "2010s", 
                                              "NA"))))))
           

複制

9、将排名進行處理

  • top10
  • top100
  • 上榜
  • 沒上榜
prince <- prince %>%
  mutate(chart_level = 
           ifelse(prince$peak %in% 1:10, "Top 10", 
                  ifelse(prince$peak %in% 11:100, "Top 100", "Uncharted")))
prince <- prince %>%
  mutate(charted = 
           ifelse(prince$peak %in% 1:100, "Charted", "Uncharted"))
           

複制

至此資料預處理就完成了,将結果儲存到檔案中

write.csv(prince,file="prince_new.csv",row.names = F,quote = F)
           

複制

第二部分:對資料進行一些簡單的可視化

1、柱形圖展示不同的年代發行的歌曲數量

df1<-prince%>%
  filter(decade !="NA")%>%
  group_by(decade,charted)%>%
  summarise(number_of_songs=n())
dim(df1)
head(df1)
library(ggplot2)
ggplot(df1,aes(x=decade,y=number_of_songs))+
  geom_bar(aes(fill=charted),stat="identity")+
  theme_bw()+
  scale_fill_manual(values=c("#E69F00", "#56B4E9"))
           

複制

R語言資料分析有意思的小例子:Prince的歌詞挖掘 — 1

image.png

從上圖可以清楚的看到釋出歌曲最多的是90年代

2、柱形圖展示上榜歌曲的數量

df2<-prince%>%
  filter(peak>0)%>%
  group_by(decade,chart_level)%>%
  summarise(number_of_songs=n())
ggplot(df2,aes(x=decade,y=number_of_songs))+
  geom_bar(aes(fill=chart_level),stat="identity")+
  theme_bw()+
  scale_fill_manual(values=c("#009E73", "#CC79A7"))
           

複制

R語言資料分析有意思的小例子:Prince的歌詞挖掘 — 1

image.png

從上圖可以看出,Prince上榜的歌曲中絕大部分都排到了前10名。一個比較有意思的現象是Prince最高産是在90年代,然而歌曲上榜數量最多是在80年代。為什麼會出現這個現象,這裡先賣個小關子。

3、看一看在排行榜上排到第一名的都是哪些歌

library(knitr)
install.packages("kableExtra")
library(kableExtra)
install.packages("formattable")
library(formattable) 
prince %>%
  filter(peak == "1") %>%
  select(year, song, peak) %>%
  arrange(year) %>%
  mutate(year = color_tile("lightblue", "lightgreen")(year)) %>%
  mutate(peak = color_tile("lightgreen", "lightgreen")(peak)) %>%
  kable("html", escape = FALSE, align = "c", caption = "Prince's No. 1 Songs") %>%
  kable_styling(bootstrap_options = 
                  c("striped", "condensed", "bordered"), 
                full_width = FALSE)
           

複制

R語言資料分析有意思的小例子:Prince的歌詞挖掘 — 1