본문 바로가기

* [R_Python] 데이터분석 정리/[Python] 텍스트마이닝

워드 투 벡터 (Word2Vec)

텍스트를 수치화시키기 위해 기존 마이닝, 학습시키기 위해서 인코딩 방법을 사용
그 중, 원-핫 인코딩은 단어 집합의 크기를 벡터의 크기로 표현하고, 표현하고자 하는 단어의 인덱스에 1 값을 부여하고 나머지는 0으로 표현하는 벡터 표현 방식
예를 들면,  단어 집합이 다음과 같이 있다고 치자.
"고양이, 예쁨, 강아지, 귀여움, ... 기타, 플레이 "
중략된 단어를 포함하여 단어가 100개가 있을 때, 고양이 하나의 단어 하나에 대한 원 핫 인코딩은 다음과 같다.
[ 1 0 0 0 0....(중략).... 0 0 0 ] 맨 처음 고양이에 대한 인덱스 1이고 나머지는 0으로 표현
예쁨을 표현하기 위한 원핫 인코딩은 다음과 같다
[ 0 1 0 0 0 ... (중략) ... 0 0 0]
※ 이렇게 데이터 표현을 위해 극히 일부의 인덱스만 활용하게 되고, 나머지는 의미 없는 값으로 표기하는 경우를 희소 표현이라고 한다.
 
이러한 원핫 인코딩은 직관적으로 다음과 같은 두 가지의 문제가 있다는 것을 알 수 있따.
 
1. 공간 문제
단어 모음집이 커질 수록, 특정 단어 하나를 표현하기 위해 너무 많은 공간을 써버리고 있음
 
2. 유사도를 구할 수 없음
두 벡터는 항상 직교한다
따라서 코사인 유사도 등을 이용해서 유사도를 구할 수 없다. 구해봤자 0이 나오기 때문!
ex)
 
문서1 : cute cat
문서 2:  cute dog
 
cute의 원-핫 벡터 : [ 1 0 0 ]
cat의 원-핫 벡터 : [ 0 1 0 ]
dog의 원-핫 벡터 : [ 0 0 1 ]
 
만약 코사인 유사도를 구한다면?

 

임베딩은 이런 인코딩의 두 가지 문제점을 해소할 수 있음 임베딩은 밀집 벡터라고도 불리며
원핫 인코딩 대비 저차원으로 표시 하는 것으로 볼 수 있음.
저차원으로 표시된 벡터는
벡터간 유사도를 구할 수 있음

임베딩으로 표현하는데 여러 방법이 있으며
아래는 잘 알려진 방법은 다음과 같음
LSA, Word2Vec, FastText, Glove

그 중 word2vec에 대해 얘기하고자 함
Word2vec의 가정은 비슷한 문맥에서 등장하는 단어들은 비슷한 의미를 가진다는 분포 가설(distributied hypothesis) 기반으로 함 예를 들면, 고양이와 함께 쓰이는 귀엽다, 사랑스럽다라는 에서 해당 내용을 가진 텍스트의 단어를 벡터화 하면 비슷한 벡터값을 가지게 됨

Word2vec 학습 방식에는 다음과 같은 두 가지가 있음.
1. Cbow : 각 주변의 단어들로 중심단어를 예측
2. Skip-gram : 중심 단어드로 주변 단어를 예측
여기서 윈도우 사이즈는 주변 단어의 수라고 보면됨
예문 : The fat cat sat on the mat
1. Cbow 예측할 단어 : sat 인경우
Window size : 2일 때 주변 단어는 fat cat
On the가 됨

윈도우 크기가 정해지면 옆으로 한칸씩 움직여서 학습을 위한 데이터 셋을 만듦 (이 방법를 슬라이딩 윈도우로. ㅛ현)



이때 cbow 인공신경망 도식화는 다음과 같음

여기서
Input에 해당하는 fat cat on the와
Output에 해당하는 sat 의 단어 표현은 은 원핫 벡터임
projection layer는 인공신경망의 hidden layer에 해당하지만 hisden layer와 ㄷ다른 점은 활성화 함수가 없다는 점임


여기서 m은 나중에 임베딩벡터의 크기가 됨
그리고 학습 완료된 w를 임베딩 벡터로 사용
혹은 w와 w’의 평균을 임베딩벡터로 사용하기도 함

Input layer의 cat을 예로 들자면
원핫 벡터이므로 가중치와의 곱은
cat의 index에 대한 가중치만 가져오는 것과 동일
Fat cat on the 모두 그 위치에 대한 가중치만 가져오게 됨. (Concatenate 한 것과 동일, 이러한 것들을 look up table 이라고 함)

이렇게 모인 벡터들은 projection layer 에서 평균을 구해줌.
평균을 구해야하기 때문에 n은 윈도우 사이즈가 됨



Projextion layer을 지난 다름 두번째 가중치인 w‘을 곱해줌
그 다음 소프트맥스 함수 값을 취해 0~1사이의 값으로 나타나게 됨 (각 원소의 총합은 1)

그다음 오차를 줄이기 위해 손실함수를 cross entropy 사용
이후 역전파를 통해서 w와 w‘를 학습시킴


학습 완료후 m 차원을 갖는 w백터의 각 행을 임베딩 벡터로 사용
Or w와 w’의 평균의 행을 이용하여 사용


2. Skip gram
Skip gram은 중심단어를 통해 주변 단어를 예측하므로 input과 output이 바뀌었을 뿐
계산 과정은 비슷함

성능은 cbow보다 skip gram이 더 좋다고 알려져 있음