반응형
현대 자연어 처리(NLP) 기술에서 단어를 컴퓨터가 이해할 수 있는 형태로 표현하는 것은 매우 중요합니다. 단어 표현(Word Representation)과 단어 임베딩(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 응용 분야에서 널리 사용되며, 자연어 이해의 성능을 크게 향상시키고 있습니다. 앞으로도 단어 표현과 임베딩 기술의 발전은 더욱 많은 혁신을 가져올 것으로 기대됩니다. 🚀
반응형
'AI > ML & DL' 카테고리의 다른 글
[Deep Learning] 딥러닝 RNN (Recurrent Neural Network)의 기초 이해하기 (1) | 2024.06.11 |
---|---|
[Deep Learning] 딥러닝 다중 라벨 분류의 손실 함수: Binary Cross-Entropy (2) | 2024.05.31 |
[Deep Learning] 트리거 워드 감지 알고리즘: 시리, 알렉사와 같은 가상 비서의 핵심 기술 (2) | 2024.05.27 |
[Machine Learning] N-gram이란 무엇인가? 텍스트 분석의 핵심 이해하기 (29) | 2024.03.13 |
[Deep Learning] Early Stopping: 효율적인 머신러닝을 위한 지름길 🚦 (89) | 2024.02.25 |