brunch

You can make anything
by writing

C.S.Lewis

by 최규민 Apr 15. 2016

브런치 작가 추천과 Word2Vec

브런치 Following(관심작가) 정보로 아이템 기반 추천 만들어 보기

이전 구독자의 목소리가 보여@@ 포스팅을 쓸 때부터, 내가 좋아하는 브런치 작가와 유사한 작가를 추천해 주는 아이템 기반 추천을 간단히 만들어 보고 싶었는데, 이제야 만들었다. (간단하게 끝날 줄 알았는데 데이터 수집부터 결과 화면 출력 UI까지 다 할려니 시간이 좀 걸렸다.)


브런치 유사한 작기 찾기 : http://b2v.historie.kr/

http://b2v.historie.kr/ 접속화면



 이렇게 구현한 추천 데모는 아래 그림과 같이 데이터 수집, 추천 모델, 추천 API, 사용자 UI로 나누어져 구현되었으며, 이 과정은 일반적인 추천 시스템과 비슷한 구현의 과정을 가진다. 참고로 지금 언급되는 추천 데모는 대부분 Python을 이용하여 구현하였다. (퀵하게 프로토 타이핑해보기에 파이썬은 짱인듯하다!!)


데이터 수집

 추천 시스템은 일반적으로 많은 사용자의 기호 정보를 바탕으로 추천 모델을 구현한다. 브런치에서는 사용자의 기호 정보는 읽은 글, likit한 글 , 관심작가로 등록한 작가 리스트 등이 될 수 있는데, 브런치 사이트에서 사용자의 관심 작가 리스트를 익명으로 접근할 수 있기에,  Selenium(크롤링), Beautiful Soup(파싱) 파이썬 패키지로 Recursive 하게 데이터를 수집하여 추천 모델을 만들었다.


추천 모델

 이렇게 수집한 사용자의 관심작가 리스트는 자연어 처리 머신러닝 인 Word2Vec을 추천 모델에 적용하여 구현하였다. Word2Vec은 학습할 문서 corpus안의 문장에서 동시에 많이 출현하는 단어일수록 두 단어 간의 Vector값이 가깝도록 학습이 되는 특성이 있는데, 이런 특성을 추천 시스템에 사용하기 위해 개별 사용자의 관심작가 리스트는 문서(document)관심작가 리스트의 작가 ID는 단어(word)로 치환하여 학습할 Corpus로 만듦으로써 추천 모델에 적용하였다(좀 더 자세한 방법은 "추천 시스템이 Word2Vec을 만났을 때"슬라이드를 참고하길 바란다) 이렇게 학습된 Word2Vec 모델(이제는 작가ID2Vec)을 활용하면  내가 좋아하는 작가와 유사한 작가를 추천해 주는 아이템 기반 추천 모델을 구현할 수 있다. 학습 결과로 총 3,499명의 작가에 대하여 추천을 제공해 줄 수 있다.

word2vec 학습 데이터셋 정보
 - 333,761 건 관심작가 ID
 - 31,989명 사용자
 - 3,499명 작가ID가 학습됨


추천 API

이렇게 만들어진 추천 모델을 Flask-Restful 패키지로 랩핑하여 네가 좋아하는 작가와 유사한 작가를 추천해 주는 Most-Similar API를 구현하였다. 아래와 같이 요청하는 작가 ID와 유사한 작가의 메타 정보(ID, 작가명 등) 20개를 결과로 제공하는 API이다.  

추천 API : http://b2v.historie.kr:1218/most_similar/goodvc78

사용자 UI

Front-UI는 가장 만만한 Bootstrap Theme에서 이미지만 바꿔 심플하게 구현하였다.



최규민(goodvc78) 유사한 작가는?

사용방법은 자신이 관심 있어하는 브런치 ID 입력하면 유사한 작가를 찾아준다. 저의 아이디(goodvc78)를 입력하였더니 데이터 분석과 개발, IT 관련 작가를 찾아 준다.


공돌이 최규민(goodvc78) to 감성이 있는 이용현(brunch1uhl) 작가님까지

"goodvc78~brunch1uhl"

메마른 공돌이 브런치 작가(goodvc78)부터 감성이 있는 이용현(brunch1uhl) 작가님까지 변해 가는 과정에 어떠한 작가님들이 있는지 확인할 수 있다. (이렇게 vector 간 관계를 해석하는 것이 word2vec으로 작가를 Embedding 하였을 때의 가장 큰 장점이라고 생각한다.)

최규민(goodvc78) 작가 + 이용현(brunch1uhl) 작가님을 더했을때?

"goodvc78:brunch1uhl"

공돌이(goodvc78) + 인문학이(brunch1uhl) 더해졌을 때 어떠한 작가가 있을까?   

참고로 현재 크롤링한 데이터는 2016년 3월 말에 수집된 데이터로 현재의 값과는 조금 상이할 수 있다.


이 추천데모는 약 3만명 기호 데이터를 수집하여 추천 모델을 학습했는데 그리 많지 않은 데이터 임에도 불구하고 개인적으로는 의미 있는 추천 결과가 나오는듯 했다. 좀더 많고 다양한 사용자 기호 데이터가 있다면 훨씬 더 정교하고 의미 있는 추천(작가가 아닌 글을 추천)을 할 수 있지 않을까 생각해본다.

 그리고 이전부터 많이 공감하는 부분이지만  WordVec으로 학습된 추천 모델은 기본적인 유사한 아이템 찾기 뿐만 아니라 Vector(작가) 간의 의미 해석, 군집화를 통한 많은 장르 발굴등 다양한 개인화 추천의 구현할 수 있을듯하다.  

 우리나라는 추천 시스템을 구현해 볼 수 있는 양질의 공개된 데이터 셋이 부족한데 지금처럼 웹에서 오픈된 데이터라면 학술의 목적으로 대량의 데이터셋을 공개해 주면 좀 더 잉여력을 바탕으로 하는 다양한 연구 결과가 나오지 않을 생각해 본다.
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari