집합과 벡터로 나타낸 텍스트
본문검색창에 질문을 입력하면 비슷한 질문과 답이 먼저 나온다. 컴퓨터는 글의 뜻을 사람처럼 이해하지 못하는데, 어떻게 두 문장이 비슷하다는 것을 알아챌까? 글을 수로 바꿀 수 있다면, '비슷하다'를 계산할 수 있을 것이다. 가장 간단한 방법은 문장을 낱말의 집합으로 보는 것이다.
2.1.1집합으로 나타낸 문장과 자카드 유사도
문장을 띄어쓰기로 나누면 낱말의 집합이 된다. "나는 사과를 좋아한다"는 {나는, 사과를, 좋아한다}이다. 두 집합이 얼마나 겹치는지를 재면 두 문장의 비슷한 정도를 수로 나타낼 수 있다.
두 집합 \(A\), \(B\)에 대하여 \[J(A, B) = \frac{n(A \cap B)}{n(A \cup B)}\] 를 자카드 유사도라 한다. 값은 0과 1 사이이며, 두 집합이 같으면 1, 공통 원소가 없으면 0이다.
그림 1에서 문장 쌍을 바꾸어 보자. "나는 사과를 좋아한다"와 "나는 귤을 좋아한다"는 공통 낱말이 2개, 전체 낱말이 4개라 유사도가 0.5이다. "고양이가 잔다"와 "강아지가 뛴다"는 공통 낱말이 없어 0이다. 다만 이 방법은 '사과'와 '귤'이 둘 다 과일이라는 것도, 낱말의 순서도 알지 못한다.1
2.1.2벡터로 나타낸 문장
여러 문장에 나오는 낱말을 모두 모아 순서대로 늘어놓은 목록을 사전이라 하자. 각 문장을, 사전의 각 낱말이 그 문장에 있으면 1, 없으면 0인 수의 줄로 나타낼 수 있다. 이런 수의 줄을 벡터라 하고, 이 표현을 원-핫 표현 또는 이진 벡터라 한다.
벡터로 바꾸면 두 문장 사이의 거리를 계산할 수 있다. 위의 두 벡터는 두 자리에서 다르므로 거리는 \(\sqrt{0^2 + 1^2 + 1^2 + 0^2} = \sqrt{2}\)이다. 같은 성분끼리 곱해 더한 값 \(1 + 0 + 0 + 1 = 2\)는 공통 낱말의 개수와 같다.
2.1.3예제 풀이
세 문장 A "오늘 날씨가 맑다", B "오늘 날씨가 흐리다", C "내일 날씨가 맑다"가 있다. A와 B, A와 C의 자카드 유사도를 각각 구하고, 이진 벡터 사이의 거리도 구하여라.
A = {오늘, 날씨가, 맑다}, B = {오늘, 날씨가, 흐리다}, C = {내일, 날씨가, 맑다}이다. A와 B는 공통 2개, 합집합 4개이므로 \(J = \dfrac{2}{4} = 0.5\)이다. A와 C도 공통 2개(날씨가, 맑다), 합집합 4개로 0.5이다.
사전을 (오늘, 내일, 날씨가, 맑다, 흐리다)로 정하면 A = (1, 0, 1, 1, 0), B = (1, 0, 1, 0, 1), C = (0, 1, 1, 1, 0)이다. A와 B, A와 C는 모두 두 자리가 달라 거리가 \(\sqrt{2}\)이다. 그런데 뜻으로 보면 A와 B는 날씨가 반대이고, A와 C는 날이 다르다. 두 경우가 같은 값으로 나온다는 것은, 낱말의 일치만으로는 뜻의 차이를 다 잡지 못한다는 뜻이다.
아래 탐구 카드에서 두 문장의 유사도를 직접 계산하고, 문장을 벡터로 바꾸어 보자.
- 우리말은 조사가 붙어 '사과를', '사과가'가 다른 낱말로 셈해진다. 그래서 실제로는 형태소 분석으로 '사과', '를'처럼 나누어 비교하는 경우가 많다.
문장을 낱말의 집합으로 보면 자카드 유사도 \(\frac{n(A \cap B)}{n(A \cup B)}\)로 비슷한 정도를 잴 수 있고, 사전의 낱말 자리에 0과 1을 적으면 문장이 벡터가 되어 거리와 곱을 계산할 수 있다. 그래서 처음 질문처럼 뜻을 이해하지 못하는 컴퓨터도, 공통 낱말을 세어 두 문장이 얼마나 비슷한지 수로 나타낼 수 있다.