I will be looking at if Lorde’s music becomes more positive or negative as her emotions evolve as she grows up and also look at love over time. I will be looking at Lorde’s three albums “Pure Heroine” (2013), “Melodrama” (2017), and “Solar Power” (2021). I chose to look at these with the help of Professor Walsh and my past knowledge on from watching interviews with Lorde. According to https://genius.com/artists/Lorde#, or Genius, Lorde’s most popular album is Pure Heroine. From my previous knowledge of Lorde’s goal not to be the most famous artist, I am curious whether my research will align with the sentiment analysis and be proven true. Looking at “Melodrama” (2017) and “Solar Power” will help strengthen the claim that since her increase of fame from “Pure Heroine” (2013) she has wanted less of the spotlight on her. As of each of her albums grew, her enjoyment and love for being in the spotlight decreased.I’ll look at whether she uses love related words throughout each album and observing the decrease in the use of words like “love” and “light” or other positive words. I will be using JSON filed to get my information for this project provided by Professor Walsh and I will turn them into data files.
I was given each album as a JSON file and had to change them into a datafile in order to analyze and compare the sentiment among each albums 20 most popular words. I will be looking at the change in tone from more positive to more negative and exploring fame from Lorde’s three albums.
setwd("~/Desktop/Lorde")
pureheroine <- fromJSON('Lyrics_PureHeroine.json')
as.data.frame(pureheroine) -> pureheroine_df
pureheroine_df$tracks.song -> lyrics
lyrics %>%
unnest_tokens(word, lyrics) -> pureheroine
How many words are in Pure Heroine?
pureheroine %>%
count()
## n
## 1 3784
There are 3784 words.
Of those words, what are the 20 most used words on the album and how often are they seen?
pureheroine %>%
anti_join(stop_words) %>%
count(word, sort = TRUE) %>%
filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>%
head(20) %>%
knitr::kable()
## Joining, by = "word"
| word | n |
|---|---|
| people | 34 |
| yeah | 30 |
| talking | 24 |
| call | 22 |
| talk | 21 |
| send | 16 |
| live | 14 |
| love | 14 |
| pre | 13 |
| teeth | 13 |
| rule | 12 |
| world | 12 |
| em | 11 |
| home | 10 |
| lyrics | 10 |
| baby | 9 |
| bridge | 9 |
| care | 9 |
| friend | 9 |
| play | 9 |
The three words that stuck out to me were “people”, “yeah”, and “talking” as they do not really link to any sort of romanticism, which I think this album is more about her youth and exploring materialism, fame and social status.
Lets look at the sentiment behind these words.
pureheroine %>%
count(word, sort = TRUE) %>%
anti_join(stop_words) %>%
inner_join(get_sentiments("bing")) %>%
inner_join(get_sentiments("afinn")) %>%
filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>%
head(20) %>%
knitr::kable()
## Joining, by = "word"
## Joining, by = "word"
## Joining, by = "word"
| word | n | sentiment | value |
|---|---|---|---|
| love | 14 | positive | 3 |
| fun | 4 | positive | 4 |
| glory | 4 | positive | 2 |
| kill | 4 | negative | -3 |
| pretty | 4 | positive | 1 |
| sweet | 4 | positive | 2 |
| bad | 3 | negative | -3 |
| clean | 3 | positive | 2 |
| contagious | 3 | negative | -1 |
| crazy | 3 | negative | -2 |
| fear | 3 | negative | -2 |
| glad | 3 | positive | 3 |
| happy | 3 | positive | 3 |
| ruins | 3 | negative | -2 |
| scary | 3 | negative | -2 |
| shit | 3 | negative | -4 |
| brave | 2 | positive | 2 |
| cool | 2 | positive | 1 |
| cry | 2 | negative | -1 |
| fine | 2 | positive | 2 |
Love is seen at the top being seen a lot throughout the album (14 times with a value of 3), with positive sentiment as well as “fun” is only seen 4 times with a value of 4.
I created the dataset “pureheroinesentiment” with the code below and used it to create a graph that would demonstrate that the positive sentiment words are seen frequently throughout the album and are greater than the amount of negative sentiment words.
pureheroine %>%
count(word, sort = TRUE) %>%
anti_join(stop_words) %>%
inner_join(get_sentiments("bing")) %>%
inner_join(get_sentiments("afinn")) %>%
filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) -> pureheroinesentiment
## Joining, by = "word"
## Joining, by = "word"
## Joining, by = "word"
pureheroinesentiment %>%
arrange(desc(n)) %>%
head(20) %>%
ggplot(aes(word, value, fill= value)) + geom_col() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
### A wordcloud will help visualize just how freqently the positive sentiment words are seen on “Pure Heroine”.
pureheroine %>%
count(word, sort = TRUE) %>%
anti_join(stop_words) %>%
filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>%
wordcloud2()
## Joining, by = "word"
People, talking, yeah and call stand out among the other words within the word cloud.
First I just need to make the JSON file into a datafile
melodrama <- fromJSON('Lyrics_Melodrama.json')
as.data.frame(melodrama) -> melodrama_df
melodrama_df$tracks.song -> lyrics
lyrics %>%
unnest_tokens(word, lyrics) -> melodrama
How many words are on Melodrama?
melodrama %>%
count()
## n
## 1 3842
3842 words on Melodrama, that is about the same as Pure Heroine.
melodrama %>%
count(word, sort = TRUE) %>%
anti_join(stop_words) %>%
filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>%
head(20) %>%
knitr::kable()
## Joining, by = "word"
| word | n |
|---|---|
| boom | 40 |
| love | 25 |
| light | 21 |
| mind | 16 |
| supercut | 16 |
| green | 15 |
| bet | 14 |
| call | 14 |
| waiting | 14 |
| homemade | 13 |
| shit | 13 |
| blowing | 12 |
| dance | 12 |
| dark | 12 |
| dynamite | 12 |
| em | 12 |
| head | 12 |
| melodrama | 12 |
| perfect | 12 |
| pre | 12 |
The words that stuck out to me were “boom”, “love” and “light” as boom is a bit more of a negative word but love and light are more positive. Based on the information provided that Boom is the most used word in the album and knowing that it most likely has a negative sentiment will help me infer that whenever “Boom” is used throughout the album the songs will be more sad, angry, gloomy etc.
Let’s look at the sentiment of “Melodrama”:
melodrama %>%
count(word, sort = TRUE) %>%
anti_join(stop_words) %>%
inner_join(get_sentiments("bing")) %>%
inner_join(get_sentiments("afinn")) %>%
filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>%
head(20) %>%
knitr::kable()
## Joining, by = "word"
## Joining, by = "word"
## Joining, by = "word"
| word | n | sentiment | value |
|---|---|---|---|
| love | 25 | positive | 3 |
| shit | 13 | negative | -4 |
| perfect | 12 | positive | 3 |
| hard | 9 | negative | -1 |
| liar | 9 | negative | -3 |
| blind | 4 | negative | -1 |
| awesome | 3 | positive | 4 |
| crush | 3 | negative | -1 |
| fuck | 3 | negative | -4 |
| lost | 3 | negative | -3 |
| ashamed | 2 | negative | -2 |
| blame | 2 | negative | -2 |
| bother | 2 | negative | -2 |
| crazy | 2 | negative | -2 |
| die | 2 | negative | -3 |
| mess | 2 | negative | -2 |
| missed | 2 | negative | -2 |
| pretend | 2 | negative | -1 |
| sick | 2 | negative | -2 |
| sweet | 2 | positive | 2 |
The first four words stuck out to me. It is clear to see that the positive sentiment words, love (value= 3) and perfect (value= 3) have higher sentiment, and that the negative words, shit (value= -4) and hard (value= -1), are very strong. This makes me wonder: when Lorde was writing the album, did her feelings on love change? Was she feeling reminiscent while producing this album? These words and their sentiment clearly show that while the album is sadder based on the title, there are some positive aspects to it.
Using the code below, I created a data set for the 20 most popular words and their sentiment.
melodrama %>%
count(word, sort = TRUE) %>%
anti_join(stop_words) %>%
inner_join(get_sentiments("bing")) %>%
inner_join(get_sentiments("afinn")) %>%
filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) -> melodramasentiment
## Joining, by = "word"
## Joining, by = "word"
## Joining, by = "word"
melodramasentiment %>%
arrange(desc(n)) %>%
ggplot(aes(n, sentiment, fill= sentiment)) + geom_col() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
melodrama %>%
count(word, sort = TRUE) %>%
anti_join(stop_words) %>%
filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>%
wordcloud2()
## Joining, by = "word"
This is Lorde’s third album, like the first two albums, I had to create a data file from a JSON file.
solarpower <- fromJSON('Lyrics_SolarPower.json')
as.data.frame(solarpower) -> solarpower_df
solarpower_df$tracks.song -> lyrics
lyrics %>%
unnest_tokens(word, lyrics) -> solarpower
solarpower %>%
count()
## n
## 1 2972
There are 2972 words on this album. Let’s see what the 20 most popular words on “Solarpower” were.
solarpower %>%
count(word, sort = TRUE) %>%
anti_join(stop_words) %>%
filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>%
head(20) %>%
knitr::kable()
## Joining, by = "word"
| word | n |
|---|---|
| girl | 20 |
| love | 20 |
| secrets | 17 |
| time | 17 |
| pre | 14 |
| ah | 13 |
| breathe | 13 |
| solar | 13 |
| lyrics | 12 |
| olar | 12 |
| tune | 12 |
| sun | 11 |
| california | 10 |
| feel | 10 |
| path | 9 |
| fallen | 8 |
| kinda | 8 |
| fruit | 7 |
| power | 7 |
| baby | 6 |
The top 3 words are “girl” “love” and “secrets”. “Girl” and “love” are words with a more positive tone to them and typically reflect happier emotions. “Secrets” gives a more negative connotation and when used in a song could give a more mysterious attitude. According to the Wikipedia page for Solarpower https://en.wikipedia.org/wiki/Solar_Power_(album) this album focused on Lorde’s lifestyle out of the spotlight so secrets could refer to her personal life that is not talked about in the public.
This is the sentiment analysis of “Solar Power” most popular words:
solarpower %>%
count(word, sort = TRUE) %>%
anti_join(stop_words) %>%
inner_join(get_sentiments("bing")) %>%
inner_join(get_sentiments("afinn")) %>%
filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>%
head(20) %>%
knitr::kable()
## Joining, by = "word"
## Joining, by = "word"
## Joining, by = "word"
| word | n | sentiment | value |
|---|---|---|---|
| love | 20 | positive | 3 |
| fallen | 8 | negative | -2 |
| cool | 6 | positive | 1 |
| die | 2 | negative | -3 |
| hard | 2 | negative | -1 |
| hurt | 2 | negative | -2 |
| loved | 2 | positive | 3 |
| pain | 2 | negative | -2 |
| perfect | 2 | positive | 3 |
| sad | 2 | negative | -2 |
| strange | 2 | negative | -1 |
| wrong | 2 | negative | -2 |
| beautiful | 1 | positive | 3 |
| bliss | 1 | positive | 3 |
| bright | 1 | positive | 1 |
| broken | 1 | negative | -1 |
| cheater | 1 | negative | -3 |
| clean | 1 | positive | 2 |
| crazy | 1 | negative | -2 |
| euphoria | 1 | positive | 3 |
“Love” (with a sentiment of 3), “fallen” (with a sentiment of -2), and “cool” (with a sentiment of 1) are the three most popular sentiment words within the album. This could be a drawing on Lorde’s time spent out of the spotlight and withdrawn from fame. Taking some time for herself in her homeland made her realized, that she wishes to withdraw herself from the culture of fame. Could this come from all the public attention her last album got in light of her breakup or does she just want to withdraw from fame.
Here is some code which helped to compile a graph of the amount of times the 20 most popular words are seen. This helps to visualize the sentiment analysis.
solarpower %>%
count(word, sort = TRUE) %>%
anti_join(stop_words) %>%
inner_join(get_sentiments("bing")) %>%
inner_join(get_sentiments("afinn")) %>%
filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) -> solarpowersentiment
## Joining, by = "word"
## Joining, by = "word"
## Joining, by = "word"
solarpowersentiment %>%
head(20) %>%
arrange(desc(n)) %>%
ggplot(aes(word, n, fill= n)) + geom_col() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
“Love” and “fallen” are the biggest outliers among the data… specifically “love” which is seen 20 times.
solarpower %>%
count(word, sort = TRUE) %>%
anti_join(stop_words) %>%
filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>%
wordcloud2()
## Joining, by = "word"
mean(pureheroinesentiment$value)->pureheroinemean
mean(melodramasentiment$value)->melodramamean
mean(solarpowersentiment$value)->solarpowermean
The mean value for the albums were: “Pure Heroine”= NA, “Melodrama”= -1.038462, “Solar Power”= 0.05405405 R Studio gave me NA for Pure Heroine and told me it was not numeric or logical.
album <- c('PureHeroine', 'Melodrama', 'SolarPower')
year <- c(2013, 2017, 2021)
meanvalue <- c("-0.4150943", "-1.038462", "0.05405405")
allmeans<- data.frame(album, year, meanvalue)
I then put the two sentiment value means that were given, and I was able to create a graph that would compare the mean sentiment values among the two albums which is shown below.
allmeans%>%
arrange(desc(meanvalue))%>%
ggplot(aes(album, meanvalue, fill= meanvalue)) + geom_col() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))