벡터 유사도'는 텍스트를 벡터로 변환한 후, 그 벡터를 활용하는 핵심적인 개념입니다. 시험에 완벽하게 대비할 수 있도록 슬라이드 내용을 바탕으로 개념부터 원리, 그리고 중요한 측정 방법까지 체계적으로 설명해 드릴게요.
🗺️ 1. 기본 무대: 벡터 공간 (Vector Space)
벡터 유사도를 이해하려면, 먼저 단어들이 존재하는 공간인 **'벡터 공간'**에 대한 개념부터 알아야 합니다.
- 정의: 우리가 사용하는 모든 단어(토큰)들의 집합, 즉 어휘집(Vocabulary)이 하나의 다차원 공간을 형성한다고 생각할 수 있습니다. 이것이 바로 '벡터 공간'입니다.
- 단어의 표현: 어휘집에 있는 각각의 단어(토큰)는 이 공간을 떠다니는 하나의 벡터(vector), 즉 방향과 크기를 가진 화살표로 표현됩니다.
- 핵심 아이디어: 이 공간에서 단어들은 아무렇게나 흩어져 있는 것이 아닙니다. 의미가 비슷한 단어일수록 서로 가까운 곳에 위치하거나 비슷한 방향을 가리키도록 배치됩니다. 예를 들어, 이미지에서 'car'와 'auto'는 'vehicle'이라는 개념 축에서 매우 가까운 방향을 향하고 있습니다. 이것이 바로 자연어를 수학적 표현으로 변환하는 벡터화의 최종 목표입니다.
🎯 2. 유사도 개념: 왜 필요한가?
텍스트를 벡터 공간에 배치했다면, 이제 그들 사이의 관계를 측정해야 합니다.
- 필요성: "두 단어(또는 문서)가 얼마나 비슷한가?"라는 질문에 답하기 위해, 두 벡터가 얼마나 가까운지를 나타내는 **정량적인 수치(a numerical score)**가 필요합니다. 이것이 바로 **유사도(Similarity)**입니다.
- 주요 활용 분야:
- 정보 검색 (Information Retrieval): 사용자가 '빠른 자동차'를 검색했을 때, 검색 엔진은 '빠른 자동차' 벡터와 가장 유사한(가까운) 벡터를 가진 문서들을 찾아서 보여줍니다. '신속한 차량'이라는 문서가 검색 결과에 포함될 수 있는 이유입니다.
- 추천 시스템 (Recommendation Systems): 여러분이 특정 영화를 좋아했다면, 시스템은 그 영화의 벡터와 유사한 벡터를 가진 다른 영화들을 여러분에게 추천해 줍니다.
- 비슷한 의미의 텍스트 찾기: 뉴스 기사 군집화(클러스터링)나 표절 탐지 등 비슷한 내용을 가진 문서를 찾는 데 활용됩니다.
📏 3. 유사도 개념: 어떻게 측정하는가? (★시험 핵심★)
벡터 간의 거리를 재는 방법은 여러 가지가 있지만, 자연어 처리에서는 특별히 중요한 원칙이 있습니다.
문제점: 스케일링(Scaling) 문제
단순히 두 벡터 간의 직선거리(유클리드 거리)를 재면 문제가 생길 수 있습니다. 왜냐하면 벡터의 **'크기(길이)'**가 의미를 왜곡시킬 수 있기 때문입니다.
- 예를 들어, BoW 벡터에서 한 문서에는 '행복'이라는 단어가 1번, 다른 긴 문서에는 10번 등장할 수 있습니다. 이 경우, 두 번째 문서의 '행복' 관련 벡터의 크기(길이)가 훨씬 길어집니다.
- 하지만 두 문서 모두 '행복'이라는 **같은 개념(의미)**을 이야기하고 있습니다. 단순히 빈도수가 높다고 해서 벡터의 크기가 커지는 이 스케일링 문제는, 두 벡터가 실제로는 같은 의미임에도 불구하고 멀리 떨어져 있는 것처럼 보이게 만듭니다.
해결책: 크기(Magnitude)는 무시하고, 방향(Direction)으로 승부하라!
이 스케일링 문제를 해결하기 위해, 기계학습에서는 벡터의 '크기'가 아닌 '방향'을 기반으로 유사도를 측정합니다.
- 벡터 정규화 (Vector Normalization): 모든 벡터의 크기(길이)를 강제로 1로 만들어 버립니다. 이렇게 크기가 1인 벡터를 **단위 벡터(Unit Vector)**라고 합니다.
- 이렇게 하면 모든 벡터의 끝점이 원점으로부터의 거리가 1인 구(sphere)의 표면에 위치하게 됩니다. 이제 벡터의 길이는 모두 같아졌으므로, 벡터들을 구분하는 유일한 기준은 '방향'만 남게 됩니다.
- 방향 비교: 이제 두 벡터가 얼마나 유사한지는 두 벡터가 이루는 사이각으로 판단할 수 있습니다.
- 방향이 거의 같다 (사이각이 0°에 가깝다) → 유사도가 매우 높다.
- 방향이 직각을 이룬다 (사이각이 90°) → 관련성이 거의 없다.
- 방향이 정반대다 (사이각이 180°) → 의미가 정반대다.
이 원리를 이용해 유사도를 측정하는 가장 대표적인 방법이 바로 **코사인 유사도(Cosine Similarity)**입니다.
🎓 시험 대비 최종 요약
- 벡터 공간: 모든 단어(토큰)들이 벡터 형태로 존재하는 다차원 공간.
- 벡터 유사도: 이 공간에서 두 벡터가 의미적으로 얼마나 가까운지를 나타내는 수치.
- 측정 핵심 원리 (★매우 중요★):
- 단순 빈도수 등으로 인한 **크기(길이)의 왜곡(스케일링 문제)**을 피해야 한다.
- 따라서 모든 벡터의 길이를 1로 **정규화(Normalization)**한 뒤,
- 벡터 간의 방향이 얼마나 유사한지를 측정한다.
- 대표적인 방법: 코사인 유사도 (Cosine Similarity).
벡터 유사도를 측정하는 두 가지 대표적인 방법인 유클리드 거리와 코사인 유사도는 시험에 비교해서 출제하기 아주 좋은 주제입니다. 두 개념을 완벽하게 이해하고 계산까지 할 수 있도록, 슬라이드 내용을 종합해서 상세히 설명해 드릴게요.
📏 1. 유클리드 거리 (Euclidean Distance): 점과 점 사이의 최단 거리
개념
유클리드 거리는 우리가 학창 시절부터 배워온, 지도 위의 두 점 사이의 직선거리를 구하는 것과 똑같습니다. 벡터 공간에서 두 벡터의 끝 점(화살표의 머리)을 잇는 가장 짧은 거리를 측정하는 방식입니다.
해석 방법
- 거리 기반(Distance-based): 순수하게 '거리'를 측정합니다.
- 값이 작을수록 유사: 두 벡터 사이의 거리가 가까울수록(값이 작을수록) 더 유사하다고 판단합니다. 거리가 0이면 두 벡터는 완전히 동일한 위치에 있는 것입니다.
예시 계산
슬라이드의 예시로 직접 계산해 보겠습니다.
- 문장1 벡터 A: [1, 1, 1, 0, 0]
- 문장2 벡터 B: [0, 1, 0, 1, 1]
공식:
- 각 차원별로 값의 차이를 제곱해서 더합니다.
- 모두 더한 값:
- 제곱근을 씌웁니다:
- 결과: 두 벡터의 유클리드 거리는 2입니다.
📐 2. 코사인 유사도 (Cosine Similarity): 벡터 간의 방향 일치도
개념
코사인 유사도는 두 벡터 사이의 **'거리'가 아닌 '각도'**에 주목합니다. 두 벡터가 얼마나 같은 방향을 바라보고 있는지를 측정하여 유사성을 판단하는 방식입니다.
해석 방법 (🚨 시험 핵심!)
- 각도 기반(Angle-based): 두 벡터가 이루는 각도의 코사인 값을 사용합니다.
- 값이 클수록 유사: 코사인 값은 클수록(1에 가까울수록) 두 벡터의 방향이 비슷하다는 의미이며, 더 유사하다고 판단합니다.
- 값의 범위: [-1, 1]
- 1: 두 벡터의 방향이 완전히 일치 (사이각 0°). 완벽히 유사.
- 0: 두 벡터가 서로 직각을 이룸 (사이각 90°). 연관성 없음.
- -1: 두 벡터가 완전히 반대 방향 (사이각 180°). 의미가 정반대.
예시 계산
- 문장1 벡터 A: [1, 1, 1, 0, 0]
- 문장2 벡터 B: [0, 1, 0, 1, 1]
공식:
- **분자: A와 B의 내적(Dot Product)**을 구합니다.
- 분모: 각 벡터의 크기(Magnitude)를 곱합니다.
- 분자를 분모로 나눕니다.
- 결과: 코사인 유사도는 1/3 입니다.
🥊 유클리드 거리 vs. 코사인 유사도: 무엇을 써야 할까?
| 구분 | 유클리드 거리 (Euclidean Distance) | 코사인 유사도 (Cosine Similarity) |
| 측정 대상 | 거리 (크기+방향 모두 고려) | 방향 (크기는 무시) |
| "유사하다"는 의미 | 값이 작을수록 좋다 (가깝다) | 값이 클수록 좋다 (방향이 같다) |
| 값의 범위 | 0 ~ 무한대 | -1 ~ 1 |
| 자연어 처리(NLP) | 잘 사용하지 않음 | 압도적으로 많이 사용 |
왜 자연어 처리에서는 코사인 유사도를 선호할까?
바로 '스케일링(scaling) 문제' 때문입니다.
텍스트 분석에서 벡터의 '크기(길이)'는 종종 '문서의 길이'나 '단어의 빈도수'에 비례합니다. 하지만 문서가 길다고 해서 주제가 달라지는 것은 아닙니다.
- 상황: '스포츠'에 대한 짧은 뉴스 기사(벡터 A)와 긴 칼럼(벡터 B)이 있습니다.
- 유클리드 거리의 판단: 두 문서의 주제는 '스포츠'로 같지만, 칼럼의 길이가 훨씬 길기 때문에 벡터 B의 크기가 훨씬 큽니다. 따라서 두 벡터 끝 점 사이의 거리는 멀어지게 되어, 유클리드 거리는 두 문서가 유사하지 않다고 판단할 수 있습니다.
- 코사인 유사도의 판단: 코사인 유사도는 각 벡터의 크기를 1로 정규화(Normalization)하는 효과가 있어, 벡터의 길이는 무시하고 오직 방향만 봅니다. 두 문서 모두 '스포츠'라는 같은 방향을 가리키고 있으므로, 사이각이 매우 작아 코사인 유사도는 매우 유사하다고 판단합니다.
이처럼 문서의 길이라는 크기 요소를 무시하고 순수하게 내용(방향)의 유사성만 보고 싶을 때 코사인 유사도가 훨씬 효과적이기 때문에 자연어 처리 분야에서 표준처럼 사용됩니다.
✨ 추가 유사도 메트릭 (Additional Similarity Metrics)
다양한 메트릭들은 각기 다른 목적과 장점을 가지고 있습니다. 크게 '집합', '거리', '문자열', '확률 분포' 기반으로 나누어 이해하면 쉽습니다.
1. 집합 기반 유사도 (Set-based)
자카드 계수 (Jaccard Coefficient)
- 개념: 두 텍스트(문서)를 각각 단어의 '집합(Set)'으로 보고, 두 집합이 얼마나 겹치는지를 측정합니다. 단어의 등장 횟수나 순서는 전혀 고려하지 않고, 오직 고유한 단어의 존재 여부만 확인합니다.
- 공식: (두 집합의 교집합 크기 / 두 집합의 합집합 크기)
- 해석: 결과는 0과 1 사이의 값을 가지며, 1에 가까울수록 두 문서가 공유하는 고유 단어의 비율이 높다는 의미입니다.
- 주요 용도: 중복 문서나 유사 문서 판별, 표절 탐지 등.
2. 거리 기반 유사도 (Distance-based)
맨해튼 거리 (Manhattan Distance, L1 Norm)
- 개념: 벡터 공간에서 한 점에서 다른 점으로 이동할 때, 각 축을 따라서만 이동하는 최단 거리를 측정합니다. 마치 뉴욕 맨해튼의 격자 모양 길을 따라가는 것과 같다고 해서 붙여진 이름입니다. 각 차원의 차이값의 절대값을 모두 더한 값입니다.
- 공식:
- 특징: 유클리드 거리가 대각선 최단 거리를 재는 것과 달리, 맨해튼 거리는 각 요소의 차이를 제곱하지 않기 때문에 특정 값이 매우 큰 이상치(outlier)에 덜 민감한 특징이 있습니다.
해밍 거리 (Hamming Distance)
- 개념: 길이가 같은 두 개의 문자열(또는 벡터)에서, 같은 위치에 있지만 서로 다른 문자의 개수를 세는 것입니다.
- 예시:
- "apple"과 "apply"의 해밍 거리는 1입니다 (마지막 'e'와 'y'가 다름).
- 10110과 10011의 해밍 거리는 2입니다 (3번째, 5번째 비트가 다름).
- 주요 용도: 통신에서의 에러 검출, 유전 정보 분석 등.
3. 문자열 기반 유사도 (String-based)
편집 거리 / 레벤슈타인 거리 (Edit Distance / Levenshtein Distance)
- 개념: 하나의 문자열을 다른 문자열로 바꾸기 위해 필요한 삽입(insertion), 삭제(deletion), 치환(substitution) 연산의 최소 횟수를 측정합니다.
- 예시: "kitten" → "sitting"
- kitten → sitten (치환, 1)
- sitten → sittin (치환, 2)
- sittin → sitting (삽입, 3)
- → 편집 거리는 3입니다.
- 주요 용도: 철자 교정("혹시 '이것'을 찾으셨나요?"), DNA 서열 분석 등 문자열 자체의 유사성을 비교할 때 매우 유용합니다.
4. 확률 분포 기반 유사도 (Probability-based)
KL 발산 (KL Divergence)
- 개념: 두 확률 분포가 얼마나 다른지를 측정합니다. 벡터보다는 문서 내 단어들의 확률 분포, 혹은 토픽 모델링에서 각 토픽의 단어 확률 분포를 비교하는 데 사용됩니다.
- 특징 (🚨 시험 포인트!): **비대칭적(asymmetric)**입니다. 즉, 와 $D_{KL}(Q|P)$는 다른 값을 가집니다. 따라서 엄밀한 의미의 '거리(distance)'가 아니라 '발산(divergence)'이라고 부릅니다.
상호 정보량 (Mutual Information, MI)
- 개념: 두 텍스트(또는 단어)가 함께 등장할 때 얻어지는 정보량을 측정합니다. 한 단어가 등장했을 때, 다른 단어가 등장할 불확실성이 얼마나 줄어드는지를 나타냅니다.
- 예시: '뉴욕'이라는 단어에서 '뉴'가 나타나면, 다음에 '욕'이 나올 확률이 매우 높아집니다. 이 경우 '뉴'와 '욕'의 상호 정보량은 높습니다.
- 주요 용도: 연어(collocation, 자주 함께 쓰이는 단어쌍) 추출, 특징 선택(feature selection) 등.
💻 파이썬 라이브러리 요약
이러한 유사도 메트릭들은 주요 파이썬 라이브러리에서 쉽게 사용할 수 있습니다.
| 라이브러리 | 주요 함수 | 특징 및 용도 |
| scikit-learn | cosine_similarity, euclidean_distances | 머신러닝 파이프라인에서 벡터 유사도를 계산하는 표준 라이브러리. |
| SciPy | cosine, euclidean, jaccard | 과학 계산용 라이브러리로, 다양한 거리/유사도 함수 제공. (※scipy.cosine은 1-코사인 유사도인 '코사인 거리'를 반환함에 주의!) |
| NLTK | edit_distance | 자연어 처리 특화 라이브러리로, 편집 거리와 같은 문자열 기반 유사도 측정에 강점. |
| PyTorch | cosine_similarity, cdist | 딥러닝에서 텐서(Tensor) 간의 유사도를 계산할 때 필수적으로 사용. |
'코딩공부 > 자연어처리' 카테고리의 다른 글
| 시험공부를 하려고 만든 자연어처리 정리-전처리 3탄(벡터화)-BM25 (0) | 2025.10.08 |
|---|---|
| 시험공부를 하려고 만든 자연어처리 정리-전처리 3탄(벡터화)-TF한계와 TF-IDF (0) | 2025.10.08 |
| 내가 시험공부하려고 만든 자연어처리-전처리 3탄(벡터화)-카운트 기반 벡터화, Bag-of-Words (BoW) (0) | 2025.10.05 |
| 내가 시험공부하려고 만든 자연어처리-전처리 3탄(벡터화)-패딩 (0) | 2025.10.05 |
| 내가 시험공부하려고 만든 자연어처리-전처리 3탄(벡터화)-원핫인코딩 (0) | 2025.10.05 |