본문 바로가기
AI 공부/자연어 처리 (NLP)

[자연어 처리 NLP] 단어 임베딩과 문맥적 임베딩: NLP의 핵심 이해하기 🌟

by 데이터 벌집 2024. 11. 21.
반응형

자연어 처리(NLP)에서 단어의 의미와 관계를 어떻게 표현할 수 있을까요? 🤔 단어 임베딩은 이 문제를 해결하기 위한 중요한 도구로 자리 잡았습니다. 이 글에서는 전통적인 단어 임베딩과 문맥적 단어 임베딩의 차이점을 설명하고, 각각의 예제를 통해 그 개념을 쉽게 이해해보겠습니다. 📚

 

 

[자연어 처리 NLP] 단어 임베딩과 문맥적 임베딩: NLP의 핵심 이해하기 🌟

단어 임베딩 (Word Embeddings) ✨

단어 임베딩은 단어들의 의미, 문법적 속성, 그리고 다른 단어들과의 관계를 밀집된 벡터로 표현하는 방법입니다. 전통적인 방법인 Bag of Words나 TF-IDF는 단어를 개별적인 엔티티로 다루지만, 단어 임베딩은 단어를 연속된 벡터 공간에 매핑하여 의미적으로 유사한 단어들이 가까운 위치에 있도록 합니다. 🔍 이 방식 덕분에 단어의 의미를 더 잘 표현할 수 있게 되었고, 많은 NLP 모델에서 필수적인 도구로 자리 잡았습니다. 🛠️

대표적인 예로 Word2Vec, GloVe, FastText가 있으며, 모두 단어의 의미를 벡터화하고 유사한 단어들 간의 관계를 이해하는 데 도움을 줍니다. 💡

Word2Vec 예제 🐾

다음은 Word2Vec을 사용해 간단한 예제를 구현해보는 코드입니다: 💻

from gensim.models import Word2Vec
import nltk
nltk.download('punkt')
from nltk.tokenize import word_tokenize

# 샘플 텍스트 데이터 📜
text = [
    "Cats are small animals.",
    "Dogs are loyal pets.",
    "Cats and dogs are popular pets.",
    "The mouse ran away from the cat.",
    "The dog chased the mouse."
]

# 문장을 단어로 토큰화 ✂️
tokenized_text = [word_tokenize(sentence.lower()) for sentence in text]

# Word2Vec 모델 학습 🧠
model = Word2Vec(sentences=tokenized_text, vector_size=50, window=3, min_count=1, sg=1)

# 특정 단어의 벡터 얻기 🐱
cat_vector = model.wv['cat']

# 'cat'에 대한 단어 임베딩 출력 📝
print("Word Embedding for 'cat':")
print(cat_vector)

# 'cat'과 유사한 단어 찾기 🔍
similar_words = model.wv.most_similar('cat', topn=3)
print("\nWords most similar to 'cat':")
print(similar_words)

이 코드에서는 'cat'이라는 단어의 벡터를 출력하고, 이와 유사한 단어들을 찾아봅니다. 'cat'과 가장 유사한 단어로는 'dog' 등이 나옵니다. 🐶 이처럼 단어 임베딩을 활용하면 단어들 간의 의미적 유사성을 쉽게 파악할 수 있습니다. 😊

문맥적 단어 임베딩 (Contextual Word Embeddings) 🌐

문맥적 단어 임베딩은 문장 내에서 단어의 의미를 그 주변 맥락을 통해 캡처하는 방식입니다. 🔄 Word2Vec과 같은 전통적인 임베딩 방법은 각 단어에 대해 고정된 벡터를 생성하지만, 문맥적 임베딩은 문맥에 따라 각 단어에 대한 다른 벡터를 생성합니다. 이런 임베딩 방식은 BERT와 같은 모델을 통해 이루어지며, 전체 문장을 고려하여 단어를 표현하므로 더 정확한 의미를 반영할 수 있습니다. 🧩

BERT 예제 🤖

다음은 BERT를 사용하여 단어 임베딩을 생성하는 예제입니다: 💻

from transformers import AutoModel, AutoTokenizer
import torch

# 사전 학습된 BERT 모델과 토크나이저 로드 📦
model_name = 'bert-base-uncased'
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)

# 예제 문장 📝
sentence = "The cat sat on the mat."

# 입력 문장을 토큰화하고 텐서로 변환 🔄
inputs = tokenizer(sentence, return_tensors='pt')

# BERT 모델에 입력하여 임베딩 얻기 🧠
with torch.no_grad():
    outputs = model(**inputs)
    last_hidden_states = outputs.last_hidden_state

# 마지막 히든 스테이트 텐서의 모양 출력 📊
print("Shape of last hidden states:", last_hidden_states.shape)

# 임베딩을 numpy 배열로 변환 (더 쉽게 다루기 위해) 🔄
embeddings = last_hidden_states.squeeze().numpy()

# 단어와 임베딩 매칭을 위해 토큰화 🔗
tokens = tokenizer.convert_ids_to_tokens(inputs['input_ids'].squeeze())

# 토큰과 그에 해당하는 문맥적 임베딩 출력 📝
for token, embedding in zip(tokens, embeddings):
    print(f"Token: {token}")
    print(f"Embedding: {embedding[:10]}...")  # 처음 10차원만 출력
    print()

이 예제에서는 'cat'과 같은 단어가 주변 단어들에 따라 다른 임베딩 벡터를 갖게 되며, 이는 문맥을 반영한 벡터 표현입니다. 🐱➡️📊 이러한 방법을 통해 NLP 모델이 단어의 의미를 더 정확하게 이해하고 처리할 수 있게 됩니다. 👍

결론 🏁

단어 임베딩과 문맥적 임베딩은 NLP에서 매우 중요한 역할을 합니다. 🌟 단어 임베딩은 단어들 간의 의미적 유사성을 벡터로 표현하고, 문맥적 임베딩은 단어의 의미를 문맥에 따라 다르게 표현하여 더 깊은 이해를 가능하게 합니다. 이 두 가지 방법을 통해 NLP 모델은 인간의 언어를 더 잘 이해하고, 다양한 응용에서 뛰어난 성능을 보일 수 있습니다. 💪✨

반응형