본문 바로가기

Dev Story/머신러닝

Word2Vec 을 활용한 연관 키워드 뽑기 #1

전 회사 프로젝트 때 특정 카테고리 별로 키워드를 분류 하는 작업이 필요했다.

처음에는 사용자가 수동으로 키워드 분류 작업을 하는 프로그램을 개발 하게 되었고

이걸 머신러닝 알고리즘 을 이용해 자동으로 키워드 분류 가 가능 할 거 같아 제안 했었다.

 

여러 알고리즘 중에 눈에 띄던 Word2Vec 알고리즘을 실무에 적용 하기 까지의

좌충우돌 스토리를 쓸가 한다.

 

" 그때 경험을 기록 으로 남겨둘려고 블로그를 쓴다. "

 

이때 당시에 만들었던 키워드 수동 분류 툴

 

 

방금전에 말했듯이 이건 사용자가 직접 수동으로 분류해야만 했다.

(C# WinForm 에 DevExpress 를 사용해서 깔끔하게 뽑히긴 했다.)

 

이건 개발자로써 UI좀 만들고 CRUD 만 할 줄 알면 누구나 쉽게 만들수 있는

프로그램이라 큰 의미는 없다.

 

이걸 자동으로 분류 하는게 필요 했다.

그레서 검색 하기 시작한 알고리즘 "Word2Vec"

 

문장에서 인접한 키워드(단어) 들이 자주 사용하게 되면 그 키워드 끼리는 연관 있는 키워드 라는 가설에서 

시작 하여 만든 알고리즘이다.

 

일반적인 NLP에선 위에 가설이 중론으로 쓰인다. 

 

Word2Vec 을 적용 하는 방법에는 두가지가 있었다. 하나는 Gensim 패키지에서 

제공하는 방법과 Tensorflow 에서 적용 하는 방법이 있는데 

두가지 방식의 장단점이 존재 했다. Gensim 같은 경우는 사용법이 간단했고

Tensorflow는 사용법이 복잡 한 대신에 세세한 부분 까지 핸들링 가능했다.

 

우선 Gensim 을 이용해서 테스트 했다. 

DB에 저장된 키워드들을 불러와서 konlpy 형태소 분석 패키지를 이용해 단어들을 다시 분류 했고

이걸 다시 Gensim 패키지를 이용해 단어를 벡터로 ("단어 임베딩 모델") 만든 다음

 

알고리즘 계산을 시작 한다. 

 

이계산 을 완료 하게 되면 각 키워드 별로 유사한 관계를 만들어 내는 메트릭스 (임베딩 된 벡터) 를 만들어 주는데

특정 키워드를 입력하면 Top N 형태로 유사도 값을 확인 할 수 있다.

 

여기서 유사도라는 것을 알아 보자면 키워드 A와 키워드 B가 유사도 라는 값이 클수록 유사하다는 것을 알수 있다.

 

코사인 유사도 값인데 이 값은 두 벡터 간의 내적으로 계산 할 수 있다.

(이 내적의 개념은 두 벡터간 의 곱인데 먼가 와닿지 않아 더찾아 본 결과

"벡터 간의 최적의 거리" 를 내적이라고 한다.)

 

각각의 단어를 벡터로 만들었기 때문에 가능 하다.

 

이때 이 개념을 보고 참 신선 하다 느꼈다..

문자를 어떻게 숫자로 변환해서 값을 계산 할려는 생각을 했을가 하고 말이다.

( 문과와 이과의 만남인건가...)

 

자 이렇게 결과값을 뽑고 나면 원하는 그림이 그려질줄 알았다.

 

그러나 우리의 개발은 항상 이슈가 발생하고 그걸 해결 해야 하는 과정이 존재 하는것 같다.

 

막상 위에 내용 대로 진행을 했지만 결과는 그럴싸 하지 않았다.

원인을 몰랐다. 그레서 Gensim 에서 Tensorflow 로 구현하는 삽질이 시작 되었다.

 

 

 

 

 

참조 사이트:

" 이사이트는 현재까지 본 사이트 중 가장 자세하게 설명을 다룬다. "

https://dreamgonfly.github.io/machine/learning,/natural/language/processing/2017/08/16/word2vec_explained.html

 

쉽게 씌어진 word2vec

텍스트 기반의 모델 만들기는 텍스트를 숫자로 바꾸려는 노력의 연속이다. 텍스트를 숫자로 바꾸어야만 알고리즘에 넣고 계산을 한 후 결과값을 낼 수 있기 때문이다.

dreamgonfly.github.io