Beer Galaxy

beer-gal

Demo, Github

Beeradvocate에서 수집한 데이터로 맥주의 은하수를 그려보았다.

전처리 과정

1. doc2vec 알고리즘을 사용하여 117705개의 맥주 각각에 달린 리뷰들(1개의 리뷰가 달린 맥주부터 많게는 3701개의 리뷰가 달린 Dogfish Head Brewery의 90 Minute IPA까지 다양한 크기의 리뷰들이 있었다.)을 사용하여 해당 맥주를 300차원의 vector로 나타냈다.

2. 각각의 맥주 벡터를 t-SNE를 사용하여 2차원으로 folding(sparsity는 0.001225, iteration 1000번에 최종 에러는 6.149086)하였다.  리뷰 텍스트 이외의 정보를 이용한(예컨데 어느 나라 맥주인지 같은) 휴리스틱은 일절 사용하지 않았다.

시각화 요소

1. 각 원의 위치(x, y 좌표)는  2차원 평면에서 각 맥주의 리뷰의 평균적인 의미를 나타낸다. 두 맥주가 가깝다면, 두 맥주의 리뷰가 의미상으로 비슷하다는 뜻이다. 상대적인 값으로, 원들간의 거리에만 의미가 있지 절대적인 좌표에 의미는 없다.

2. 각 원의 색은 그 맥주의 스타일을 의미한다. Beeradvocate가 정의하는 104가지나 되는 맥주 스타일을 color coding 할 수는 없었으므로 가장 개체수가 많은 스타일 상위 20개를 추렸다. 이 20개의 스타일에 속하지 않는 맥주는 검은색으로 표시된다.

3. 각 원의 크기는 그 맥주의 리뷰 개수를 의미한다. 또한 크기가 클 수록 원은 투명해진다. 둘 다 선형 함수로 매핑되어있다.

4. 12만개의 노드를 d3로 그리면 느리기 때문에 리뷰 개수가 20개 이상인 12916개의 맥주에 대해서만 원을 그렸다. 추후에 WebGL을 공부해서 다시 그려볼 예정이다.

 

Word2Vec (2)

하지만, 시간이 지남에 따라 세상은 사람조차 스스로 어떻게 하는지 모르는 영역을 요구하기 시작했다.

저번 글에서 언급한대로 나무위키의 데이터베이스를 사용하여 Word2Vec 모델을 세워보았다. 나무위키 말고 다른 말뭉치(Corpus)를 사용하고 싶었으나, 한국어로 된 마땅한 말뭉치가 없어서(세종 코퍼스는 Raw Text가 아닌 XML로 묶여있고, 코퍼스가 파편화 되어있으며, 어휘량도 많지 않아보여서 패스했다.) 결국 나무위키 데이터베이스를 사용하였다.

모델의 아키텍쳐로는 Gensim이 제공하는 cbow와 skipgram중 skipgram을 사용하였다. Feature Vector의 크기는 300이 넘어가면 정확도의 변화량이 미미하다고 해서 300으로 설정하였다. Vocabulary로는 Gensim의 models.phrases로 token들을 한번 묶어서 bigram vocabulary를 사용하였다.


2015-07-27 17:40:12,095 : INFO : training model with 8 workers on 782573 vocabulary and 300 features, using 'skipgram'=1 'hierarchical softmax'=1 'subsample'=0 and 'negative sampling'=0
2015-07-27 17:40:18,615 : INFO : PROGRESS: at 0.03% words, alpha 0.02500, 17977 words/s
...
2015-07-27 20:05:44,042 : INFO : PROGRESS: at 93.31% words, alpha 0.00171, 40912 words/s
2015-07-27 20:05:44,046 : INFO : training on 357238956 words took 8732.0s, 40912 words/s

↑ 로그파일 일부

트레이닝하는데 약 2시간 20분이 소요되었고,  bigram vocabulary를 만드는데는 약 1시간 40분이 소요되었다. (총 4시간)

데모는 링크에서 확인할 수 있다.

몇몇 쿼리들에 대한 저번 글에서 인용한 나무위키 + 한국어 위키백과 기반 모델과의 비교표를 작성하면서 마친다.

 데모http://w.elnn.kr/
버락_오바마-미국+러시아블라디미르/Noun_푸틴/Noun-
버락_오바마-미국+스타워즈아나킨/Noun_스카이워커/Noun-
아카라카-연세대학교+고려대학교입실렌티/Noun입실렌티/Noun
아이폰-휴대폰+노트북아이패드/Noun아이패드/Noun
컴퓨터공학-자연과학+인문학법학/Noun게임학/Noun
플레이스테이션-소니+마이크로소프트엑스박스/Noun_360/NumberMSX/Alpha
한국-서울+파리프랑스/Noun프랑스/Noun
컴퓨터-기계+인간운영체제/Noun일반인/Noun
게임+공부프로그래밍/Noun덕질/Noun
박보영-배우+가수애프터스쿨/Noun허각/Noun
밥+했는지끓였/Verb저녁밥/Noun
사랑+이별그리움/Noun추억/Noun
삼성-한화노트북/Noun후지필름/Noun
소녀시대-소녀+아줌마아이유/Noun에이핑크/Noun
수학-증명경영학/Noun이산수학/Noun
스파게티-소시지+김치칼국수/Noun비빔국수/Noun
아버지-남자+여자어머니/Noun어머니/Noun
아이유-노래+연기송중기/Noun송중기/Noun
안드로이드-자유iOS/Alpha아이폰/Noun
우주-빛태양계/Noun_밖/NounNASA/Alpha
인간-직업짐승/Noun볼뉴르크/Noun
최현석_셰프-허세+셰프이연/Noun_복/Noun-
패스트푸드-체인점영국/Noun_요리/Noun철물/Noun

밥+했는지의 경우 는지/Eomi가 붙는 밥에 관련된 용언(끓였/Verb, 볶았/Verb, 구웠/Verb)들이 제시되었다.

(버락_오바마-미국)의 feature vector가 [지도자 벡터]를 잘 표현하는듯 하다. [지도자 벡터] + 국가를 하면 해당 국가의 지도자(일본=>아베 신조, 한국=>이명박, 중국=>시진핑)가 높은 정확도로 등장했다.

삼성-한화의 경우 나무위키에 야구 관련 document가 많아서 삼성에서 [야구팀 벡터]를 제거한 결과가 나온듯 하다.

컴퓨터-기계+인간의 경우 운영체제가 인간이 결정하는 여러 Policy들에 의해서 만들어진것을 감안했을때 만족스러운 대답이었다.

Word2Vec

word2vec은 Efficient Estimation of Word Representations in Vector Space에서 제안된 알고리즘을 구현한 구현체다.

Corpus를 Recurrent Neural Network(RNN)를 통해 train해 각 type의 feature vector를 뽑아낸다. 즉, type의 문맥적 특성을 정량화해서 연산이 가능하게 만든 것이다.

지금 주로 사용하는 Conoha VPS로는 내가 들고있는 corpus를 train하는데 Computing Power가 부족해서 동아리 서버에 환경을 마련한 뒤 트레인 해 볼 생각이다

환경은 마련했고, 조촐한 Demo 사이트를 열어놓았다.

현재는 나무위키 모델이 올라가있다. 다음 글 참조

구글이 pre-trained model을 제공하는지라(python gensim이 memory-friendly하다고 해도 3GB의 모델을 1GB램에 올릴 수는 없는 듯 하다.) 로컬 데스크탑에서 gensim의 api를 테스트해 볼 수 있었다.

best-good+sad = saddest : 0.6223942637443542


더 읽을거리