나뭇잎 교과서

텍스트 분석의 수학

글을 벡터로 나타내면 벡터 사이의 각으로 비슷함을 잴 수 있고, 낱말이 나올 확률을 알면 글이 어떤 종류인지 확률로 판단할 수 있습니다. 이 절에서는 코사인 유사도로 글을 비교하고, 낱말이 나온 비율로 스팸 메일을 가려내 봅니다.

먼저 알면 좋은 것 두 점 사이의 거리
본문

텍스트 분석의 수학

본문

축구 이야기를 담은 짧은 글과, 같은 내용을 세 배로 길게 쓴 글이 있다. 빈도수 벡터로 바꾸면 긴 글의 벡터는 짧은 글보다 성분이 모두 세 배쯤 크다. 두 벡터 사이의 거리를 재면 꽤 멀게 나온다. 그런데 둘은 분명 같은 주제이다. 글의 길이와 상관없이 주제가 얼마나 같은지를 재려면 어떻게 해야 할까?

그림 1. 문서 A(파랑)는 '축구' 3번, '요리' 1번이다. 문서 B(주황)를 (9, 3)으로 하면 방향이 같아 코사인 유사도가 1이지만, 거리는 \(\sqrt{40} \approx 6.3\)으로 멀다. 코사인 유사도는 벡터의 길이가 아니라 방향만 비교한다.
먼저 알아야 할 것두 점 사이의 거리, 비율과 백분율, 빈도수 벡터(빈도수 벡터와 요약), 확률(조건부확률은 아래에서 설명).

2.3.1코사인 유사도

두 벡터가 얼마나 같은 쪽을 향하는지는 두 벡터가 이루는 각으로 알 수 있다. 각이 0이면 같은 방향, 90°이면 전혀 다른 방향이다. 그 각의 코사인은 성분끼리 곱해 더한 값을 두 벡터의 길이로 나누어 구한다.

정의 2.3.1 코사인 유사도

두 벡터 \(\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

정리 2.3.2 베이즈 정리로 본 스팸 확률

\[P(\text{스팸} \mid \text{무료}) = \frac{P(\text{무료} \mid \text{스팸})P(\text{스팸})}{P(\text{무료} \mid \text{스팸})P(\text{스팸}) + P(\text{무료} \mid \text{정상})P(\text{정상})}\]

스팸 200정상 800 '무료' 80'무료' 16
그림 2. 메일 1000통 가운데 '무료'가 든 메일은 80 + 16 = 96통이고, 그 가운데 80통이 스팸이다.

2.3.3예제 풀이

예제 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. 실제 스팸 필터는 여러 낱말의 확률을 함께 곱해 판단한다. 낱말들이 서로 독립이라고 단순하게 가정하므로 이 방법을 나이브 베이즈 분류라 한다.
마무리

코사인 유사도는 두 벡터가 이루는 각의 코사인으로, 길이와 상관없이 방향만 비교하므로 길이가 다른 글의 주제를 비교하기에 알맞다. 글의 분류에는 조건부확률과 베이즈 정리가 쓰인다. 그래서 처음 질문의 짧은 글과 긴 글은 거리는 멀어도 코사인 유사도가 1에 가까우면 같은 주제라고 판단할 수 있다.

탐구 1

짧은 글과 긴 글이 같은 주제인지 어떻게 알 수 있을까?

코사인 유사도 · 조작

두 낱말 ‘축구’, ‘요리’의 횟수로 글 A, B를 2차원 벡터로 나타낸다.

  1. 질문축구 기사 한 문단과, 같은 내용을 세 배로 길게 쓴 기사는 낱말 횟수가 세 배씩 차이 난다. 횟수 벡터의 거리로 비교하면 두 글이 아주 달라 보이는데, 이것이 맞을까?
  2. 복원낱말 횟수를 나란히 적은 \(\vec a = (a_1, a_2)\)를 문서 벡터라 했다. 좌표평면에서 원점과 점 \((a_1, a_2)\)를 잇는 화살표로 그리면, 화살표의 길이(벡터의 크기)는 두 점 사이의 거리 \(|\vec a| = \sqrt{a_1^2 + a_2^2}\)이다.
  3. 설명두 문서 벡터에서 같은 낱말의 횟수끼리 곱해 더한 값을 두 벡터의 크기의 곱으로 나눈 \(\dfrac{a_1b_1 + a_2b_2}{|\vec a||\vec b|}\)를 코사인 유사도라 한다. 두 화살표가 같은 방향을 가리킬수록 1에 가깝고, 겹치는 낱말이 하나도 없어 화살표가 서로 수직이면 0이다(이 값이 두 화살표 사이 각의 코사인과 같아서 붙은 이름이다). 화살표의 방향만 비교하므로 글의 길이(벡터의 크기)와 상관없이 어떤 낱말을 어떤 비율로 쓰는지를 비교하며, 횟수는 0 이상이라 값은 0(공통 낱말 없음)과 1(비율이 같음) 사이이다.
  4. 연결실제로는 낱말 수천 개의 TF-IDF 벡터로 같은 계산을 하고, 이 계산은 검색, 비슷한 뉴스 묶기, 추천(5단원)에서 쓰인다.
  5. 적용‘B를 A의 3배 길이로’를 눌러 거리와 코사인 유사도를 비교해 보자. 거리는 커졌는데 코사인 유사도는 어떻게 되는지 확인해 보자.
  6. 판단코사인 유사도가 1이라도 두 글의 길이까지 같은 것은 아니다. 또 낱말 횟수만 보므로 “축구가 싫다”와 “축구가 좋다”처럼 뜻이 반대인 글도 비슷하다고 판단할 수 있다.

확인조건이 달라지면

\(\vec a = (3, 4)\), \(\vec b = (4, 3)\)의 코사인 유사도는?

탐구 2

"무료", "당첨"이 들어간 메일은 스팸일 확률이 얼마일까?

확률로 하는 텍스트 분류 · 활용

메일에 들어 있는 낱말을 표에서 눌러 골라 보자. 확률은 지난 메일 기록에서 얻었다고 가정한 가상 값이다.

  1. 질문메일함은 스팸을 어떻게 알아서 걸러낼까? ‘무료’라는 낱말이 들어 있다고 모두 스팸은 아닐 텐데, 얼마나 의심해야 할까?
  2. 복원확률은 전체 가운데 그 일이 일어나는 경우의 비율이고, 기록이 많으면 상대도수로 어림할 수 있다.
  3. 설명지난 메일에서 스팸 가운데 ‘무료’가 나온 비율과 정상 메일 가운데 ‘무료’가 나온 비율을 센다. 예를 들어 메일 1000통 중 스팸이 400통이고, 스팸의 30 %와 정상 메일의 3 %에 ‘무료’가 있었다면 ‘무료’가 든 메일은 스팸 120통, 정상 18통이다. 그러니 ‘무료’가 든 메일이 스팸일 확률은 \(\frac{120}{138} \approx 87\%\)이다. 낱말이 여럿이면 낱말끼리 서로 영향을 주지 않는다고 단순하게 가정하고, 낱말마다 ‘스팸 쪽 비율 ÷ 정상 쪽 비율’을 곱해 나간다. 이 비가 1보다 크면 스팸 쪽으로, 작으면 정상 쪽으로 기우는데, 이것을 나이브 베이즈 분류라 한다.
  4. 연결4단원의 ‘확률과 예측’에서는 같은 생각으로 검사 결과를 해석한다. 실제 스팸 필터는 수천 개 낱말의 확률을 자료로 학습한다.
  5. 적용예시 메일 세 개의 스팸 확률을 비교해 보자. ‘할인 회의’ 메일에서는 두 낱말이 서로 반대 방향으로 작용하는데, 스팸 비율을 바꾸면 결과가 어떻게 달라지는지 확인해 보자.
  6. 판단낱말끼리 독립이라는 가정은 사실이 아니다(‘무료’와 ‘당첨’은 함께 나오기 쉽다). 그래도 분류에는 꽤 잘 맞지만, 계산한 확률값을 그대로 믿기는 어렵다.

확인조건이 달라지면

메일의 50%가 스팸이고, 스팸 가운데 20%, 정상 메일 가운데 1%에 "당첨"이 들어 있다. "당첨" 하나만 들어 있는 메일이 스팸일 확률은? (다른 낱말은 무시)

AI 출제 문항연습문제 풀어보기15문항
Esc

↑↓ 고르기Enter 열기