Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 Word2Vec로 배우는 워드 임베딩: CBOW와 Skip-Gram 구현 가이드

워드 임베딩(Word Embedding)이란?

워드 임베딩은 단어를 실수(real number)로 이루어진 밀집 벡터(dense vector)에 매핑하는 언어 모델링 기법입니다. 각 단어나 구문은 여러 차원으로 구성된 벡터 공간에서 하나의 점으로 표현되며, 의미가 비슷한 단어일수록 벡터 공간에서 가까운 위치에 배치됩니다.

워드 임베딩은 신경망(neural network), 동시 출현 행렬(co-occurrence matrix), 확률 모델 등 다양한 방법으로 생성할 수 있습니다.

Word2Vec의 구조와 학습 방식

Word2Vec은 단어 임베딩을 생성하기 위한 대표적인 모델군입니다. 입력층 하나, 은닉층 하나, 출력층 하나로 구성된 얕은 2계층 신경망(shallow two-layer neural network) 구조를 사용하며, 대량의 텍스트 데이터로부터 단어 간 문맥적 유사성을 학습합니다.

Word2Vec에는 두 가지 학습 방식이 있습니다.

  • CBOW(Continuous Bag of Words): 주변 문맥 단어들을 이용해 중심 단어를 예측하는 방식입니다. 학습 속도가 빠르고 고빈도 단어에 대해 안정적인 표현을 제공합니다.
  • Skip-Gram: 중심 단어 하나로 주변 문맥 단어들을 예측하는 방식입니다. 적은 양의 데이터에서도 좋은 성능을 보이며, 희귀 단어를 더 잘 표현하는 것으로 알려져 있습니다.

파이썬으로 구현하는 Word2Vec 예제

아래 예제는 NLTK로 텍스트를 전처리한 뒤, Gensim 라이브러리를 사용해 CBOW 모델과 Skip-Gram 모델을 각각 학습하고, 단어 쌍('alice'–'wonderland', 'alice'–'machines') 간의 코사인 유사도를 출력합니다.

# 필요한 모듈 임포트
from nltk.tokenize import sent_tokenize, word_tokenize
import warnings
warnings.filterwarnings(action='ignore')
import gensim
from gensim.models import Word2Vec

# 'alice.txt' 파일 읽기
sample = open("C:\\Users\\Vishesh\\Desktop\\alice.txt", "r")
s = sample.read()

# 줄바꿈 문자를 공백으로 치환
f = s.replace("\n", " ")

data = []

# 파일 내 각 문장을 순회하며 전처리
for i in sent_tokenize(f):
    temp = []
    # 문장을 단어 단위로 토큰화하고 소문자로 변환
    for j in word_tokenize(i):
        temp.append(j.lower())
    data.append(temp)

# CBOW 모델 생성
model1 = gensim.models.Word2Vec(data, min_count=1, size=100, window=5)

# 결과 출력
print("Cosine similarity between 'alice' and 'wonderland' - CBOW : ",
      model1.similarity('alice', 'wonderland'))
print("Cosine similarity between 'alice' and 'machines' - CBOW : ",
      model1.similarity('alice', 'machines'))

# Skip-Gram 모델 생성 (sg=1)
model2 = gensim.models.Word2Vec(data, min_count=1, size=100, window=5, sg=1)

# 결과 출력
print("Cosine similarity between 'alice' and 'wonderland' - Skip Gram : ",
      model2.similarity('alice', 'wonderland'))
print("Cosine similarity between 'alice' and 'machines' - Skip Gram : ",
      model2.similarity('alice', 'machines'))

주요 파라미터 설명

  • min_count: 말뭉치에서 지정한 빈도 미만으로 등장한 단어는 학습에서 제외합니다. min_count=1이면 모든 단어를 포함합니다.
  • size: 생성할 단어 벡터의 차원 수를 지정합니다. 위 예제에서는 100차원을 사용합니다.
  • window: 중심 단어를 기준으로 학습에 참여할 앞뒤 문맥 단어의 최대 거리를 의미합니다.
  • sg: 학습 알고리즘을 선택합니다. sg=0은 CBOW(기본값), sg=1은 Skip-Gram입니다.

실행 결과를 보면 'alice'와 'wonderland'는 같은 소설 속에서 자주 함께 등장하는 단어이므로 코사인 유사도가 높게 나타나고, 'alice'와 'machines'처럼 문맥상 관련성이 낮은 단어 쌍은 유사도가 낮게 나오는 것을 확인할 수 있습니다.

참고: Gensim 4.x 버전부터는 size 대신 vector_size 파라미터를 사용하고, 유사도 계산 시 model.wv.similarity() 형태로 호출해야 합니다. 구버전(3.x) 코드를 그대로 실행하면 오류가 발생할 수 있으므로, 설치된 Gensim 버전에 맞게 코드를 수정해서 사용하세요.