IT Study/ML & DL

[DL/NLP] Word2Vec - CBOW & Skip-Gram 방식

짹짹체유 2023. 12. 23. 17:16

 

Word2Vec

word2Vec은 워드 임베딩 기법으로 단어를 벡터형태로 전환하는 기법이다. 2013년 토론토 대학에서 발표했으며 현재까지도 많이 활용되는 기법이다.

신경망 모델을 사용해서 말뭉치에서 단어들의 연관성을 학습한다. 즉 주어진 문맥에서 발생하는 단어를 예측하는 문제로 단어 임베딩 벡터를 학습한다.

word2Vec에는 CBOW와 Skip-Gram 두 가지 방법이 있다.

 

CBOW vs Skip-Gram

CBOW: 주변 단어를 활용해 중간에 있는 단어 예측

Skip-Gram: 중간 단어를 활용해 주변에 있는 단어 예측

 

0. 사전 준비

1) 라이브러리 호출

from gensim.models import word2vec
import list_file

 

2) 데이터 확인

 

 

 


1. Word2Vec 모델 정의

word2vec.Word2Vec(data, size, min_count, window, sg)
  • data: 리스트 형태의 데이터
  • size: 문자 벡터 차원 수
  • min_count: 사용할 단어의 최소 빈도수
  • window: 고려할 앞뒤 단어 수
  • sg: 0 - CBOW, 1 - Skip-gram

 

1) CBOW 방식 모델 생성

def CBOW(sentences):
    
    model_cbow = word2vec.Word2Vec(sentences, size=300, min_count=1, window=10, sg=0)
    
    return model_cbow
  • sg 옵션을 0으로 하면 CBOW 방식이 적용된다.

 

2) Skip_Gram 방식 모델 생성

def Skip_Gram(sentences):
    
    model_skipgram = word2vec.Word2Vec(sentences, size=300, min_count=1, window=10, sg=1)
    
    return model_skipgram
  • sg 옵션을 1로 하면 Skip_Gram 방식이 적용된다.

3. 모델 결과

model.wv.index2word : Word2Vec 모델인 model에 리스트 데이터 data를 넣은 결과를 반환해주는 변수

idx2word_set_cbow = cbow.wv.index2word
idx2word_set_skipgram = skipgram.wv.index2word

 

  • 학습 결과

 

 

  • 전체 코드
from gensim.models import word2vec
import list_file

def CBOW(sentences):
    
    model_cbow = word2vec.Word2Vec(sentences, size=300, min_count=1, window=10, sg=0)
    
    return model_cbow

def Skip_Gram(sentences):
    
    model_skipgram = word2vec.Word2Vec(sentences, size=300, min_count=1, window=10, sg=1)
    
    return model_skipgram

def main():
    
    sen1, sen2 = list_file.sen1(), list_file.sen2()
    
    sentences = [sen1, sen2]
    
    cbow = CBOW(sentences)
    skipgram = Skip_Gram(sentences)
    
    idx2word_set_cbow = cbow.wv.index2word
    idx2word_set_skipgram = skipgram.wv.index2word
    
    print('CBOW: ', idx2word_set_cbow)
    print('\nSkip-Gram: ', idx2word_set_skipgram)
    
    return idx2word_set_cbow, idx2word_set_skipgram

if __name__ == '__main__':
    main()

 

 

 

 

반응형