※본 내용은 <딥러닝을 이용한 자연어처리 입문>의 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 |
---|