🔹 1. Sentence-BERT 임베딩 생성
“문장을 숫자로 바꿔서 의미 공간에 배치하는 단계”
- Sentence-BERT는 **문장 단위 의미를 벡터(숫자 리스트)**로 바꿔주는 모델이에요.
- 예:
- “나는 밥을 먹었다.” → [0.12, -0.08, 0.54, ...]
- “식사를 했다.” → [0.10, -0.09, 0.56, ...]
두 문장은 숫자가 거의 비슷하죠.
- 이 벡터는 보통 384~768차원짜리 “의미 좌표”예요.
📦 Python 예시:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = model.encode(sentences, normalize_embeddings=True)
🔹 2. FAISS 인덱싱 & k-NN 탐색
“모든 문장을 빠르게 비교하기 위한 검색엔진처럼 인덱스 만드는 단계”
- FAISS(Facebook AI Similarity Search)는
고차원 벡터들을 효율적으로 검색하는 라이브러리입니다. - n개의 문장(예: 10만 개)의 임베딩을 만들면,
모든 쌍을 비교하는 건 너무 느리니까,
FAISS 인덱스를 만들어서 “비슷한 벡터끼리 묶어두는” 방식으로 검색 속도를 높입니다. - 이후 “k-NN (k Nearest Neighbors)”을 이용해
각 문장에 대해 가장 비슷한 문장 k개를 찾을 수 있습니다.
📦 Python 예시:
import faiss
index = faiss.IndexFlatIP(embeddings.shape[1]) # Inner Product (Cosine)
index.add(embeddings)
D, I = index.search(embeddings, k=5) # D: 거리, I: 인덱스
🔹 3. Cosine 유사도 임계값(Threshold) 기반 중복 제거
“비슷한 의미의 문장들을 필터링하는 단계”
- 코사인 유사도(Cosine Similarity)는 두 벡터의 방향이 얼마나 같은지를 측정해요.
- 값의 범위:
- 1 → 완전히 같은 의미
- 0 → 무관한 문장
- -1 → 반대 의미
- 보통 0.9 이상이면 “의미 중복”으로 간주합니다.
예: “나는 학교에 갔다.” ↔ “학교에 다녀왔다.” - 그래서 threshold(임계값)를 정해놓고
유사도가 높은 문장 중 하나만 남기고 나머지는 제거합니다.
📦 Python 예시:
threshold = 0.9
duplicates = set()
for i in range(len(embeddings)):
for j in I[i][1:]:
if D[i][j] > threshold:
duplicates.add(j)
filtered_texts = [t for k, t in enumerate(sentences) if k not in duplicates]
🔹 4. 제거된 샘플 & 유사도 예시 출력
“어떤 문장들이 중복으로 판정되어 제거됐는지 보여주는 단계”
- 예를 들어 출력이 이렇게 나옵니다:
[중복 제거 결과 예시]
1. "I love pizza" ↔ "Pizza is my favorite food" (similarity=0.93)
2. "He went to school" ↔ "He attended school" (similarity=0.91)
이런 식으로 모델이 실제로 의미적으로 중복된 데이터를 찾아냈음을 확인할 수 있습니다.
💡 비유로 요약하자면
수많은 문장을 의미로 변환한 뒤,
비슷한 뜻의 문장끼리 묶고,
너무 닮은 녀석들은 한 팀만 남겨두는 과정.
즉, “문장의 의미 DNA를 뽑아서,
겹치는 유전자를 가진 문장들을 정리하는 작업”이 바로 Semantic Deduplication이에요.
'AI' 카테고리의 다른 글
| GloVe 임베딩 모델 펼쳐보기 (0) | 2025.10.28 |
|---|