혜온의 이것저것

[Chapter 3 word2vec] 3 학습 데이터 준비 본문

Deep Learning/밑바닥부터 시작하는 딥러닝2

[Chapter 3 word2vec] 3 학습 데이터 준비

혜온 :) 2022. 4. 26. 11:01

3.3.1 맥락과 타깃

word2vec에서 이용하는 신경망의 입력은 '맥락'이다. 그리고 그 정답 레이블은 맥락에 둘러싸인 중앙의 단어, 즉 '타깃'이다.

다시 말해, 우리가 해야 할 일은 신경망에 '맥락'을 입력했을 때 '타깃'이 출현할 확률을 높이는 것이다.

그림에서 말뭉치로부터 목표로 하는 단어를 타깃으로, 그 주변 단어를 맥락으로 뽑아냈다. 이 작업을 망뭉치 안의 모든 단어에 대해 수행한다.

이 맥락의 각 행이 신경망의 입력으로 쓰이고, 타깃의 각 행이 정답 레이블이 된다.

참고로, 각 샘플 데이터에서 맥락의 수는 여러 개가 될 수 있으나, 타깃은 올직 하나 뿐이다.

 

우선 말뭉치 텍스트를 단어 ID로 변환해야 한다.

import sys
sys.path.append('..')
from common.util import preprocess

text='You say goodbye and I say hello.'
corpus, word_to_id, id_to_word=preprocess(text)
print(corpus)
# [0 1 2 3 4 1 5 6]

print(id_to_word)
# {0: 'you', 1: 'say', 2: 'goodbye', 3: 'and', 4: 'i', 5: 'hello', 6: '.'}

그런 다음 단어 ID의 배열인 corpus로부터 맥락과 타깃을 만들어낸다.

corpus를 주면 맥락과 타깃을 반환하는 함수를 작성한다.

맥락은 2차원 배열이다.

contexts[0]에는 0번째 맥락이 저장되고, contexts[1]에는 1번째 맥락이 저장된다.

마찬가지로 target[0]에는 0번째 타깃이, target[1]에는 1번째 타깃이 저장된다.

def create_contexts_target(corpus, window_size=1):
    target=corpus[window_size:-window_size]
    contexts=[]
    
    for idx in range(window_size, len(corpus)-window_size):
        cs=[]
        for t in range(-window_size,window_size+1):
        if t==0:
            continue
        cs.append(corpus[idx+t])
    contexts.append(cs)
return np.array(contexts), np.array(target)

이 함수를 사용해 보면 다음과 같은 결과가 나온다.

contexts, target = create_contexts_target(corpus, window_size=1)

print(contexts)
# [[0 2]
#  [1 3]
#  [2 4]
#  [3 1]
#  [4 5]
#  [1 6]]

print(target)
# [1 2 3 4 1 5]

말뭉치로부터 맥락과 타깃을 만들었다. 나중에 이를 CBOW 모델에 넘겨주면 된다.

 

3.3.2 원핫 표현으로 변환

맥락과 타깃을 원핫 표현으로 바꿔보자.

각각의 다차원 배열의 형상에 주목해야 한다.

잘 보면, 이 그림에서는 단어 ID를 이용했을 때의 맥락의 형상은 (6,2)인데, 이를 원핫 표현으로 변환하면 (6,2,7)이 된다.

 

원핫 표현으로의 변환은 이 책이 제공하는 conver_one_hot() 함수를 이용한다. common.util.py에 구현되어 있다.

이 함수는 인수로 단어ID목록과 어휘수를 받는다.

 

데이터 준비 과정을 한 데 모아 정리해보면 다음과 같다.

import sys
sys.path.append('..')
from common.util. import preprocess, create_contexts_target, convert_one_hot

text='You say goodbye and I say hello.'
corpus, word_to_id, id_to_word=preprocess(text)

contexts, target=create_contexts_target(corpus, window_size=1)

vocab_size=len(word_to_id)
target=covert_one_hot(target,vocab_size)
contexts=convert_one_hot(contexts,vocab_size)
Comments