목표
문장 상에서, 문맥을 통해 어떤 단어가 들어갈지를 추측하고자 한다.
이 때, 단순히 one-hot만 적용해서는 단어간 의미를 반영하기는 어렵다.
따라서 단어간 의미를 반영하는 벡터화를 하기 위한 방법이 바로 Word2Vec이다.
Word2Vec의 방식
Word2Vec에는 다음 두 가지 방식이 존재한다.
- CBOW(Continuous Bag of Words) : 주변 단어를 통해 중심 단어를 추론하기
- Skip-Gram : 중심 단어를 통해 주변 단어를 추론하기
여기서 중심 단어란, 예측해야 하는 단어를 의미하고, 주변 단어는 중심단어 앞 뒤로, 예측에 사용되는 단어를 의미한다.
즉 중심단어가 target이 되며, 주변 단어는 context, 맥락이 된다. 이 때, 주변단어 앞 뒤로 몇 개를 볼지를 window 크기로 정의한다.
그리고, 이를 one-hot encoding을 실시한다.
예시)
You say goodbye and I say Hello.
중심단어 goodbye를 예측하기 위해 , window = 1이라고 둘 시, say, and는 주변단어가 된다.
CBOW
'The fat cat sat on the mat'라는 문장에서 sat를 예측하는 상황을 고려해보자.
window = 2인 경우를 고려하면 , fat, cat, on, the로 sat을 예측해야 한다.
이를 위해서는 Projection 단계에 4개의 Input을 넣어주면 된다.
이후 이를 바탕으로 Projection에서 선택하는 단계(예시 - Softmax등을 바탕으로)
skip-gram
ski-gram은 반대로, 진행하면 된다!
구현 - CBOW(밑딥 2 코드)
#밑딥2 Simple_CBOW(p135-138)
class SimpleCBOW:
def __init__(self, vocab_size, hidden_size):
V, H = vocab_size, hidden_size
W_in = 0.01 * np.random.randn(V, H).astype('f')
W_out = 0.01 * np.random.randn(H, V).astype('f')
# 계층 생성
self.in_layer0 = MatMul(W_in)
self.in_layer1 = MatMul(W_in)
self.out_layer = MatMul(W_out)
self.loss_layer = SoftmaxWithLoss()
# 가중치, 기울기 리스트에
layers = [self.in_layer0, self.in_layer1, self.out_layer]
self.params, self.grads = [], []
for layer in layers:
self.params += layer.params
self.grads += layer.grads
self.word_vecs = W_in
def forward(self, contexts, target):
h0 = self.in_layer0.forward(contexts[:, 0])
h1 = self.in_layer1.forward(contexts[:, 1])
h = (h0 + h1) * 0.5
score = self.out_layer.forward(h)
loss = self.loss_layer.forward(score, target)
return loss
def backward(self, dout = 1):
ds = self.loss_layer.backward(dout)
da = self.out_layer.backward(ds)
da *= 0.5
self.in_layer1.backward(da)
self.in_layer0.backward(da)
return None
패키지를 활용한 Word2Vec
위키 북스 내용 참조 실습 실시.
https://github.com/SeongwonTak/TIL_swtak/blob/master/Word2Vec.ipynb
'자연어처리' 카테고리의 다른 글
[자연어] BERT 모델, 찍먹해보자. (0) | 2021.09.06 |
---|---|
[자연어] 트위터 문자 분류 문제를 통한 자연어 처리 실습(1) (0) | 2021.09.01 |
[밑딥2] CBOW 모델과 skip-gram 모델의 수식 이해 (0) | 2021.08.02 |
[밑딥2] 중요도, 유사도가 높은 단어 추출하기 (0) | 2021.07.21 |
[밑딥2] 시소러스(thesaurus)와 기본적인 전처리 (0) | 2021.07.19 |