Colab으로 하루에 하나씩 딥러닝

자연어 전처리_3.임베딩_3) 예측 기반 임베딩 본문

딥러닝_개념

자연어 전처리_3.임베딩_3) 예측 기반 임베딩

Elleik 2022. 12. 14. 22:22
728x90

예측 기반 임베딩

  • 신경망 구조 혹은 모델을 이용하여 특정 문맥에서 어떤 단어가 나올지 예측하면서 단어를 벡터로 만드는 방식 
  • 대표적으로 워드투벡터가 있음

워드투벡터(Word2Vec)

  • 신경망 알고리즘으로 주어진 텍스트에서 텍스트의 각 단어마다 하나씩 일련의 벡터를 출력함
  • 코사인 유사도를 이용하여 특정 단어의 동의어를 찾을 수 있음
  • 수행 과정
    • 일정한 크기의 윈도우로 분할된 텍스트를 신경망 입력으로 사용
    • 모든 분할된 텍스트는 한 쌍의 대상 단어와 컨텍스트로 네트워크에 공급
    • 네트워크의 은닉층에는 각 단어에 대한 가중치가 포함 됨
더보기

<데이터 셋 가져오기>

아래의 코드 중 peter.txt는 피터팬 무료 이북 텍스트를 참조하였습니다.

 

출처: https://www.gutenberg.org/files/16/16-h/16-h.htm

### 데이터셋을 메모리로 로딩하고 토큰화 적용

import nltk
nltk.download('punkt')
from nltk.tokenize import sent_tokenize, word_tokenize
import warnings
warnings.filterwarnings(action='ignore')
import gensim
from gensim.models import Word2Vec

sample = open("/content/drive/MyDrive/peter.txt", "r", encoding="UTF-8")  # 피터펜 데이터셋 로딩
s = sample.read()

f = s.replace("\n"," ") # 줄바꿈(\n)을 공백(" ")으로 변환
data = []

for i in sent_tokenize(f):  # 로딩한 파일의 각 문장마다 반복
  temp = []
  for j in word_tokenize(i):  # 문장을 단어로 토큰화
    temp.append(j.lower())    # 토큰화된 단어를 소문자로 변환하여 temp에 저장 
  data.append(temp)

data

코퍼스에 토큰화를 진행한 결과, 이후 데이터는 생략함


CBOW(Continuous Bag Of Words)

  • 단어를 여러 개 나열한 후 이와 관련된 단어를 추정하는 방식
  • 문장에서 등장하는 n개의 단어 열에서 다음에 등장할 단어를 예측함
### 데이터셋어 CBOW 적용 후 'peter'와 'wendy'의 유사성 확인

model1 = gensim.models.Word2Vec(data, min_count=1, size=100, window=5, sg=0)

print("Cosine similarity between 'peter' " + "'wendy' - CBOW : ", model1.similarity('peter','wendy')) # 결과 출력

peter와 wendy의 코사인 유사도가 11%

※ 워드투벡터는 무작위로 초기화되고, 훈련 과정에서도 무작위 처리되기 때문에 결과가 위와 다를 수 있음


### Word2Vec의 파라미터

data: CBOW를 적용할 데이터셋

min_count: 단어에 대한 최소 빈도수 제한(빈도가 적은 단어들은 학습하지 않음)

size: 워드 벡터의 특징 값. 임베딩된 벡터의 차원

window: 컨텍스트 윈도우 크기

sg: 0일 때는 CBOW를 의미, 1일 때는 skip-gram을 나타냄

### 'peter'와 'hook'의 유사성 확인

print("Cosine similarity between 'peter' " + "'hook' - CBOW : ",
      model1.similarity('peter','hook'))

peter와 hook에 대한 코사인은 낮은 관계성을 가지고 있음


skip-gram

  • CBOW와 반대로 특정한 단어에서 문맥이 될 수 있는 단어를 예측함
  • 중심 단어에서 주변 단어를 예측하는 방식을 사용 
### 데이터셋에 skip-gram 적용 후 'peter'와 'wendy'의 유사성 확인

model2 = gensim.models.Word2Vec(data, min_count=1, size=100,
                                window=5, sg=1) # skip-gram 모델 생성
print("Cosine similarity between 'peter' " +
      "'wendy' - Skip Gram : ",
      model2.similarity('peter','wendy')) # 결과 출력

CBOW와 다르게 'peter'와 'wendy'의 코사인 유사도가 45%로 증가함

### 'peter'와 'hook'의 유사성

print("Cosine similarity between 'peter' " + "'hook' - Skip Gram : ",
      model2.similarity('peter', 'hook'))

CBOW와 다르게 관계성이 46%로 높아짐

참고: 출처: 서지영, 『딥러닝 텐서플로 교과서』, 길벗(2022)