엑셀 파일 불러오기

library(readxl)
lyrics_df <- read_excel("C:/Users/chosun/Desktop/r data/lyrics_data.xlsx")
lyrics_df
## # A tibble: 40 × 4
##    song_id title             lyrics                                        type 
##      <dbl> <chr>             <chr>                                         <chr>
##  1       1 취중진담          그래 난 취했는지도 몰라 실수인지도 몰라 아침이면 까마득히 생각이 안나 불안해 … 사랑 
##  2       2 All For You       all for you ~ 벌써 며칠째 전화도 없는 너 얼마 후면 나의 생일 이란… 사랑 
##  3       3 내 여자라니까     나를 동생으로만 그냥 그정도로만 귀엽다고 하지만 누난 내게 여자야 니가 뭘 알겠… 사랑 
##  4       4 바보에게.. 바보가 너무 걱정하지는 마 보란듯이 살아볼거야 후회는 사치일 뿐이야 다시 시작해볼게 나… 사랑 
##  5       5 아로하            어두운 불빛아래 촛불 하나 와인 잔에 담긴 약속 하나 항상 너의 곁에서 널 지켜… 사랑 
##  6       6 비밀번호 486      한 시간마다 보고싶다고 감정없이 말하지 말아 흔하게 널린 연애지식은 통하지 않아… 사랑 
##  7       7 우주를 줄게       커피를 너무 많이 마셨나 봐요 심장이 막 두근대고 잠은 잘 수가 없어요 한참 뒤… 사랑 
##  8       8 연예인            나의 그대가 원한다면 어디든 무대야 유머러스한 남자가 요즘의 추세야 남자다운 남… 사랑 
##  9       9 선물              빛이 들어오면 자연스레 뜨던 눈 그렇게 너의 눈빛을 보곤 사랑에 눈을 떴어 항상… 사랑 
## 10      10 그대는 선물입니다 고요한 밤 하늘에 별이 빛나고 그대의 미소가 나를 감싸요 어둠 속 반짝이는 그 … 사랑 
## # ℹ 30 more rows
head(lyrics_df)
## # A tibble: 6 × 4
##   song_id title             lyrics                                         type 
##     <dbl> <chr>             <chr>                                          <chr>
## 1       1 취중진담          그래 난 취했는지도 몰라 실수인지도 몰라 아침이면 까마득히 생각이 안나 불안해 할… 사랑 
## 2       2 All For You       all for you ~ 벌써 며칠째 전화도 없는 너 얼마 후면 나의 생일 이란 … 사랑 
## 3       3 내 여자라니까     나를 동생으로만 그냥 그정도로만 귀엽다고 하지만 누난 내게 여자야 니가 뭘 알겠냐… 사랑 
## 4       4 바보에게.. 바보가 너무 걱정하지는 마 보란듯이 살아볼거야 후회는 사치일 뿐이야 다시 시작해볼게 나 … 사랑 
## 5       5 아로하            어두운 불빛아래 촛불 하나 와인 잔에 담긴 약속 하나 항상 너의 곁에서 널 지켜줄… 사랑 
## 6       6 비밀번호 486      한 시간마다 보고싶다고 감정없이 말하지 말아 흔하게 널린 연애지식은 통하지 않아 … 사랑

가사 데이터 전처리

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(stringr)
library(tidytext)

lyrics_df <- lyrics_df %>%
  mutate(
    lyrics = str_replace_all(lyrics, "[^가-힣a-zA-Z\\s]", " "),
    lyrics = str_squish(lyrics),
    lyrics = str_to_lower(lyrics)
  )

tokens <- lyrics_df %>%
  unnest_tokens(word, lyrics, token = "words")

korean_stopwords <- c(
  "의", "가", "이", "은", "들", "는", "좀", "잘", "걍", "과", "도", "를", "으로", "자", "에",
  "와", "한", "하다", "뿐", "에서", "까지", "에게", "든", "다면", "또한", "더", "지만",
  "나", "너무", "만", "어서", "면서", "뿐만", "그냥", "요", "하다가", "한테", "이랑", "인데",
  "입니다", "있다", "없다", "같다", "되다", "하다", "되었다", "하였다", "했다",
  "하면", "해야", "하고", "해서", "합니다",
  "그", "이", "내", "너", "있다", "하다", "데", "고", "걸", "줄", "수", "날", "넌", "난", 
  "돼", "마", "다", "항상", "오직", "취향저격", "되어", "때문에", "위한", "보면", "아냐",
  "보고", "오늘도", "그때", "말했잖아", "혹시", "준", "될", "거라고", "때로는"
)

data("stop_words")

tokens <- tokens %>%
  filter(!word %in% stop_words$word) %>%        
  filter(!word %in% korean_stopwords) %>%
  filter(str_detect(word, "^[가-힣]+$"))

단어 빈도 요약

library(dplyr)
tokens_summary <- tokens %>%
  count(type, word, sort = TRUE)

TF-IDF 계산

library(tidytext)
word_tf_idf_by_type <- tokens_summary %>%
  bind_tf_idf(term = word, document = type, n = n)

주제별 대표 단어 추출

top_words <- word_tf_idf_by_type %>%
  group_by(type) %>%
  slice_max(order_by = tf_idf, n = 50) %>%
  ungroup()

시각화

library(wordcloud)
## Loading required package: RColorBrewer
library(RColorBrewer)

사랑 노래 가사

love_words <- top_words %>% filter(type == "사랑")

set.seed(1234)
wordcloud(words = love_words$word,
          freq = love_words$tf_idf,
          min.freq = 1,
          scale = c(4, 0.7),
          random.order = FALSE,
          colors = brewer.pal(8, "Reds"))

이별 노래 가사

breakup_words <- top_words %>% filter(type == "이별")

set.seed(1234)
wordcloud(words = breakup_words$word,
          freq = breakup_words$tf_idf,
          min.freq = 1,
          scale = c(4, 0.7),
          random.order = FALSE,
          colors = brewer.pal(8, "Blues"))