임베딩 벡터 - 9. 실습 예제 및 코드

2025. 3. 26. 20:14AI/AI

 

📘 9. 실습 예제 및 코드


🔹 9.1 Python을 활용한 Word2Vec 예제

✅ 목적

간단한 문장 데이터로 단어 임베딩을 학습하고, 유사 단어를 벡터 기반으로 검색합니다.

🛠 사용 라이브러리

gensim, nltk

💡 주요 파라미터

파라미터 설명
vector_size 생성할 임베딩 벡터의 차원 수
window 주변 단어를 몇 개까지 볼 것인지 (문맥 크기)
min_count 최소 등장 횟수 미만 단어는 학습 제외
sg 1: Skip-gram / 0: CBOW 방식 선택

🧪 예제 코드

from gensim.models import Word2Vec
from nltk.tokenize import word_tokenize

sentences = [
    word_tokenize("I love natural language processing."),
    word_tokenize("Word embeddings are useful in NLP.")
]

model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, sg=1)

print(model.wv.most_similar("language"))

⚠️ 에러 핸들링

  • LookupError: resource 'punkt' not found → nltk.download('punkt')
  • KeyError: 'word not in vocabulary' → min_count 낮추거나 말뭉치 확장

🔹 9.2 BERT 임베딩 추출 실습

✅ 목적

사전학습된 BERT 모델을 이용해 문장 내 [CLS] 벡터를 추출합니다.

🛠 사용 라이브러리

transformers, torch

💡 주요 파라미터

파라미터 설명
return_tensors="pt" 토크나이저 결과를 PyTorch 텐서로 반환
last_hidden_state 각 토큰의 벡터 (보통 [CLS] 사용)

🧪 예제 코드

from transformers import BertTokenizer, BertModel
import torch

tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertModel.from_pretrained("bert-base-uncased")

inputs = tokenizer("I love AI.", return_tensors="pt")
outputs = model(**inputs)
embedding = outputs.last_hidden_state[:, 0, :]  # [CLS] 토큰 임베딩
print(embedding.shape)

⚠️ 에러 핸들링

  • GPU 부족 → model.to("cpu") 사용
  • 모델 로딩 실패 → 버전 확인, 인터넷 연결 확인

🔹 9.3 Sentence-BERT / SimCSE 임베딩 실습

✅ 목적

문장 간 의미 유사도를 계산하기 위해 문장 단위 임베딩을 생성합니다.

🛠 사용 라이브러리

sentence-transformers

💡 주요 파라미터

파라미터 설명
convert_to_tensor=True PyTorch 텐서 형식 반환
util.pytorch_cos_sim 문장 간 코사인 유사도 계산

🧪 예제 코드

from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")

sentences = ["I love machine learning.", "I enjoy studying AI."]
embeddings = model.encode(sentences, convert_to_tensor=True)

similarity = util.pytorch_cos_sim(embeddings[0], embeddings[1])
print(similarity)

🔁 SimCSE 사용 시 모델 이름만 교체: "princeton-nlp/sup-simcse-bert-base-uncased"

⚠️ 에러 핸들링

  • GPU 오류 → model = model.to("cpu")
  • ModuleNotFoundError → pip install sentence-transformers 필요

🔹 9.4 벡터 유사도 검색 데모 (FAISS)

✅ 목적

대량의 벡터 중 입력 벡터와 가장 유사한 벡터를 빠르게 검색합니다.

🛠 사용 라이브러리

faiss, numpy

💡 주요 파라미터

파라미터 설명
IndexFlatL2(dim) L2 거리 기반 인덱스 생성
add() 벡터 추가
search(query, k) 상위 k개 유사 벡터 반환

🧪 예제 코드

import faiss
import numpy as np

vectors = np.random.rand(100, 128).astype("float32")
index = faiss.IndexFlatL2(128)
index.add(vectors)

query = np.random.rand(1, 128).astype("float32")
D, I = index.search(query, k=5)
print("Top 5 indices:", I)

⚠️ 에러 핸들링

  • ModuleNotFoundError → pip install faiss-cpu 또는 faiss-gpu
  • TypeError → 벡터는 반드시 float32 타입이어야 함

🔹 📌 요약 정리

항목 실습 목적 주요 도구 주의사항
Word2Vec 단어 임베딩 학습 gensim 토큰화, 어휘 수 부족
BERT [CLS] 임베딩 추출 transformers CUDA 오류, 로딩 실패
SBERT / SimCSE 문장 유사도 계산 sentence-transformers 모델 로딩, GPU 사용
FAISS 검색 벡터 유사 항목 찾기 faiss float32 필수, 라이브러리 설치 필요