2021. 1. 25. 15:08ㆍ딥러닝
※ 단어 임베딩 ( Word Embedding )
원-핫 인코딩( one-hot encoding ) 방식에서는 텍스트의 단어를 벡터로 표현하며, 단어에 해당하는 항목만이 1이고, 다른 모든 항목은 0으로 표기한다. 이 방식에서는 단어가 같은 단어인지 아닌지를 비교하는 작업만 할 수 있다. ( 희소벡터 / 희소행렬 )
또한, 새로운 단어를 추가하려고 하면 벡터의 차원이 증가된다.
연구자들은 이러한 단점을 극복하기 위해 단어를 다차원 공간에서 벡터화하는 방식을 고안하게 되었으며, 다차원에서 벡터화하는 것뿐만 아니라 연산처리까지 할 수 있게 하는 단어의 분산표현인 단어 임베딩 ( Word Embedding )이라는 방식을 제안하게 된다.
이것을 학습하기 위해서 만들어진 효율적인 예측 모델이 구글의 word2vec 이며, 각 단어 간의 앞뒤 관계를 보고 근접도를 정하는 딥러닝을 통한 비지도학습 알고리즘이다.
▶ 분산표현 (distributed representation)
- 한 단어의 정보가 특정 차원에 표현되지 않고, 여러 차원에 분산되어 표현.
분산표현 방식을 사용하면, 단어 임베딩 벡터가 더 이상 희소하지 않으며, 분산표현을 학습하는 과정에서 모든 차원에 의미있는 데이터를 고르게 밀집시킨다. 이 때문에 희소표현과 반대로 데이터 손실을 최소화하면서 벡터 차원이 압축되는 효과가 생긴다. ( → 밀집표현 )
'남자'와 '남성'이라는 단어가 있다고 했을 때, 희소표현 방식에서는 하나의 요솟값에 불과하다.
그렇지만, 분산표현 방식에서는 벡터 공간 상에 유사한 의미를 갖는 단어들은 비슷한 위치에 분포되어 있기 때문에, '남자'와 '남성'이라는 단어 위치는 매우 가까우며, 같은 의미로 해석할 수 있다.
[ 영어 말뭉치 ] http://mattmahoney.net/dc/text8.zip : 17,005,207 단어 / 1줄
from gensim.models import word2vec
import logging
import sys
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s',
level=logging.INFO) # 로그 출력
sentences = word2vec.LineSentence("text8")
model = word2vec.Word2Vec(sentences, # 문장
size=100, # 공간 크기
min_count=1, # 단어 최저 등장 횟수
window=10 # 윈도우 수
)
model.save('sample.model') # 모델 파일 저장
#-------------------------------------------------------------------------
# 단어 유사도 구함 ( woman + king - man 의 결과에서 최상위 1건만 출력 )
results = model.most_similar(positive=['woman','king'],
negative=['man'], topn=1)
for result in results:
print(result)
▶ 대용량 영어 말뭉치를 학습해서 벡터로 변환하고 벡터 공간에 위치시킨 후, 단어가 벡터화되었으므로 단어의 의미를 벡터 연산으로 획득 가능하다.
예제는 'woman' 벡터에 'king' 벡터를 합하고 'man' 벡터를 뺀 벡터와 가장 가까운 벡터를 가진 단어를 구하면 'queen’이라는 것.
'딥러닝' 카테고리의 다른 글
[정보] 예술 사진 만들기 - NVIDIA GauGAN (고갱) - GAN (0) | 2021.02.05 |
---|