일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- sort
- Python
- skip-gram
- kakao
- Programmers
- Heap
- stak
- 신경망
- 프로그래머스
- boj
- 딥러닝
- 자연어처리
- algorithm
- Word2vec
- affine
- PPMI
- FullyConnectedLayer
- SQL
- Sigmoid
- select
- dl
- 파이썬
- Stack
- DeepLearning
- CBOW
- hash
- MySQL
- backward
- que
- Numpy
- Today
- Total
혜온의 이것저것
[Chapter 3 word2vec] 3 학습 데이터 준비 본문
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)
'Deep Learning > 밑바닥부터 시작하는 딥러닝2' 카테고리의 다른 글
[Chapter 3 word2vec] 5 word2vec 보충 / 6 정리 (0) | 2022.06.08 |
---|---|
[Chapter 3 word2vec] 4 CBOW 모델 구현 (0) | 2022.04.26 |
[Chapter 3 word2vec] 2 단순한 word2vec (1) | 2022.04.07 |
[Chapter 3 word2vec] 1 추론 기반 기법과 신경망 (0) | 2022.03.24 |
[Chapter 2 자연어와 단어의 분산 표현] 4 통계 기반 개선하기 / 5 정리 (0) | 2022.03.18 |