본문 바로가기
developStudy/덕질코딩

방탄소년단 노래 가사 시각화 (BTS Word Cloud)

by holaf 2021. 1. 10.
반응형

 

방탄소년단은 이번 BE 앨범을 이렇게 소개했습니다.

BE는 '~이다' '~되다' '존재하다' 뜻이 있습니다. BE는 방타소년단이 이순간 느끼는 감정, 생각, 그리고 앞으로 나아가야할 우리 존재에 대해서 이야기하는 앨범입니다. 타이틀곡 'Life Goes On'은 멈추지 않고 삶은 계속된다는 따뜻한 메시지를 담았습니다. 

Life goes on
Like an echo in the forest
Like an arrow in the blue sky
On my pillow, on my table
Life goes on like this again

 

결과물 Output

방탄소년단 BE 앨범에 나오는 노래 가사를 시각화한 워드클라우드를 만들었습니다. 따뜻하고 딥한 단어들이 한눈에도 많이 보이네요 :) 역쉬 방탄이야.

 

배경 Background

방탄소년단 노래에는 어떤 단어가 많이 쓰였을까 궁금했습니다. 방탄소년단은 프로듀싱이 가능한 그룹으로, 특히 이번 앨범에는 전 멤버가 작곡, 작사에 참여했다고 합니다. 방탄이 쓴 단어를 추려서 본다면, 방탄이 전달하려는 메시지가 어떤건지 파악하는데 조금 더 도움이 되지않을까싶어 시각화를 해봤습니다.

 

 

방탄이 이번 앨범에서 전달하는 메시지

  • Life Goes On : 삶은 계속 된다는 따뜻한 메시지
  • 내 방을 여행하는 법  : 방이 전부라면, 내 방을 내 세상으로 바꾸기
  • Blue & Grey : 내면의 우울감과 불안감을 표현
  • Skit : 빌보드 핫100 1위를 차지한 순간 느껴던 감정
  • 잠시 : 전세계 팬들과 만날 수 없는 시간
  • 병 : 갑자기 찾아온 쉼을 온전히 즐기지 못하고 불안해하는 직업병 상태
  • Stay : 어디에 있든 언제나 함께하기
  • Dynamite : 코로나로 힘든 시기, 사람들에게 춤과 노래로 에너지를 불어넣고 행복을 전달 

 

Process 과정

1. 데이터 수집: Beatuiful Soup, Selenium을 써서 방탄 가사를 웹페이지에서 자동으로 긁어온다.

2. 데이터 정제: konlpy를 써서 명사(단어)만 추출한다.

3. 데이터 시각화: wordcloud를 이용해서 시각화한다.

 

궁금하신 분은 제가 한 방법을 따라해주셔도 좋고, 더 좋은 방법이 있다면 댓글로 알려주셔도 물-론 좋습니다! (참고로 저는 주피터 노트북에서 작업했습니다)

 

1. 데이터 수집

#필요한 라이브러리를 불러옵니다.
from bs4 import BeautifulSoup
from selenium import webdriver

#크롬 웹드라이버의 경로를 설정해서 불러옵니다.
driver=webdriver.Chrome("./chromedriver")

 

저는 멜론 웹사이트에서 방탄 가사를 긁어올건데요.

우선 맨 첫 곡 Life Goes On 상세페이지 url은 www.melon.com/song/detail.htm?songId=33077234

그 다음 곡인 내방을 여행하는 법 상세페이지 url은  www.melon.com/song/detail.htm?songId=33077235

이네요. 여기서 url 규칙을 찾아낼 수 있습니다.

 

 

lyrics_list=[]

for i in range(4,12):
    d=33077230+i
    driver.get("https://www.melon.com/song/detail.htm?songId="+str(d))
    soup = BeautifulSoup(driver.page_source, "html.parser")
    
    #긁어올 가사부분의 selector를 설정 (웹페이지 inspect모드에서, 해당 부분을 찾아 copy selector누르면 됨)
    for x in soup.select("#d_video_summary"):
        lyrics_list.append(x.text)
    
lyrics_list

 

lyrics_list를 출력해보면 아래와 같이 가사가 긁어와진 것을 확인할 수 있어요.

후.. 하지만 딱 봐도 근데 제대로 출력되진 않은 것을 알 수 있는데요. 가사가 아닌 것도 보이고, 띄어쓰기가 제대로 안 돼있네요. 좀 더 정제가 필요하지만, 우선은 계속 가보겠습니다.

 

2. 데이터 정제

가사를 긁어왔으니, 이제 명사 단위로 쪼개줍니다.

#명사추출에 필요한 konlpy 라이브러리르 불러옵니다.
from konlpy.tag import Kkma
import collections
kkma=Kkma()

#추출한 명사를 리스트에 담아봅시다.
list_nouns=[]

for i in lyrics_list:
    list_nouns=list_nouns +kkma.nouns(i)
    
#워드클라우드 시각화를 위해선 데이터가 리스트 형태가 아닌, 통합된 문자열 형태여야 하기때문에, 추출했던 명사를 문자열에 넣어줍니다.
last_text=''

for i in list_nouns:
    last_text=last_text + " " + i

list_nouns 리스트 ->  last_text 문자열

#조금 더 정제된 리스트를 뽑아 보고싶다면,

import collections

collections.Counter(list_nouns).most_common(10)

BE 앨범에서 가장 많이 쓰인 단어 TOP 10

3. 데이터 시각화

#시각화에 필요한 라이브러리를 불러옵니다.
import matplotlib.pyplot as plt
from wordcloud import WordCloud

#한글이 깨지지 않게 폰트 경로를 설정해줍니다.
#NanumGothic.ttf의 경로를 찾아 넣어주면 됩니다.
wordcloud=WordCloud(font_path=".../NanumGothic.ttf").generate(last_text)

#본격 시각화
plt.figure(figsize=(12,12))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()

아래와 같이 결과물을 출력해볼 수 있습니다! 👏


Limitations/Further Study

부족한 데이터 정제

'우리' 가 4번밖에 안 쓰였다고?

명사 추출은 띄어쓰기를 기준으로 되기 때문에 처음에 추출한 lyrics_list를 한번 더 정제할 필요가 있습니다. 물론 수작업으로 띄어쓰기를 해줄 수 있겠지만... 그건 지속가능한 방법이 아니겠죠.. 왜 이렇게 되나 봤더니, 멜론에서 줄바꿈이 br로 되어있어서였습다. 다음번엔 웹스크래핑 단계에서 이 요소를 고려해 제대로 가사 데이터를 긁어올 수 있도록 데이터 수집 단계를 보완해야겠습니다.

 

색상 scale에 의미 더하기

아쉽게도 기본 템플릿으로 출력한 이 워드클라우드에서 색상은 별 의미가 없습니다. 색상 scale에 새로운 의미를 더하면 보다 흥미로운 시각화가 될 수 있지 않을까요?

 

Interactive한 워드클라우드

워드클라우드는 어디까지나 대략적 요약페이지입니다. 사람들은 한 depth 더 들어가서, 실제로 저 단어를 포함한 가사 문장을 보거나, 그 곡을 play해보고 싶을 수 있습니다. 이렇게 좀 더 Interactive한 시각화로 이 프로젝트를 발전하면 훨-씬 재밌는 프로젝트가 될 수 있지 않을까요?

 

Reference

인프런 강의 '청와대 청원 데이터 시각화' by 개복치개발

 

청와대 청원 데이터 시각화 - 인프런

파이썬을 이용해 데이터를 청와대 국민청원 데이터를 수집하여 시각화해봅니다. 초급 데이터 분석 웹 개발 Python 웹 크롤링 Selenium 데이터 시각화 온라인 강의 청와대 국민청원 데이터를 파이썬

www.inflearn.com

 

반응형

댓글