# 코엔엘파이로 형태소 토큰화
from konlpy.tag import Okt
okt = Okt()
token = okt.morphs("나는 자연어 처리를 배운다")
print(token)
['나', '는', '자연어', '처리', '를', '배운다']
# 각 토큰에 인덱스 부여
word2index = {}
for voca in token:
if voca not in word2index.keys():
word2index[voca] = len(word2index)
print(word2index)
{'나': 0, '는': 1, '자연어': 2, '처리': 3, '를': 4, '배운다': 5}
{'나': 0, '는': 1, '자연어': 2, '처리': 3, '를': 4, '배운다': 5}
{'나': 0, '는': 1, '를': 4, '배운다': 5, '자연어': 2, '처리': 3}
# 토큰을 입력하면 원핫 벡터로 만드는 함수 정의
def one_hot_encoding(word, word2index):
one_hot_vector = [0]*(len(word2index))
index = word2index[word]
one_hot_vector[index] = 1
return one_hot_vector
one_hot_encoding("자연어",word2index)
[0, 0, 1, 0, 0, 0]
import torch
# 원-핫 벡터 생성
dog = torch.FloatTensor([1, 0, 0, 0, 0])
cat = torch.FloatTensor([0, 1, 0, 0, 0])
computer = torch.FloatTensor([0, 0, 1, 0, 0])
netbook = torch.FloatTensor([0, 0, 0, 1, 0])
book = torch.FloatTensor([0, 0, 0, 0, 1])
print(torch.cosine_similarity(dog, cat, dim=0))
print(torch.cosine_similarity(cat, computer, dim=0))
print(torch.cosine_similarity(computer, netbook, dim=0))
print(torch.cosine_similarity(netbook, book, dim=0))
tensor(0.)
tensor(0.)
tensor(0.)
tensor(0.)
단어를 밀집 벡터(dense vector)의 형태로 표현한느 방법을 워드 임베딩이라고 한다.
밀집표현은 희소표현과 반대되는 표현으로 사용자가 설정한 값으로 벡터 차원을 맞춘다.
이 과정에서 0과 1뿐만이 아니라 실수값을 가지게 됩니다.
밀집 벡터는 워드 임베딩 과정에서 나온 결과로 임베딩 벡터라고도 한다.
희소벡터(원-핫 벡터)와 밀집벡터(임베딩 벡터)의 비교
Ex) 강아지 = [ 0 0 0 0 1 0 0 0 0 0 0 0 ... 중략 ... 0] # 이 때 1 뒤의 0의 수는 9995개. 차원은 10,000
Ex) 강아지 = [0.2 1.8 1.1 -2.1 1.1 2.8 ... 중략 ...] # 이 벡터의 차원은 128
위 사이트에서 다른 한국어 벡터 연산도 수행해보자
분산표현은 분포가설에 기반해 '비슷한 위치에서 등장하는 단어들은 비슷한 의미를 가진다'고 가정한다.
강아지란 단어는 귀엽다, 예쁘다, 애교 등과 함께 등장하는데 이를 벡터화 한다면 저 단어들은 의미적으로 가까운 단어가 된다.
Ex) 강아지 = [0.2 0.3 0.5 0.7 0.2 ... 중략 ... 0.2]
고차원의 희소표현은 각 차원이 분리된 표현방법이라면, 분산표현은 저차원에 단어의 의미를 여러 차원에 분산하여 표현한다.
이를 통해 단어 간 유사도를 계산할 수 있다. 기존의 방법의 학습속도를 대폭 개선시킨 Word2Vec이 많이 쓰이고 있다.
입력층에 사용자가 정한 윈도우 크기 범위 안에 있는 단어들의 원-핫 벡터가 들어가고,
출력층에 예측하고자 하는 중단 단어의 원-핫 벡터가 들어간다.
위 그림에서 보듯이 Word2Vec은 은닉층(투사층)이 1개만 존재하는 얕은 신경망 모델이다.
Vord2Vec의 은닉층은 다른 모델과 다르게 활성화 함수가 존재하지 않고 따로 연산담당 층이 있다.
(딥러닝 모델은 다수의 은닉층을 활용하는 심층신경망 모델을 말한다.)
이 연산담당층을 룩업 테이블이라는데, 다른 은닉층과 구분하기 위해 투사층이라고 부르기도 한다.