[NLP] Sentence-BERT

weonyee·2025년 4월 24일

🔷 BERT

BERT = Bidirectional Encoder Representations from transformers
사람처럼 문장을 이해하려고 만든 인공지능 언어 모델

  • 기존의 AI 모델은 단방향으로 이해함
  • BERT는 문장을 양방향으로 읽어서 더 깊이 이해함

🔷 BERT 작동방식

Transformer 라는 딥러닝 구조 사용해서 작동

🔷 훈련 방법 예시

  1. 문장에서 몇 개 단어를 마스킹 처리
    나는 [mask]을 마셨다.
  2. 모델이 빈칸에 들어갈 단어를 예측
    커피
  3. 정답 맞히기 훈련을 수천만 개 문장으로 반복 학습

🔷 BERT 장점

기능예시
문장 이해"지하철역 근처 방" <-> "역세권 원룸" -> 의미 파악 가능
질문에 답하기"대한민국의 수도는?" -> "서울"
문장 간 관계 파악"그는 밥을 먹었다. 그는 배가 고팠다." -> 논리 연결 이해
문장 요약긴 문장 -> 핵심만 정리 가능(fine-tuning 필요)

🔷 SBERT

Sentence-BERT
문장 간 의미 비교를 위해 나온 모델

✅ 기본 개념

기존 BERT
- 두 문장의 관계만 학습
- 문장 자체를 벡터로 현환하는 데는 적합하지 않음
-> SBERT
- 문장 하나 -> 고정 길이의 의미 벡터(임베딩)
- 문장 A와 B -> 벡터 거리로 비교 가능(코사인 유사도 등)

🔷 예시 코드

🛠️ 설치

pip install sentence-transformers

📦 모델 불러오기

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('sentence-transformers/paraphrase-multiligual-MiniLM-L12-v2')

| ✅ 위 모델은 한국어 포함 다국어 지원 + 빠르고 가벼움

**✍️ 문장 벡터화 (임베딩)

sentence = "강남에 있는 월세 1000 이하 원룸 추천해줘"
embedding = model.encode(sentence)
print(embedding.shape)  # (384,) 벡터 차원 수
  • 출력값: 벡터 (list나 numpy 배열처럼 생김)
  • 벡터끼리의 유사도 비교하면 문장 의미 비교 가능

🔷 코사인 유사도 계산 예시

from sklearn.metrics.pairwise import cosine_similarity

s1 = "역세권 조용한 원룸"
s2 = "지하철 근처 조용한 방"
s3 = "복층 오피스텔, 넓은 거실"

emb1 = model.encode(s1)
emb2 = model.encode(s2)
emb3 = model.encode(s3)

print("유사도 (1 vs 2):", cosine_similarity([emb1], [emb2])[0][0])
print("유사도 (1 vs 3):", cosine_similarity([emb1], [emb3])[0][0])

예상 결과:

  • 1 vs 2: 0.85 = 비슷한 의미
  • 1 vs 3: 0.40 = 덜 비슷함

🔷 전체 흐름 요약

  1. SBERT 모델 로딩 SentenceTransformer
  2. 사용자 문장 인코딩 model.encode(user_input)
  3. 매물 설명 or 키워드 문장 인코딩 model.encode(listing_texts)
  4. 벡터 간 코사인 유사도 계산
  5. 유사도 높은 순으로 매물 추천

🔷 추천 모델로 활용할 수 있는 SBERT 모델

모델 이름특징
paraphrase-multiligual-MiniLM-L12-v2다국어 지원/빠름/한국어 포함
distiluse-base-multilingual-cased-v1한국어 잘 됨/약간 더 정확
jhgan/ko-sbert-nli한국어 특화(질문/문장 유사도에 최적화)

참고 사항

  • ✅ 임베딩된 벡터는 numpy로 변환해서 저장해두면 DB 조회 시 속도 빠름
  • model.encode()에는 normalize_embeddings=True 옵션 주면 코사인 유사도 계산 더 정확
  • ✅ 문장 여러 개 한 번에 벡터화 가능

0개의 댓글