본문 바로가기
AI/ML & DL

[Deep Learning] 단어 임베딩 Word Embeddings: 자연어 처리의 핵심 기술과 예제

by 데이터 벌집 2024. 5. 28.
반응형

현대 자연어 처리(NLP) 기술에서 단어를 컴퓨터가 이해할 수 있는 형태로 표현하는 것은 매우 중요합니다. 단어 표현(Word Representation)과 단어 임베딩(Word Embeddings)은 이러한 문제를 해결하는 핵심 기술입니다. 이 글에서는 단어 표현과 단어 임베딩의 개념, 그 필요성, 그리고 다양한 방법론에 대해 쉽게 설명하고, 예제와 코딩 예제를 포함하여 소개하겠습니다.

 

[Deep Learning] 단어 임베딩 Word Embeddings: 자연어 처리의 핵심 기술과 예제

 

단어 표현(Word Representation)

단어 표현은 단어를 숫자나 벡터와 같은 기계가 이해할 수 있는 형태로 변환하는 과정입니다. 초기에는 단순한 단어 빈도(count-based) 방법이 사용되었으나, 이는 단어 간의 문맥적 의미를 잘 반영하지 못했습니다. 😔

예제 📚

  • 단어 빈도: "apple"이 3번 등장, "banana"가 2번 등장
  • TF-IDF: 자주 등장하는 단어일수록 낮은 가중치, 드물게 등장하는 단어일수록 높은 가중치
  • 원-핫 인코딩: "apple" -> [1, 0, 0], "banana" -> [0, 1, 0]
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer

# 단어 빈도
vectorizer = CountVectorizer()
text = ["apple banana apple", "banana orange apple"]
word_count = vectorizer.fit_transform(text)
print(word_count.toarray())

# TF-IDF
tfidf_vectorizer = TfidfVectorizer()
tfidf = tfidf_vectorizer.fit_transform(text)
print(tfidf.toarray())

단어 임베딩(Word Embeddings)

단어 임베딩은 단어를 고정된 크기의 실수 벡터로 변환하는 방법으로, 단어 간의 의미적 유사성을 벡터 공간에서 반영할 수 있습니다. 주요 방법론으로는 Word2Vec, GloVe, 그리고 최근의 BERT 등이 있습니다. 🌟

  • Word2Vec: "king" - "man" + "woman" ≈ "queen"
  • GloVe: "Paris" - "France" + "Italy" ≈ "Rome"
  • BERT: 문장 내 문맥을 고려하여 단어 임베딩 생성

예제 📚

  • Word2Vec: "king" - "man" + "woman" ≈ "queen"
  • GloVe: "Paris" - "France" + "Italy" ≈ "Rome"
  • BERT: 문장 내 문맥을 고려하여 단어 임베딩 생성

Word2Vec

  • 개념: Word2Vec은 Mikolov et al. (2013)에 의해 제안된 방법으로, 단어를 저차원 벡터 공간에 임베딩하여 유사한 의미를 가진 단어들이 가까운 벡터로 배치되도록 학습합니다. 🧠
  • 방법: Word2Vec은 두 가지 모델을 사용합니다. CBOW(Continuous Bag of Words)와 Skip-gram입니다. CBOW는 주변 단어들을 통해 중심 단어를 예측하고, Skip-gram은 중심 단어를 통해 주변 단어들을 예측합니다. 🔍
from gensim.models import Word2Vec

# 예제 문장
sentences = [["apple", "banana", "orange"], ["banana", "orange", "grape"], ["apple", "grape", "melon"]]

# Word2Vec 모델 학습
model = Word2Vec(sentences, vector_size=50, window=5, min_count=1, workers=4)

# 단어 벡터 출력
print(model.wv['apple'])

# 유사한 단어 찾기
print(model.wv.most_similar('apple'))

 

GloVe (Global Vectors for Word Representation)

  • 개념: GloVe는 Pennington et al. (2014)에 의해 제안된 방법으로, 전역적인 통계 정보를 활용하여 단어 벡터를 학습합니다. 🌐
  • 방법: GloVe는 전체 코퍼스에서의 단어 동시 발생 행렬을 구축하고, 이 행렬을 기반으로 단어 벡터를 학습합니다. 이는 단어 간의 전역적인 의미 관계를 잘 반영할 수 있습니다. 📊
import numpy as np
import urllib.request
import zipfile
import os

# GloVe 다운로드 및 로드
glove_url = "http://nlp.stanford.edu/data/glove.6B.zip"
glove_file = "glove.6B.50d.txt"

if not os.path.exists(glove_file):
    urllib.request.urlretrieve(glove_url, "glove.6B.zip")
    with zipfile.ZipFile("glove.6B.zip", 'r') as zip_ref:
        zip_ref.extractall()

# 단어 벡터 로드
def load_glove(file_path):
    embeddings_index = {}
    with open(file_path, 'r', encoding='utf-8') as f:
        for line in f:
            values = line.split()
            word = values[0]
            coefs = np.asarray(values[1:], dtype='float32')
            embeddings_index[word] = coefs
    return embeddings_index

embeddings_index = load_glove(glove_file)
print(embeddings_index['apple'])

BERT (Bidirectional Encoder Representations from Transformers)

  • 개념: BERT는 Devlin et al. (2018)에 의해 제안된 방법으로, 트랜스포머(Transformer) 구조를 기반으로 한 사전 학습(pre-training)된 모델입니다. 🚀
  • 방법: BERT는 양방향(contextual) 방식으로 문맥을 고려하여 단어를 임베딩합니다. 이는 문맥에 따라 단어의 의미가 달라질 수 있음을 반영할 수 있습니다. BERT는 다양한 NLP 태스크에 대해 높은 성능을 보이며, 문장 수준의 의미를 잘 반영할 수 있습니다. 🏆
from transformers import BertTokenizer, BertModel
import torch

# BERT 모델 및 토크나이저 로드
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

# 예제 문장
text = "Hello, how are you?"
inputs = tokenizer(text, return_tensors='pt')

# BERT 임베딩 생성
outputs = model(**inputs)
last_hidden_states = outputs.last_hidden_state
print(last_hidden_states)

 

 

단어 표현과 단어 임베딩은 자연어 처리에서 중요한 역할을 합니다. Word2Vec, GloVe, BERT와 같은 다양한 방법론은 각기 다른 장점을 가지며, 단어 간의 의미적 관계를 벡터 공간에서 효과적으로 반영할 수 있습니다. 이러한 기술들은 텍스트 분류, 기계 번역, 질의 응답 등 다양한 NLP 응용 분야에서 널리 사용되며, 자연어 이해의 성능을 크게 향상시키고 있습니다. 앞으로도 단어 표현과 임베딩 기술의 발전은 더욱 많은 혁신을 가져올 것으로 기대됩니다. 🚀

반응형