자연어 처리(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 모델은 인간의 언어를 더 잘 이해하고, 다양한 응용에서 뛰어난 성능을 보일 수 있습니다. 💪✨
'AI 공부 > 자연어 처리 (NLP)' 카테고리의 다른 글
[자연어 처리 NLP] 🌟 TF-IDF를 이용한 특징 추출 (Term Frequency-Inverse Document Frequency) (2) | 2024.11.21 |
---|---|
[자연어 처리 NLP] Bag-of-Words를 이용한 특징 추출 (Feature Extraction with Bag-of-Words) (2) | 2024.11.20 |
[자연어 처리 NLP] 🛠️ NLP 데이터 처리 방법: 데이터 전처리 (Data Pre-processing) ✨ (3) | 2024.11.19 |
[자연어 처리 NLP] 📚 NLP 용어 알아보기 (5) | 2024.11.18 |
[자연어 처리 NLP] 🌍 자연어 처리 (NLP)란 무엇인가? (2) | 2024.11.17 |