* This content is based on the article written by Ji Ho Park and Gichang Lee
* This content is based on the lecture content of Prof. Pilsung Kang
요약
1. 사람들이 인식하는 문서의 유사도는 주로 문서들 간에 동일한 단어 또는 비슷한 단어가 얼마나 공통적으로 많이 사용되었는가에 의존
2. 일반적인 문서 유사도 계산 과정은, (1) 전처리, (2) 임베딩, (3) 벡터 간 유사도 계산
3. 일반적으로 문서 유사도 계산시 가장 많이 쓰이는 방법은 cosine similarity (코사인 유사도)
4. 유사도는 정보 검색, 문서 분류, 추천 시스템 등 다양한 응용 분야에서 활용
본 포스팅에서는 단어 표현 방식을 바탕으로 문장, 문서들 간 유사도를 측정하는 방식에 대해 알아보고자 합니다.
유사도는 어떻게 정의할까?
기계가 계산하는 문서 간 유사도의 성능은 다음의 두 가지 사항에 의해 결정됩니다.
- 문서를 (1) 어떤 방법으로 수치화하여 표현했는지
- 문서 간의 단어들의 (2) 차이를 어떤 방법으로 계산하는지
우리는 지난 포스팅을 통해 문장과 문서를 어떻게 숫자로 표현할 수 있는지에 대해서 배웠습니다.
Bag-of-Word (BoW)에 기반한 단어 표현 방법인 DTM, TF-iDF는 문서에 포함된 단어의 빈도수를 계산하여 \(N\) 차원의 \(vector\) 로 표현한 것입니다. 여기서 \(N\) 은 전체 단어(vocabulary)의 숫자라 단어가 많아질수록 그 값이 커집니다. 또한 앞으로 배우게 될 GloVe, Word2Vec을 포함한 다양한 워드 임베딩(word embedding) 방법을 통해 비교적 작은 차원의 \(vector\) 로 줄여서 표현할 수 있습니다.
핵심은 문장, 문서, 그리고 단어를 숫자들로 이루어진 \(vector\) 로 표현하여 \(N\) 차원 공간의 하나의 점(point)으로 변환한다는 것입니다.
본격적으로 유사도를 계산하기에 앞서, 유사도에 대한 개념을 정립해봅시다.
유사도(similarity)란 비슷한 정도를 나타내는 지표를 의미합니다. 하지만 '비슷하다'는 단어의 어감에서도 알 수 있듯 매우 주관적인 지표입니다. 여러분은 "엄마와 아빠 중 누구를 닮았니?"라는 질문을 많이 받았을 겁니다. 엄마와 얼마나 비슷한지, 또 아빠와는 얼마나 비슷한지 정량적인 수치로 표현할 수 있으신가요? 상대적으로 비교하여 표현하는 것은 가능할 것 같은데, 절대적인 숫자를 생각해내기에는 다소 어려움이 있을겁니다.
따라서, 비슷한 정도를 정량화하는 노력이 필요합니다. 이를 위해, 자연어처리(Natural Language Processing, NLP) 분야에서 정의하는 유사도 지표의 속성 몇 가지를 살펴보도록 하겠습니다.
1. 두 객체 간 유사성은 둘이 공유하는 속성이 많을수록 증가한다.
- "사과"와 "배"라는 두 단어를 비교할 때, 둘 다 "과일", "먹을 수 있다" 등의 속성을 공유하므로 유사성이 높습니다.
2. 개별 속성은 서로 독립(independent)이며, 추가가 가능하다.
- 한 문서가 하나의 객체이고, 이 문서가 5개 변수로 이뤄져 있다면 각 변수는 서로 무상관(uncorrelated)이라는 뜻이 됩니다. 이 문서를 벡터공간(vector space)에 표현했을 때 각 변수에 대응하는 기저(basis)는 선형 결합을 통해 해당 벡터공간을 생성하는 최소의 집합이라는 의미로 이해할 수도 있습니다. 단어 임베딩에서는 각 차원이 독립적인 의미를 가지며, 필요에 따라 새로운 정보나 특성을 발견했을 때 차원을 추가할 수 있습니다.
3. 각 속성이 갖는 추상화 레벨이 동일해야 한다.
- 각 변수가 커버하는 개념 영역이 비슷해야 한다는 뜻으로 이해할 수 있습니다. 일관된 비교를 위해 모든 속성이 비슷한 수준의 구체성을 지니고 있어야 합니다. 예를 들어, "자동차"와 "테슬라"라는 두 변수는 소위 말하는 계위(hierachy, level)가 동등하지 않습니다.
4. 유사성은 개념구조(conceptual structure)를 설명하는 데 충분해야 한다.
- 유사도가 높은 객체들은 의미적 관계가 존재할 가능성이 높음을 의미합니다. 최근에는 표면적 유사성을 넘어 문맥을 고려한 임베딩을 바탕으로 의미적 차이가 존재하는 동일어에 대한 구분도 가능해지고 있습니다.
문서 간 유사도를 측정하는 지표는 코사인 유사도를 포함하여 여럿 제안되었습니다만, 대체로 단어(word, term) 수준의 방법론에 해당합니다. 두 문서를 표현하는 단어들 중 겹치는 것이 많을 수록 유사도가 높은 경향을 보입니다. 단어 수준의 유사도 측정은 (1) 문서 길이, (2) 동시 등장 단어, (3) 흔한/희귀한 단어, (4) 출현 빈도 등을 어떻게 처리하는지에 따라 방법론을 구분합니다.
기계는 유사도를 어떻게 계산할까?
Notation
앞으로 설명해드릴 여섯 가지 지표를 계산하는 데 사용되는 표현들에 대해 먼저 정리하고 시작하겠습니다.
\( x_{ik}\): \(i\) 번째 문서에 \(k\) 번째 단어가 몇 회 등장했는지 빈도를 나타냅니다.
\(t_{ik}\): \(x_{ik}\) 가 0 이상이면 1, 그렇지 않으면 0의 값을 나타내는 binary 형태의 표현입니다.
\( a_{ij},b_{ij},c_{ij},d_{ij}\): \(t\) 를 바탕으로 계산하며 아래 표와 같습니다. 아래 표에서 \(Y\)는 어떤 단어가 해당 문서에 사용된 경우를, \(N\)은 그렇지 않은 경우 즉 어떤 단어가 해당 문서에 사용되지 않은 경우를 의미합니다. \( a_{ij}, b_{ij}, c_{ij}, d_{ij} \) 는 각각에 해당하는 단어의 수를 나타냅니다.
\(Doc_{i}||Doc_{j}\) | \(Y\) | \(N\) |
\(Y\) | \(a_{ij}\) | \(b_{ij}\) |
\(N\) | \(c_{ij}\) | \(d_{ij}\) |
Illustrative Table
아래 표는 앞으로 설명할 여섯 가지 지표에 대한 이해를 돕기 위한 예시입니다.
\(x_{ik}\) (빈도) | \(Doc_{1}\) | \(Doc_{2}\) | \(Doc_{3}\) |
\(Term_{1}\) | 3 | 0 | 2 |
\(Term_{2}\) | 0 | 0 | 1 |
\(Term_{3}\) | 5 | 3 | 0 |
\(Term_{4}\) | 0 | 2 | 1 |
\(Term_{5}\) | 0 | 1 | 2 |
아래 표는 \(x_{ik}\) 의 값에 따라 즉, 등장여부에 따라 binary 형태로 변환한 결과입니다.
\(t_{ik}\) (Binary) | \(Doc_{1}\) | \(Doc_{2}\) | \(Doc_{3}\) |
\(Term_{1}\) | 1 | 0 | 1 |
\(Term_{2}\) | 0 | 0 | 1 |
\(Term_{3}\) | 1 | 1 | 0 |
\(Term_{4}\) | 0 | 1 | 1 |
\(Term_{5}\) | 0 | 1 | 1 |
\(Doc_{1}\)과 \(Doc_{2}\)에 대해 \(a_{12}, b_{12}, c_{12}, d_{12}\) 를 각각 계산한 결과는 다음 표와 같습니다.
\(Doc_{i}||Doc_{j}\) | \(Y\) | \(N\) |
\(Y\) | 1 | 1 |
\(N\) | 2 | 1 |
각 셀의 합계는 단어의 개수 즉 vocabulary의 사이즈와 동일함을 확인할 수 있습니다. 이제 본격적으로 여섯 가지 지표에 대해 하나씩 알아보도록 하겠습니다.
(1) common features model
\(i\) 번째 문서와 \(j\) 번째 문서에 동시에 등장한 단어 수를 전체 단어 수로 나누어 계산합니다. 보통 전체 말뭉치에 등장하는 단어수가 매우 방대하기 때문에 두 문서에 모두 등장하지 않는 \(d_{ij}\) 의 값이 매우 큽니다. 따라서 이처럼 계산하는 유사도는 대체로 0에 가까운 매우 작은 값을 보입니다. 계산방법과 예시는 아래 표와 같습니다.
$$s_{ij}^{common} = \frac{a_{ij}}{a_{ij}+b_{ij}+c_{ij}+d_{ij}}$$
common | \(Doc_{1}\) | \(Doc_{2}\) | \(Doc_{3}\) |
\(Doc_{1}\) | 1/5 | 1/5 | |
\(Doc_{2}\) | 2/5 | ||
\(Doc_{3}\) |
(2) ratio model
common features model에서 \(d_{ij}\) 를 빼고 계산한 유사도입니다. 앞서 이야기한 것처럼 전체 말뭉치에 등장하는 단어수가 매우 많아 \(d_{ij}\) 의 값이 매우 크기 때문에, 이에 의한 영향을 최소화 하기 위한 접근입니다.
$$ s_{ij}^{ratio} = \frac{a_{ij}}{a_{ij}+b_{ij}+c_{ij}} $$
ratio | \(Doc_{1}\) | \(Doc_{2}\) | \(Doc_{3}\) |
\(Doc_{1}\) | 1/4 | 1/5 | |
\(Doc_{2}\) | 2/5 | ||
\(Doc_{3}\) |
(3) simple matching coefficient
common features model의 식에서 분자와 분모에 \(d_{ij}\) 의 값을 모두 반영하여 계산한 유사도입니다. 일종의 보정을 해준 셈인데 common features model 보다는 값이 커지는 경향이 있습니다.
$$s_{ij}^{smc} = \frac{a_{ij}+d_{ij}}{a_{ij}+b_{ij}+c_{ij}+d_{ij}}$$
SMC | \(Doc_{1}\) | \(Doc_{2}\) | \(Doc_{3}\) |
\(Doc_{1}\) | 2/5 | 1/5 | |
\(Doc_{2}\) | 2/5 | ||
\(Doc_{3}\) |
(4) jaccard similarity
ratio model과 본질적으로 유사하게 계산하며, 아래와 같이 계산합니다. 교집합에서 합집합을 나눈 값으로 이해할 수 있습니다.
$$s_{ij}^{jaccard} = \frac{\sum_{k}^{}min(x_{ik},x_{jk})}{\sum_{k}^{}max(x_{ik},x_{jk})}$$
jaccard | \(Doc_{1}\) | \(Doc_{2}\) | \(Doc_{3}\) |
\(Doc_{1}\) | 3/11 | 2/12 | |
\(Doc_{2}\) | 2/9 | ||
\(Doc_{3}\) |
(5) overlap similarity
overlap similarity는 아래와 같이 계산합니다. jaccard similarity와는 다르게 벡터 길이의 영향을 배제하기 위하여 분모에 최소값을 사용한다고 이해할 수 있습니다.
$$s_{ij}^{overlap} = \frac{\sum_{k}^{}min(x_{ik},x_{jk})}{min(\sum_{k}^{}x_{ik},\sum_{k}^{}x_{jk})}$$
overlap | \(Doc_{1}\) | \(Doc_{2}\) | \(Doc_{3}\) |
\(Doc_{1}\) | 3/6 | 2/6 | |
\(Doc_{2}\) | 2/6 | ||
\(Doc_{3}\) |
(6) cosine similarity
각각의 문서에 해당하는 열을 벡터로 인식하여, 두 벡터를 아래와 같이 내적하게 되면 두 벡터가 이루는 각도를 계산하게 됩니다. 이는 곧 유사도를 의미하며 일반적으로 문서 유사도를 계산할 때 가장 보편적으로 사용하는 방법입니다.
$$s_{ij}^{cosine} = \frac{\sum_{k}^{}(x_{ik}\times x_{jk})}{\sqrt{(\sum_{k}^{}x_{ik}^{2})(\sum_{k}^{}x_{jk}^{2})}}$$
cosine | \(Doc_{1}\) | \(Doc_{2}\) | \(Doc_{3}\) |
\(Doc_{1}\) | 0.6875 | 0.3254 | |
\(Doc_{2}\) | 0.3380 | ||
\(Doc_{3}\) |
다음 포스팅에는 워드 임베딩 방식에 대해 보다 다양하게 알아보도록 하겠습니다.
'Data Science Basic > Text Analytics' 카테고리의 다른 글
[TA] #2 문장과 문서는 어떻게 숫자로 표현할 수 있을까? - BoW, DTM, TF-iDF (3) | 2024.11.30 |
---|---|
[TA] #1 언어 그리고 통계적 의미론(statistical semantics)의 아이디어 (2) | 2024.11.18 |