Taylor Swift has dominated the pop and country music industries since the release of her debut album “Taylor Swift” in 2006 at 17 years old. Her second album “Fearless” was released in 2008 when Swift was 18 years old. Swift’s overall popularity and fan base grew immensely following the Fearless release. Swift is most well known for her music being centered around themes of love, relationships and heartbreak. Similarly to Swift, popular new artist Olivia Rodrigo released her first album “Sour” in 2021 at the age of 18. The album parallels Swift’s “Fearless” because the songs in both albums detail each artists’ high school love, relationship and heartbreak experiences. I thought it would be interesting to compare Swift’s “Fearless” and Rodrigo’s “Sour” since both albums explore the idea of young love and relationships, and were released at similar stages in each artist’s lives (both ages 18).
I predict that both albums will contain top lyrics under the theme of love, but that Rodrigo’s “Sour” will depict more heartbreak related words that are more negative and angry in sentiment. On the other hand, I predict that Swift’s “Fearless” will depict a more positive outlook on relationships and love, containing blissful and hopeful sentiment in its lyrics.
With the help of Professor Walsh, I obtained my lyrics for both albums via Python from the Genius API.
First, I will install the necessary packages to code. Then,I will download the lyrics for “Fearless” and “Sour” respectively:
library(tidytext)
library(readr)
library(textdata)
library(jsonlite)
library(dplyr)
library(ggplot2)
library(wordcloud2)
fearless <- fromJSON("Lyrics_Fearless.json")
as.data.frame(fearless) -> fearless
fearless$tracks.song -> lyrics_fearless
sour <- fromJSON("Sour.json")
as.data.frame(sour) -> sour
sour$tracks.song -> lyrics_sour
lyrics_fearless %>%
unnest_tokens(word, lyrics) -> fearless_words
lyrics_sour %>%
unnest_tokens(word, lyrics) -> sour_words
I will analyzing Swift’s “Fearless” album to begin the lyrical comparison. First, I coded to create a table with the top 15 most frequently appearing lyrics on the album. I chose to filter out words that were not contained in the song lyrics, but rather were a part of the song descriptions or artist names.
fearless_words %>%
anti_join(stop_words) %>%
filter(!word %in% c("verse", "chorus", "outro", "lyrics", "bridge", "taylor", "swift", "colbie", "pre", "caillat", "1", "2", "3")) %>%
count(word) %>%
arrange(desc(n)) %>%
head (15) %>%
knitr::kable()
| word | n |
|---|---|
| fearless | 30 |
| la | 26 |
| love | 25 |
| feel | 22 |
| hidden | 19 |
| message | 19 |
| baby | 16 |
| time | 16 |
| belong | 14 |
| loved | 13 |
| fifteen | 12 |
| rains | 12 |
| feeling | 11 |
| forever | 11 |
| breathe | 10 |
As expected, in this top 15 appear common relationship type of words such as “love”, “baby” and “loved.” Other popular words include some of her song titles, such as “fearless”, “fifteen” and “breathe.” The top word found in the lyrics on the album is “fearless” appearing 30 times, hence the album title and one of its most popular songs. The words “la” at 26 and “love” at 25 followed.
Next, from this table, I continued the code to create a word cloud to visualize the top lyrics from the album. I filtered out the same words from above.
fearless_words %>%
anti_join(stop_words) %>%
filter(!word %in% c("verse", "chorus", "outro", "lyrics","bridge", "taylor", "swift", "colbie", "caillat","pre", "1", "2","3")) %>%
count(word) %>%
arrange(desc(n)) %>%
wordcloud2()
After looking at the most frequently appearing words in the album’s lyrics, I next created a chart to enable me to look at the lyrics sentiment for the top six words found on songs throughout the album.
fearless_words %>%
anti_join(stop_words) %>%
filter(!word %in% c("verse", "chorus", "outro", "lyrics", "bridge","taylor", "swift", "colbie", "caillat", "1", "2", "3")) %>%
inner_join(get_sentiments('nrc')) %>%
count(word, sentiment, sort = TRUE) %>%
head(15) %>%
ggplot(aes(word, n, fill = sentiment)) + geom_col()
For the most part, each lyric has one or two sentiment meanings attached, like “time” correlates with the feeling of anticipation and “baby” has a positive and joyful sentiment attached to it. The word “feeling” is interesting to look at because it relates to all seven sentiments.
Now, I will analyze Rodrigo’s “Sour” album. Here, I coded to create a table with the top 15 most frequently appearing lyrics on the album. I chose to filter out words that were not contained in the song lyrics, but rather were a part of the song descriptions.
sour_words %>%
anti_join(stop_words) %>%
filter(!word %in% c("verse", "chorus", "outro", "lyrics", "bridge", "1", "2","3")) %>%
count(word) %>%
arrange(desc(n)) %>%
head (15) %>%
knitr::kable()
| word | n |
|---|---|
| ah | 33 |
| ooh | 26 |
| yeah | 19 |
| hope | 17 |
| love | 17 |
| guess | 14 |
| jealousy | 14 |
| ha | 13 |
| god | 12 |
| happy | 11 |
| déjà | 9 |
| loved | 9 |
| vu | 9 |
| girl | 8 |
| hate | 8 |
In this top 15 appear relationship type of words such as “love”, “girl” and “loved.” But other words such as “jealousy” and “hate” hint at the songs revolving more around breakups, not so much about being in love. Other popular words include some of Rodrigo’s song titles, such as “deja vu” and “jealousy, jealousy.” The top word found in the lyrics on the album is “ah” appearing 33 times. The words “ooh” at 26 and “yeah” at 19 followed.
Next, from this table, I continued the code to create a word cloud to visualize the top lyrics from the album. I filtered out the same words from above.
sour_words %>%
anti_join(stop_words) %>%
filter(!word %in% c("verse", "chorus", "outro", "lyrics", "bridge", "1", "2","3")) %>%
count(word) %>%
arrange(desc(n)) %>%
wordcloud2()
After looking at the most frequently appearing words in the album’s lyrics, I next created a chart to enable me to look at the lyrics sentiment for six words found on songs throughout the album.
sour_words %>%
anti_join(stop_words) %>%
filter(!word %in% c("verse", "chorus", "outro", "lyrics", "bridge", "1", "2","3")) %>%
inner_join(get_sentiments('nrc')) %>%
count(word, sentiment, sort = TRUE) %>%
head(15) %>%
ggplot(aes(word, n, fill = sentiment)) + geom_col()
In this lyrics sentiment analysis, each word has more than one sentiment attached, except for “guess”. The words on this sentiment chart lean more toward negative emotions like fear, disgust and anger. Of all of the words, “love” is the most interesting because it is split between a positive and negative sentiment.
Overall, my hypothesis I predicted is accurate because while both albums contained top lyrics related to young love and relationships, Swift’s “Fearless” returned overall more positive and hopeful lyric sentiments, while Rodrigo’s “Sour” returned lyrics attached to a more negative sentiment.
Despite the albums being written and released during very similar stages in each artist’s lives and music careers, there are thematic differences in Swift and Rodrigo’s thoughts and songs about love and relationships. In “Fearless”, it is evident that Swift places more hope and joy in areas of love in her high school years and early adulthood, while “Sour” depicts the sadder reality of heartbreak and failed relationships during this same era.