일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 패혈증 관련 급성 호흡곤란 증후군
- GaN
- moirai
- nccl 업데이트
- nccl 설치
- length of stay
- NTMs
- Transformer
- 의료정보
- 분산 학습
- first pg on this rank that detected no heartbeat of its watchdog.
- irregularly sampled time series
- gru-d
- operation management
- nccl 업그레이드
- pre-trained llm
- 리뷰
- multi gpu
- ERD
- queueing theory
- Time Series
- timesfm
- pytorch
- m/m/s
- ed boarding
- timellm
- 불규칙적 샘플링
- 대기행렬
- 딥러닝
- 토픽모델링
- Today
- Total
데알못정을
Cosine Similarity & TF-IDF 본문
단어들을 단순히 출현 횟수를 나타내는 정수나 특정 단어의 존재 여부를 나타내는 이진 ‘비트 벡터’ 형태로만 표현하는 것이 아니라 주어진 응용에 의미가 있는 어떤 연속된 값들로 바꾸는 것은 중요하다. 전자의 방식으로 단어를 벡터로 표현하게 되면 너무 sparse한 벡터(0 또는 1)를 사용하기 때문에 단어가 담은 정보를 많이 손실할 수 있다. 따라서 후자의 방식으로 단어를 표현할 필요가 있다. 그 이유는 단어를 연속 공간에서 표현하면 좀 더 다양한 수학적 도구들(유사도 등)로 단어 표현들을 다룰 수 있기 때문이다.
1. 코사인 유사도(Cosine Similarity)
벡터란 선형대수의 기본적인 구성요소이다. 벡터는 순서가 있는 수치 목록인데, 이 수치들은 벡터 공간에서 그 벡터의 위치를 말해 주는 좌표 성분들로 해석할 수 있다. 이러한 해석에서 하나의 벡터는 공간의 한 장소(위치)를 서술한다. 또는, 벡터로 방향이나 속력, 두 위치 사이의 거리를 나타낼 수도 있다. 벡터 공간(vector space)은 그 공간 안에 나타날 수 있는 모든 가능한 벡터의 집합이다. 벡터의 성분 개수는 해당 벡터 공간의 차원 수이다. 따라서 성분이 두 개인 벡터는 2차원 벡터 공간에 놓이고, 성분이 세 개인 벡터는 3차원 벡터 공간에 놓인다. 모눈종이와 이미지는 x축과 y축이 서로 수직인 직선적 유클리드 공간의 예이다. 벡터들은 모두 직교좌표계 공간, 즉 공간의 모든 축이 직선이고 서로 직교하는 유클리드 공간에 존재한다. 그림 1은 벡터 (5,5), (3,2), (-1,1)을 표현하는 한 가지 방법을 보여준다. 이런 표시 방식에서 벡터의 머리(뾰족한 화살표 끝)는 벡터가 나타내는 위치에 해당한다. 즉, 이 그림에서 세 개의 벡터 머리들은 앞에서 언급한 세 좌표쌍에 해당한다. 벡터의 꼬리는 항상 원점 (0,0)이다.
자연어 문서의 벡터 공간에서 벡터 공간의 차원 수는 전체 말뭉치에 등장하는 고유한(중복되지 않는) 단어들의 개수와 같다. TF(용어 빈도) 벡터나 TF-IDF 벡터를 다룰 때는 이 고유 단어 수를 대문자 “K”로 표기할 때가 많다. 말뭉치의 모든 문서는 K 차원 벡터 공간의 K 차원 벡터들로 표현된다. 예를 들어,
documentary 1 -> “The faster Harry got to the store, the faster and faster Harry would get home.”
documentary 2 -> “Harry is hairy and faster than Jill.”
documentary 3 -> “Jill is not as hairy as Harry.”
이라면 3개의 말뭉치는 [‘,’, ‘.’, ‘and’, ‘as’, ‘faster’, ‘get’, ‘got’, ‘hairy’, ‘harry’, ‘home’, ‘is’, ‘jill’, ‘not’, ‘store’, ‘than’, ‘the’, ‘to’, ‘would’]로, 토큰이 총 18개이다. 따라서 이 말뭉치는 표현하는 각 벡터의 성분도 반드시 18개(K=18)이어야 한다. 참고로, 용어빈도(TF)는 전체 단어 수 대비 등장한 횟수를 의미한다. 만약 30개의 단어로 이루어진 말뭉치에서 “dog”라는 단어가 3번 등장한다면 TF(“dog”,document) = 3/30 = 0.1이다. 그림 2는 3개의 문서에서 “harry”와 “faster”의 용어 빈도(TF) 벡터를 2차원으로 표현한 것이다.
문서를 하나의 공간을 기준으로 한 벡터로 표현하면 문서들의 유사도를 수치로 계산할 수 있다. 직교좌표계에서 두 벡터의 거리는 한 벡터에서 다른 한 벡터를 빼서 만든 벡터의 길이이다. 즉 두 벡터의 거리는 한 벡터의 머리에서 다른 벡터의 머리까지의 거리이다. 이런 거리는 2-norm 거리라고 부른다. 하지만 단어 출현 횟수 벡터, 즉 용어 빈도[TF] 벡터들은 이런식(2-norm)으로 거리를 측정하는 것이 바람직하지 않다. 서로 가까운 두 벡터는 서로 “비슷하다”고 할 수 있다. 그리고 두 문서의 벡터 표현들이 비슷하면 두 문서는 비슷하다고 할 수 있다. 그런데 벡터 거리의 정의에 의해, 두 벡터가 가리키는 방향이 비슷할수록, 그리고 두 벡터의 길이가 비슷할수록 두 벡터의 거리가 줄어든다. 비슷한 길이의 두 문서에서 얻은 용어 빈도 벡터들은 길이가 비슷할 것이며, 따라서 두 벡터의 거리가 짧게 나온다. 문제는 두 문서의 길이가 같다고 해서 그 두 문서가 비슷하다고 여기는 것은 바람직하지 않다는 것이다. 그보다는, 두 문서가 비슷한 단어들을 비슷한 빈도로 사용했는지를 측정하는 것이 더 합리적이다. 그래야 두 문서가 비슷한 정보 내용을 담고 있는지를 좀 더 확신 있게 추정할 수 있다.
거리 대신 각도에 기초해서 두 벡터의 유사도를 측정할 수도 있다. 그림 3은 두 벡터 사이의 각도 $\theta$ 의 코사인을 나타낸 것이다. 이런 유사성 측도를 코사인 유사도(cosine similarity)라고 부른다. 이 코사인 유사도는 다음과 같은 유클리드 내적 공식에서 유도할 수 있다.
$$A\bullet B=|A||B|\star cos\theta$$
이를 코사인 유사도에 대해 정리하면 다음이 나온다.
$$cos\theta = \frac{|A||B|}{A\bullet B}$$
이 공식을 이용하면 삼각함수를 전혀 사용하지 않고 코사인 유사도를 효율적으로 계산할 수 있다. 또한 코사인 유사도는 –1에서 1까지인데, 이는 대부분의 기계 학습 문제에서 편하게 다룰 수 있는 범위이다.
자연어처리(NLP)에서 두 문서 표현 벡터의 코사인 유사도가 1에 가깝다는 것은 두 벡터가 비슷한 단어들을 비슷한 빈도로 사용한다는 뜻이다. 따라서, 벡터들의 코사인 유사도가 1에 가까운 두 문서는 비슷한 내용을 담고 있을 가능성이 크다. 코사인 유사도가 0이라는 것은 두 벡터에 공통점이 전혀 없다는 뜻이므로 두 문서에 공통적으로 출현하는 단어가 하나도 없으면 해당 TF 벡터들의 코사인 유사도가 0이 된다. 이 경우 두 문서는 서로 완전히 다른 단어들을 사용하므로, 주제(Topic)나 내용이 상당히 다를 가능성이 크다. 그러나 같은 주제(Topic)를 다른 단어들로 말하는 것이 불가능하지 않다는 점도 주의해야 한다.
2. TF-IDF(Term Frequency - Inverse Document Frequency)
용어 빈도(TF)가 유용하긴 하지만 그 자체로는 문서 안에서 그 단어의 중요도, 특히 말뭉치의 나머지 문서들에 상대적인 중요도를 가늠하기 어렵다. 따라서 말뭉치에 대한 한 문서 안에서의 단어의 상대적 중요도를 파악하면 주어진 문서의 말뭉치 안에서의 특징을 서술할 수 있다. 예를 들어 연 ("kite")에 관한 모든 영어 서적으로 이루어진 말뭉치가 있다고 하자. 아마 그 말뭉치의 모든 책(문서)에 “kite”라는 단어가 등장할 것이다. 따라서 “kite”라는 단어는 주어진 책을 말뭉치의 나머지 책들과 구분하는 데 아무런 도움이 되지 않는다. 반면 “construction”(연 만들기)이나 “aerodynamics”(공기역학) 같은 단어는 말뭉치의 일부 책들에만 등장할 것이며, 따라서 그런 단어가 자주 나오는 책과 그렇지 않은 책은 뭔가 다를 것이다. 이런 고찰을 반영하려면 단순한 단어 출현 횟수(용어 빈도)로는 부족하다.
이런 맥락에서 필요한 것은 흔히 IDF로 부르는 역문서 빈도(Inverse document frequency)이다. IDF에서는 문서별로 용어 빈도들을 구한다. IDF는 “이 토큰이 이 문서에 등장한다는 것이 얼마나 이상한 일인가?”라는 관점에서 생각할 수 있다. 만일 어떤 용어가 이상하게도 한 문서에만 자주 등장하고 말뭉치의 나머지 문서들에는 거의 나오지 않는다면, 그 용어는 그 문서에 아주 중요한 단어일 것이다. IDF를 계산하는 방법은 다음과 같다. 만약 1백만 건으로 이루어진 말뭉치에서 “cat”이라는 단어의 IDF는 log(1,000,000/1)=6 이다. 특정 단어가 문서에서 흔할 수록 IDF 점수는 낮아진다. 따라서 IDF가 크다는 것은 그 단어가 문서에서 중요한 단어라는 것이다.
$$TF(t,d)=log(\frac{count(t)}{count(d)})$$
$$IDF(t,D)=log(\frac{count(token D)}{1+count(t)})$$
각 수식에서 로그를 씌우는 이유는 총 문서의 수가 커질수록 값이 기하급수적으로 커지게 되기 때문이다. 공식을 정리하자면, 한 단어가 문서에 자주 나올수록 그 단어의 TF가 올라간다. 또 그 단어를 포함한 문서가 많을수록(희소하지 않음) 그 단어의 IDF는 내려간다. 이러한 TF와 IDF를 곱하게 되면 주어진 문서에서 그 단어가 얼마나 중요한지를 말뭉치 전체에서의 그 단어의 사용 빈도에 근거해서 추정할 수 있다.
$$TF-IDF = TF(t,d) * IDF(t,D)$$
TF-IDF를 문서 표현 벡터로써 사용한다면 이 표현 벡터는 문서의 의미나 주제(Topic)를 더 충실하게 반영할 수 있다. 하지만 이러한 방식은 단어의 빈도 수를 이용한 수치화 방법이기 때문에 단어의 의미를 고려하지 못한다는 단점이 있다.
3. Sammary
1. 문서를 분석하기 위해 단어를 수치로 표현하는 것은 중요하다. 다만, 단순히 출현 횟수를 sparse하게 표현하는 것보다 응용에 의미가 있는 연속적인 수치로 표현해야한다.
2. 용어빈도(TF)는 단어가 문서에 출현한 횟수를 벡터로 표현한다.
3. IDF는 어떤 단어가 문서에 등장하는 다른 단어와 비교했을 때 얼마나 중요한지를 벡터로 표현한다.
4. TF-IDF를 사용하여 단어의 출현 빈도에 기반한 상대적 중요도를 측정할 수 있다.
5. TF-IDF는 단어의 의미를 고려하지는 못한다.
참고문헌
[1] Benjamin Bengfort. 『Applied Text Analysis with Python』. Jpub, 2019.
'Topic Modeling' 카테고리의 다른 글
Dirichlet Distribution & LDA(Latent Dirichlet Allocation) (1) | 2022.12.19 |
---|---|
pLSA(Probabilistic Latent Semantic Analysis) (1) | 2022.12.19 |
SVD(singular value decomposition) & LSA(Latent Semantic Analysis) (0) | 2022.12.19 |
Topic Modeling 이란? (0) | 2022.12.19 |