파이썬으로 단어구름 만들기! feat.힙합플레이야 6개월 키워드 언급량 알아보기 (BeautifulSoup, selenium)

2020. 4. 19. 18:42#개발 발전소

반응형

# 파이썬(Python) 왜 배움?

 대학교 중앙도서관에서 아르바이트하던 친구에 의하면 요즘 파이썬 관련 도서를 대여해가는 사람들이 압도적으로 늘었다고 한다. 체감상 대여량이 5배는 늘은 것 같다고... 10년 뒤에는 개발 직군이든 아니든 신입사원들이 전부 PPT, Excel처럼 파이썬을 다루는 거 아니냐는 우스개소리를 했었는데 약간 진짜가 될 것 같은 불안함에 ^^... 자주 애용하는 탈잉에서 Python을 배워보고 있다!

 

 게다가 IT회사에서 일하다 보니 개발자의 언어에 익숙해져야 한다는 절실함이 점점 커져갔다. 사실 나의 직무와 직접적으로 연관이 있는 것은 SQL인데 책만 사놓고 기본적인 함수(Where... from... 뭐시기저시기)만 보고 흥미를 갖지 못해서 잠시 멈춰두었다.

 

 탈잉의 오프라인 강의의 장점은 현업과 가까운 일반인들의 실습 중심 강의라는 것이다. 내가 수강하고 있는 강의의 커리큘럼도 보면 매우 실습 위주로 이루어져있다. 탈잉이 아무래도 일반인들이 재능 교육을 하는 곳이니 퀄리티가 튜터들마다 천차만별인데, 커리큘럼과 예시로 공개하는 작업물을 꼭 잘 읽어보고 수강하는 편이라 지금까지 수강한 7~8개 강의 전부 다 모두 대만족 했다. 책으로만 배운 SQL은 이걸 어떻게 활용해먹으면 좋을지 감이 잘 안 잡히고 재미도 없게 꾸역꾸역 했는데, Python은 덕질을 위한 코딩을 하다보니 아주 재밌고 유익하다. 

 

https://taling.me/Talent/Detail/4466

 

[5월반 모집중] Python으로 "에이스"되기 #비전공자 #웹크롤링 #업무자동화 | 탈잉

※※ 코로나 바이러스 예방을 위해 다음을 약속드립니다. ※※ ※ 1. 수업시간 마스크 착용을 의무화합니다. ※ 2. 개인 사비를 들여 기존보다 더 넓은 스터디룸을 대관합니다. ※ 3. 개인 장비 (노트북, 마우스, 스마트폰 등) 를 소독하기 위한 일회용 알콜 티슈를 매주 제공해드립니다. ※ 4. 손 세정제를 강의실 내에 비치합니다. ※ 5. 강의실 입실 전 책상, 의자 등에 소독제를 뿌려 살균합니다. ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

taling.me:443

# 단어 구름이 뭐임?

오바마 대통령 취임 연설에 등장한 빈출 키워드 (출처: http://visualoft.kr/tag-cloud/)

 빈출 키워드를 재미있게 시각화한 것이라고 정리할 수 있을 것 같다. 솔직히 말하면 나는 위와 같은 단어 구름을 만들기 위해서 디자이너가 뼈를 갈아 만드는 줄 알았다. 노가다로 단어 수를 세고, 시각화는 디자이너가 온갖 조합을 해서 만드는 줄. 그런데 파이썬으로 코딩만으로 단어 구름을 만들 수 있다는 것이 아닌가?! 보통 대통령들의 연설이나 검색량을 알아볼 때 이런 단어 구름을 많이 쓰는데, 그래서 수업에서 실습 과제는 '네이버 기사의 빈출 키워드'를 단어 구름으로 만드는 것이었지만 원래 인생을 윤택하게 만드는 데에는 덕질이 최고다! 그래서 뭘 해볼까 하다가 우리나라에서 제일 언급이 많은 힙합 아티스트는 누구였을까? 가 궁금해졌다. 

# 그래서 어떻게 했는데?

 실습과 최대한 유사하게 하려면(그래야 참고할 힌트가 많아서 쉬우니까) 네이버 기사에 언급된 것 중에 가져오는 것이 편했다. 하지만 내가 궁금한 건 힙합을 좋아하는 사람들이 제일 관심을 가지고 있는 아티스트가 누구인지였고, 네이버 기사에는 PR성 기사들이나 방송에 나온 이유만으로 언급하는 경우도 많았기 때문에 다른 더 좋은 방법을 찾고 싶었다. 

 

네이버 기사로 했다가는 '펭수'가 가장 언급이 많은 힙합 아티스트로 선정되게 생겼다! 

 

1. 분석할 사이트 선정

 국내 힙합 팬들을 위한 커뮤니티로 내가 알고 있는 것은 3개가 있는데 힙합플레이야(HIPHOPPLAYA), 힙합엘이(HIPHOPLE), 디시인사이드갤러리 사실 자주 들어가서 보는 편은 아니라 제일 먼저 생각난 힙합플레이야에 있는 게시판에서 언급된 키워드를 분석하기로 했다. (지금 힙합엘이에 들어가 봤는데, 국내/국외 게시판이 나눠져 있어서 사실 더 적합한 건 힙합엘이였을 것 같다...)

 

2. 게시판 구조 분석하기

 우선 키워드를 수집할 컬럼을 선정해야 하는데, 가장 중요한 곳은 '제목' 부분이 되겠다.

 그런데! 구조를 분석하면서 깨달은 문제점이 있었는데 나는 1페이지, 2페이지, 3페이지... 모든 페이지를 들어가서 단어를 크롤링한 후 단어 구름을 만들 생각이었는데 힙합플레이야의 HIPHOP-TALK 게시판에 글이 너무 많아서 페이지도 1000페이지 넘게 있다는 것이었다. 그리고 내가 궁금한 것도 전체 역사 상 언급량을 알고 싶다기보단 최근 1년 정도 안에 가장 언급량이 많은 아티스트였다. 때문에 날짜를 함께 따와서 2019-2020년도만 필터링을 하고 싶었는데, HTML 코드를 뜯어보니 작성시간과 제목을 한꺼번에 어떻게 가져와야 하는지 방법을 모르겠었다. 

 게시글마다 id값이 지정되어있고, class는 "list_table_row relative list_table_row"라는 값이 다른 게시글에도 붙어 있었다. 그래서 이것저것 방법을 알아보다가 나는 초짜이기 때문에 타협을 하기로 했다. "2019-2020 필터링은 포기하고 제목 값만 뽑아오는데, (대충) 50페이지까지만 뽑아오자!" 고. 왜냐하면 작성일자 값이 단순히 YY-MM-DD로 통일되어있던 것이 아니고, 오늘 올라온 글은 hh:mm으로 시간이 표시되는 구조라 나는 이 관문을 통과할 수 없었다^^... 

 

 그리고 또 문제가 있었는데, 1페이지~50페이지 값을 뽑아오려고 하니 고정된 공지가 6개가 있다는 것이었다! 즉 페이지의 제목 값을 뽑아올 때마다 공지 값은 중복으로 뽑아올 것이고, 이는 언급량에도 영향을 미칠 것이 분명했다. 때문에 이 공지는 아얘 데이터 수집 대상에서 제외하는 것으로 결정했다.

 

 

 HTML 코드를 뜯어보고 타협한 결과, 결국 언급된 키워드 데이터로 수집할 것은 아래와 같다. 

'힙합플레이야'의 HIPHOP TALK 게시판의 1페이지부터 50페이지의 제목 값을 고정된 공지 6개를 제외하고 수집

3. BeautifulSoup Module 이용하기 (실패)

 호기롭게 BeautifulSoup로 제목을 잘 크롤링해내고 뿌-듯해하고 있던 순간, 데이터 값을 자세히 보니 뭔가 이상했다. 바로 분명 1페이지, 2페이지, 3페이지 데이터 값을 뽑아오긴 했는데 1페이지에서 가져온 제목 데이터나 2페이지에서 가져온 제목 데이터가 똑같다는 것이다. 여러 이유를 찾아보려 했지만 뭔가 힙합플레이야에서 크롤링을 막아뒀거나 여튼 뭔가의 이유로 계속 같은 데이터값을 뽑아내는 상황이었고, 사실 여기까지 뽑아낸 것만으로도 뿌듯함이 치사량에 달해서 그만두고 싶었지만 어떻게든 단어 구름을 뽑아내고 싶었다.

 

4. Selenium Module 이용하기 (성공)

 selenium은 컴퓨터에게 직접 Chrome을 열어서 1페이지, 2페이지, 3페이지를 클릭해서 값을 긁어오도록 하는 점이 BeautifulSoup와 다르다. 어떤 화면에 접근할 때 메일함이나 티켓팅 화면 등과 같이 로그인이 필요한 곳에서 '매크로'처럼 활용되는 것 같은데, 때문에 속도가 더 느리다고 한다. 그래서 가급적 BeaufiulSoup를 이용해 크롤링을 해오고 싶었지만 안되니까 하는 수 없이 selenium을 썼는데 코드 구성은 크게 다르지 않은데 명령어(라고 하는지 확신은 없지만) 형식이 좀 다르다. 위 코드를 실행하니 1페이지부터 50페이지까지 제목을 잘 긁어왔고, 상단 공지 6개도 출력하지 않는 것을 확인했다. 거의 다 왔다! 

 

5. konlpy module 활용하여 단어구름(word cloud) 만들기

from konlpy.tag import Twitter
from collections import Counter

#형태소 분석
splitter = Twitter()
nouns = splitter.nouns(output_total)

#단어 빈도수 카운트
count = Counter(nouns)

#사진 가져오기
import numpy as np
from PIL import Image
coloring = np.array(Image.open("wordCloud_hiphop.jpeg"))

#사진 색깔 뽑아오기
from wordcloud import ImageColorGenerator
image_colors = ImageColorGenerator(coloring)

#단어 구름 만들기
from wordcloud import WordCloud
wordcloud = WordCloud(font_path="Daum_SemiBold.ttf", mask=coloring, background_color='white').generate_from_frequencies(count)

#이미지 띄우기
import matplotlib.pyplot as plt
plt.figure(figsize=(15,15)) #10,10 하면 좀 작아서 깨지고 20,20은 너무 과하게 크더라. 추측이지만 cm인 것 같다.
plt.imshow(wordcloud.recolor(color_func=image_colors))
plt.axis('off')
plt.savefig('wordcloud_final.jpg')
plt.show()

 이 단계는 그냥 konlpy(형태소 추출 후 단어 구름 만드는 module) 이용 법대로 그대로 따라서 쓰기만 했다. 사이즈 지정할 때, 숫자를 뭘로 지정하면 좋을지 궁금해서 여러 개 도전해봤는데 코드 블록 안에도 써놨지만 figsize=(10, 10)은 조금만 확대해도 깨지는 감이 있었고, 15, 15가 딱 적당했다. ps. 비개발자로서 개발자들의 이런 공유는 너무 부럽고 놀랍다. 단어 구름을 편리하게 만드는 module을 만들고 공유까지 하다니 개발자를 움직이는 원동력은 뭘까 생각하게 된다. 

# 그래서 결과가 어땠어?

2019.11.03 ~ 2020.04.18 (사실 정확히 말하면 내가 코드를 돌린 시점에 힙합플레이야 1~50페이지) 기간 동안 언급량이 가장 많았던 키워드

 언급이 많이 된 국내 아티스트들은 노란색으로, 국외 아티스트들은 분홍색으로 표시했다. 풀네임이 아닌 일부만 키워드로 인식한 경우도 있어서 어느 정도 뇌피셜이 함유되어있다. 정확한 언급 수는 모르고 시각화된 이미지만 보이기 때문에 다음부터 작성하는 아티스트 순서에는 아무 의미가 없다. 참고로 konlpy는 한국어가 대상이므로 영어로 기입된 경우에는 형태소로 인식하지 못하여 단어 구름 내에도 포함되지 않았다. 예를 들어 DPR이라고 적은 경우 '디피알라이브'를 지칭함이 명백함에도 누락되었을 것이다. 

스윙스, 도끼, 키드밀리, 기리보이, 차붐, 슬리피, 팔로알토, 던말릭, 상구, 딥플로우, 빈지노, 이센스, 원슈타인, 창모, 보이콜드(뇌피셜), 염따, 디피알라이브, 제이호, 더콰이엇, 오왼, 저스디스, 이현준, 배치기, 베이식

국외 - 위켄드, 에미넴, 투팍, 켄드릭라마, 포스트말론, 맥밀러, 식스나인, 드레이크

# 소감이 어때?

 우선 초보자에게는 거의 7시간 정도가 걸릴 만큼 고된 작업이었지만 너무 재미있었다. 파이썬의 무궁무진함을 알아볼 수 있던 시간? 그리고 논리적으로 설계하고 문제점을 해결해서 결과물을 얻어내는 과정에 집착하는 개발자의 마음을 조금 이해할 수 있었달까. 내 눈엔 잘못된 게 안 보이는데 코드가 안 돌아갈 때의 그 답답함과 막막함... 코딩은 생각보다 더 어렵고 더 재밌고 더 뿌듯하다! 그렇다고 개발자가 될 생각은 아직 없다 ^^! 익숙하지 않은 것을 할 때의 그 힘듦이 버겁다 하하.

 

 결과에 대해서는 사실 6개월인 데다가 힙합 팬들이 모두 힙합플레이야를 하는 것도 아니고, 게시글을 쓰는 것도 아니기 때문에 실제 관심을 그대로 반영한다고는 할 수 없겠지만 몇몇 꼭 들어가 있을 거라 생각했던 아티스트들이 없어서 의아했다. 당연히 있을 거라 생각한 다듀, 나플라, 루피, 씨잼, 코쿤, 지코, 펀치넬로 등? 암튼 코로나가 얼른 잠잠해져서 공연 보러 가고 싶다! 코로나가 쏘아 올린 파이썬 공과 그동안 친하게 지내야지 T_T

 

2020 페스티벌은 연기됐다. 날짜는 미정

반응형