텍스트 분석의 수학
본문축구 이야기를 담은 짧은 글과, 같은 내용을 세 배로 길게 쓴 글이 있다. 빈도수 벡터로 바꾸면 긴 글의 벡터는 짧은 글보다 성분이 모두 세 배쯤 크다. 두 벡터 사이의 거리를 재면 꽤 멀게 나온다. 그런데 둘은 분명 같은 주제이다. 글의 길이와 상관없이 주제가 얼마나 같은지를 재려면 어떻게 해야 할까?
2.3.1코사인 유사도
두 벡터가 얼마나 같은 쪽을 향하는지는 두 벡터가 이루는 각으로 알 수 있다. 각이 0이면 같은 방향, 90°이면 전혀 다른 방향이다. 그 각의 코사인은 성분끼리 곱해 더한 값을 두 벡터의 길이로 나누어 구한다.
두 벡터 \(\vec a = (a_1, \ldots, a_n)\), \(\vec b = (b_1, \ldots, b_n)\)에 대하여 \[\cos\theta = \frac{a_1b_1 + \cdots + a_nb_n}{\sqrt{a_1^2 + \cdots + a_n^2}\,\sqrt{b_1^2 + \cdots + b_n^2}}\] 빈도수 벡터는 성분이 음수가 아니므로 값이 0에서 1 사이이다.
그림 1에서 문서 B를 (9, 3)으로 맞추면 코사인 유사도가 1이다. 문서 A를 세 배 늘린 것이라 방향이 같기 때문이다. B를 (1, 6)처럼 '요리'가 많은 글로 바꾸면 유사도가 크게 떨어진다. 그래서 길이가 다른 글을 비교할 때는 거리보다 코사인 유사도를 쓴다.
2.3.2확률로 분류하기
스팸 메일 거르기처럼 글을 분류할 때는 확률을 쓴다. 지난 메일들을 보니 스팸의 40%에 '무료'가 들어 있고, 정상 메일에는 2%에만 들어 있다고 하자. 전체 메일의 20%가 스팸이라면, '무료'가 들어간 메일이 스팸일 확률은 조건부확률로 구한다.1
\[P(\text{스팸} \mid \text{무료}) = \frac{P(\text{무료} \mid \text{스팸})P(\text{스팸})}{P(\text{무료} \mid \text{스팸})P(\text{스팸}) + P(\text{무료} \mid \text{정상})P(\text{정상})}\]
2.3.3예제 풀이
위 조건에서 '무료'가 들어간 메일이 스팸일 확률을 구하여라. 또 문서 A = (3, 1)과 문서 C = (1, 3)의 코사인 유사도를 구하여라.
1000통으로 생각하면 스팸 200통 가운데 \(200 \times 0.4 = 80\)통, 정상 800통 가운데 \(800 \times 0.02 = 16\)통에 '무료'가 있다. 따라서 \(P(\text{스팸} \mid \text{무료}) = \dfrac{80}{80 + 16} \approx 0.83\)이다. '무료' 한 낱말로 스팸일 확률이 20%에서 83%로 올라간다.
코사인 유사도는 \(\dfrac{3 \times 1 + 1 \times 3}{\sqrt{10}\sqrt{10}} = \dfrac{6}{10} = 0.6\)이다. 두 문서는 같은 두 낱말을 쓰지만 비중이 반대여서 주제가 꽤 다르다고 볼 수 있다.
아래 탐구 카드에서 길이가 다른 글의 주제를 코사인 유사도로 비교하고, 스팸일 확률을 직접 계산해 보자.
- 실제 스팸 필터는 여러 낱말의 확률을 함께 곱해 판단한다. 낱말들이 서로 독립이라고 단순하게 가정하므로 이 방법을 나이브 베이즈 분류라 한다.
코사인 유사도는 두 벡터가 이루는 각의 코사인으로, 길이와 상관없이 방향만 비교하므로 길이가 다른 글의 주제를 비교하기에 알맞다. 글의 분류에는 조건부확률과 베이즈 정리가 쓰인다. 그래서 처음 질문의 짧은 글과 긴 글은 거리는 멀어도 코사인 유사도가 1에 가까우면 같은 주제라고 판단할 수 있다.