BERT = Bidirectional Encoder Representations from transformers
사람처럼 문장을 이해하려고 만든 인공지능 언어 모델
Transformer 라는 딥러닝 구조 사용해서 작동
나는 [mask]을 마셨다.커피| 기능 | 예시 |
|---|---|
| 문장 이해 | "지하철역 근처 방" <-> "역세권 원룸" -> 의미 파악 가능 |
| 질문에 답하기 | "대한민국의 수도는?" -> "서울" |
| 문장 간 관계 파악 | "그는 밥을 먹었다. 그는 배가 고팠다." -> 논리 연결 이해 |
| 문장 요약 | 긴 문장 -> 핵심만 정리 가능(fine-tuning 필요) |

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,) 벡터 차원 수
🔷 코사인 유사도 계산 예시
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])
예상 결과:
SentenceTransformermodel.encode(user_input)model.encode(listing_texts)| 모델 이름 | 특징 |
|---|---|
paraphrase-multiligual-MiniLM-L12-v2 | 다국어 지원/빠름/한국어 포함 |
distiluse-base-multilingual-cased-v1 | 한국어 잘 됨/약간 더 정확 |
jhgan/ko-sbert-nli | 한국어 특화(질문/문장 유사도에 최적화) |
numpy로 변환해서 저장해두면 DB 조회 시 속도 빠름model.encode()에는 normalize_embeddings=True 옵션 주면 코사인 유사도 계산 더 정확