티스토리 뷰
책 : 밑바닥부터 시작하는 딥러닝 2 chpater 2
text, 즉 글을 인식할 때 단어 자체로 분류를 할 수도 있지만, 앞 뒤 문맥 (context)을 파악하도록 말뭉치 (corpus)를 이용할 수 있다.
1. 말뭉치 전처리 (preprocessing)
전처리라는 것은 미리 어떤 것을 처리해 놓는 것이다. 여기서는 텍스트 데이터를 단어로 분할하는 과정을 의미한다.
그리고 단어에 id를 부여하여 해당 단어가 몇 번째 단어인지 구분한다.
예시 코드
def preprocess(text):
text = text.lower()
text = text.replace('.', ' .')
words = text.split(' ')
word_to_id = {}
id_to_word = {}
for word in words:
if word not in word_to_id:
new_id = len(word_to_id)
word_to_id[word] = new_id
id_to_word[new_id] = word
corpus = np.array([word_to_id[w] for w in words])
return corpus, word_to_id, id_to_word
2. 단어의 분산 표현
단어를 벡터로 표현하여 단어의 의미를 파악할 수 있도록 하는 것이 단어의 분산 표현이다.
분산 표현을 이용하여 벡터로 나타내기 위해서 중요한 방법이 분포 가설이다.
분포 가설이란, 단어 자체의 의미보단, 단어의 맥락 (context)이 의미를 가진다는 것이다.
여기서 사용하는 윈도우(window)는 좌우의 단어 수를 의미한다.
예를 들어, you say goodbye and i say hello. 라는 텍스트가 있을 때, 윈도우를 2로 잡고 goodbye의 context를 구하면
'you', 'say', 'and', 'i' 가 되는 것이다.
3. 동시 발생 행렬
전처리와 분포 가설을 이용하여 동시 발생 행렬이라는 것으로 말뭉치를 벡터로 나타낼 수 있다.
you say goodbye and i say hello. 라는 것을 기준으로 하자. 윈도우가 1일 때, say는 다음과 같이 나타낼 수 있다.
you | say | goodbye | and | i | hello | . | |||
say | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
이처럼 해당 단어의 context에 포함되면 1, 아니면 0으로 나타낼 수 있고, 이를 모든 단어에 적용하면 행렬을 만들 수 있다. 이것이 동시 발생 행렬 (co-occurrence matrix) 이다.
예시 코드
def create_co_matrix(corpus, vocab_size, window_size=1):
corpus_size = len(corpus)
co_matrix = np.zeros((vocab_size,vocab_size), dtype=np.int32)
for idx, word_id in enumerate(corpus):
for i in range(1, window_size+1):
left_idx = idx - i
right_idx = idx + i
if left_idx >= 0:
left_word_id = corpus[left_idx]
co_matrix[word_id, left_word_id] += 1
if right_idx < corpus_size:
right_word_id = corpus[right_idx]
co_matrix[word_id, right_word_id] += 1
return co_matrix
4. 벡터 간의 유사도
벡터 사이의 유사도 (similarity)는 벡터 내적, 유클리드 거리 등을 활용할 수 있다. 여기서는 코사인 유사도를 이용한다.
수식은 다음과 같다.

X = (x1, x2, ..., xn), Y=(y1, y2, ..., yn) 이라 하면, X의 단위 벡터와 Y의 단위 벡터를 내적한 것이다.
이는 두 벡터가 가리키는 방향이 얼마나 같은 지를 나타낸다고 생각하면 된다.
그러므로 값이 1에 가까울 수록 같은 방향을 나타내고, -1에 가까울 수록 반대 방향을 가리킨다.
(완전 같은 방향 : 1, 완전 반대 방향 : -1)
예시 코드 (eps : 0으로 나눠지는 것 막기 위함)
def cos_similarity(x, y, eps=1e-8):
nx = x / (np.sqrt(np.sum(x**2)) + eps)
ny = y / (np.sqrt(np.sum(y**2)) + eps)
return np.dot(nx, ny)
5. 'you'와 'i'의 유사도 구하기
위의 개념을 이용하여 you say goodbye and i say hello. 라는 문장에서 you와 i의 유사도를 구해보자.
import sys
sys.path.append('..')
from common.util import preprocess, create_co_matrix, cos_similarity
text = "You say goodbye and I say hello."
corpus, word_to_id, id_to_word = preprocess(text)
vocab_size = len(word_to_id)
C = create_co_matrix(corpus, vocab_size)
C0 = C[word_to_id['you']]
C1 = C[word_to_id['i']]
print(cos_similarity(C0, C1))
결과
0.7071067691154799
you와 i는 0.71 정도의 값으로 유사도가 높은 편임을 알 수 있다.
한 문장이 아닌 더 많은 데이터를 활용하면 유사도가 더욱 향상될 것으로 예상된다.
'딥러닝' 카테고리의 다른 글
CBOW 1 (0) | 2021.01.26 |
---|---|
통계 기반 기법 2 (0) | 2021.01.24 |
스파이럴 데이터셋을 이용한 신경망 학습 (0) | 2021.01.22 |
밑바닥부터 시작하는 딥러닝 1권 후기 (0) | 2021.01.20 |
합성곱 계층, 폴링 계층 (0) | 2021.01.18 |