머신러닝

TF-IDF

APinCan 2020. 9. 7. 17:33

TF-IDF(Term Frenquency-Inverse Document Frequency)

 

여러 문서들로 이루어진 문서군에서 어떤 단어가 특정 문서 내에서 얼마나 중요한 것인지 나타내는 통계적 수치. 문서에서 핵심어를 추출하거나 문서들  사이의 유사도를 구하는 정도로 사용 가능.

 

TF(Term Frequency): 어떤 한 문서에서 해당 단어가 얼마나 자주 나왔는지를 나타내는 것. 예를 들어 현재 문서에서 '문서'라는 단어가 4번 나온다면 현재 문서에서 '문서'라는 단어의 TF=4이 된다.

 

DF(Document Frequency): TF가 한 문서에서 단어가 몇번 등장했는지를 나타내는 것이라면, DF는 몇 개의 문서에서 해당 단어가 등장했는지를 나타낸다. 예를 들어 10개의 문서에서 2개의 문서에 '문서'라는 단어가 나왔다면 DF=2/10=0.2가 된다. 여기서 각각의 문서마다 '문서'라는 단어가 몇번이나 등장했는지는 신경쓰지 않는다. 즉 1번 문서에서 5번, 2번 문서에서 10번 등장해도 DF=0.2다.

 

IDF(Inverse Document Frequency): DF의 역수와 비슷한 형태를 취하고 있는데 생김새는 조금 다르다. 일단 분자에 있는 |D|는 전체 문서의 개수를 나타낸다. 분모에는 특이하게 1+df(t)를 해주는데 단어 t가 포함된 문서의 개수가 0일 경우 분모에 0이 들어가기 때문에 이를 막기 위해 1을 더해준다. 그리고 만약 분모가 작고 문서의 개수가 많이 늘어난다면 IDF값이 커지기 때문에 log를 사용한다.

$$ idf(t, D) = log( \frac{|D|}{1+df(t)} )$$

 

TF-IDF는 TF와 IDF를 곱한 식으로 아래와 같이 나타낸다.

어떤 문서 d에서 단어 t가 나온 빈도수 tf(t,d)

전체 문서 D에서 단어 t가 나온 비율의 역 idf(t,D), 즉 idf가 커질수록 단어 t가 나온 문서 수가 작아진다.

$$ tf-idf = tf(t, d) * idf(t,D) = tf(t,d) * log(\frac{|D|}{1+df(t)}) $$

 

특정 문서 내에서 어떤 단어 t를 많이 사용할 수록, 그리고 전체 문서들 중에서 단어 t를 포함한 문서가 적을수록 TF-IDF값이 높아진다. 즉 특정 문서에서 TF-IDF 값이 높아질수록 그 문서에만 있는 흔하지 않은 단어라는 뜻이다.

 

 

 

TF를 계산하는 방법은 몇가지가 더 있다고 한다. 참고로 여기서 f(t,d)는 어떤 문서 d에서 단어 t가 나온 횟수이다.

 

1. 불린 빈도

$$ tf(t, d) = 1 \,\,or\,\, 0 $$

단어 t가 문서 d에 한번이라도 나타나면 1, 아니면 0으로 표시한다.

 

 

2. 로그 스케일 빈도

$$ tf(t, d) = log( f(t,d) + 1) $$

단어가 나온 횟수가 너무 많아질 수가 있으니 로그를 이용해 증가율을 적당히 조절하는 방법으로 보인다. IDF에서 log를 씌운 이유와 같다.

 

 

3. 증가 빈도

$$ tf(t,d) = 0.5+\frac{0.5 \times f(t,d)}{max\{ f(w,d) : w \in d  \} } $$

문서의 길이가 길 경우 단어의 빈도값을 조절하기 위해 사용한다고 한다. 분모에는 현재 문서 d 내에서 가장 자주 나오는 단어의 빈도수가 들어가고, 분자에는 현재 문서 d에서 나온 단어 t의 빈도수 * 0.5를 한 것에 0.5를 더한다. 여기서 0.5는 평준화를 위한 임의의 값이라고 한다.

 

Reference:

[1]: ko.wikipedia.org/wiki/Tf-idf