본문 바로가기

DS & ML

TF-IDF(Term Frequency-Inverse Document Frequency)

※본 내용은 <딥러닝을 이용한 자연어처리 입문>의 TF-IDF 내용을 정리한 내용입니다. 

 

TF-IDF : 단어의 빈도와 역 문서 빈도를 사용해 DTM 내의 단어들마다 중요한 정도를 가중치로 주는 방법

 

문서(document) : $d$, 총 문서의 개수 : $n$, 단어(words) : $t$

 

▶ $tf(d, t)$ : 특정 문서 $d$에서의 특정 단어 $t$의 등장 횟수를 계산. (=DTM)

ex) 문서1 : 어려운 자연어처리 자연어처리

      문서2 : 자연어처리 이후 토픽모델링

      문서3 : 어려운 한글 문법

      문서4 : 한글 공고 토픽모델링

 

→ 문서당 등장 단어 빈도를 행렬의 값으로 표기

  어려운 한글 공고 자연어처리 이후 토픽모델링 문법
문서1 1 0 0 2 0 0 0
문서2 0 0 0 1 1 1 0
문서3 1 1 0 0 0 0 1
문서4 0 1 1 0 0 1 0

→ 단점 ) 의미가 없지만 자주 등장하는 단어가 많음.

 

▶ $df(t)$ : 특정 단어 $t$가 등장한 문서의 수

오직 $t$라는 단어가 등장한 문서의 개수에만 관샘을 가진다. 위 예시에서 "토픽모델링"은 문서2에만 등장했기 때문에 얼마나 문서2에서 자주 등장했는지와는 상관없이 "토픽모델링" 단어의 df는 1이 된다. 

 

▶ $idf(d, t)$ : df(t)에 반비례하는 숫자. $$idf(d, t) = \log(\frac{n}{1+df(t)})$$

단순 역수를 취할 경우 총 문서의 수 $n$이 커질수록 IDF가 기하급수적으로 커지기 때문에 log를 취해준 역수. 

밑이 10인 로그를 사용할 경우,  

if n = 1,000,000, $df(t) = 1 \Leftrightarrow n/df(t) = 1,000,000$ 

                                  $df(t) = 1 \Leftrightarrow log(n/df(t)) = 6$

 

즉, 불용어와 같이 자주 등장하는 단어는 중요한/혹은 자주 쓰이지 않는 단어보다 최소 수십배 자주 등장한다. 그런데 비교적 자주 쓰이지 않는 단어도 희귀 단어와 비교하면 또 최소 수백배는 더 자주 등장하는 편이다. 희귀 단어에 엄청난 가중치가 부여되기 때문에 log를 취해주는 것

 

TF-IDF는 여러 문서에서 자주 등장하는 단어는 중요도가 낮다고 판단하며, 특정 문서 내에서 자주 등장하는 단어는 중요도가 높은 것으로 판단한다.

우선, TF는 앞서 이야기한 DTM을 그대로 사용하면, 그것이 각 문서에서의 각 단어의 TF가 된다. 

TF와 곱해야 할 값인 IDF 계산해보자. 이번에는 밑이 e인 자연로그를 사용한다. 로그의 밑은 사용자가 임의로 설정할 수 있다. 

단어 IDF
어려운 $ln(4/(1+2)) = 0.2877$
한글 $ln(4/(1+2)) = 0.2877$
공고 $ln(4/(1+1)) = 0.6931$
자연어처리 $ln(4/(1+2)) = 0.2877$
이후 $ln(4/(1+1)) = 0.6931$
토픽모델링 $ln(4/(1+2))= 0.2877$
문법 $ln(4/(1+1)) = 0.6931$

보면, 문서 1개에서만 등장한 단어와 2개에 등장한 단어만 값의 차이를 보인다. IDF는 여러 문서에 등장한 단어의 가중치를 낮추는 역할을 수행한다. 

 

이제, TF-IDF를 계산해 보자. 앞의 DTM에 단어별로 위의 IDF 값을 곱해주면 TF-IDF가 계산된다. 

  어려운 한글 공고 자연어처리 이후 토픽모델링 문법
문서1 0.2877 0 0 0.5754 0 0 0
문서2 0 0 0 0.2877 0.6931 0.2877 0
문서3 0.2877 0.2877 0 0 0 0 0.6931
문서4 0 0.2877 0.6931 0 0 0.2877 0

즉, 여러 문서에 반복적으로 등장하는 단어는 낮은 가중치를, 특정 하나의 문서에서 자주 등장하는 단어에는 d 내에서 w의 반복횟수 * IDF 값을 곱하기 때문에 높은 확률값을 가질 가능성이 높음. 

 

다만, 만약 문서4개 중 3개에서 모두 "자연어처리"라는 단어가 등장했다면, 계산식에서 $log(4/(1+3)) = 0$으로 가중치가 계산되어버리기 때문에, 실제 구현체에서는 이를 방지하기 위해 아래의 식을 사용하게 된다. 

$$ idf(d, t) = \log(\frac{n}{1+df(t)}) + 1$$

 

 

'DS & ML' 카테고리의 다른 글

LDA(Latent Dirichlet Allocation) 잠재 디리클레 할당  (0) 2021.07.29