반응형

 

주요 내용

    1. 개요
    2. TF-IDF 계산 해보기
    3. TF-IDF의 장점 및 단점

 

1. 개요

TF-IDF 는 BoW(Bag of Words)와 마찬가지로 텍스트 데이터를 (컴퓨터에서 사용하기 위해) 표현하는 방법중 한가지 방법 입니다. 정보 검색과 텍스트 마이닝에 많이 쓰입니다. 특히, 이 방법은 단어의 출현 빈도를 가지고 단어의 중요도를 표현하는 방법입니다. 그래서 해당 문서에서의 단어 출현 횟수와 다른 전체 문서에서의 출현 횟수를 고려해서 중요도를 계산합니다. 해당 문서에서의 단어 출현 횟수는 많으면 많을 수록 단어의 중요도가 더 높아지고(Term Frequency), 다른 전체 문서에서의 출현 횟수가 많아지면 많아 질수록(다른 문서에서도 많이 쓰이면 쓰일 수록) 중요도가 떨어지게하는(Inverse Document Frequency) 숫자를 만드는 방법 입니다.
예를 들어 보겠습니다. '노란 사자 왕' 이란 검색어와 가장 적절한 문서를 찾으려면 어떻게 해야할 까요? 가장 간단한 방법은 각 단어가 포함되어 있는 문서를 찾는 것일 것입니다. 그런데 이런 문서가 10,000개 있다면 어떻게 해야 할까요? 네, 여러번 '노란', '사자', '왕' 이란 단어가 들어가 있으면 더 적절한 문서라고 할 수 있을 것 같습니다. 그런데 이렇게 해서 다시 필터링해보니 100건이 나왔다고 합시다. 여러번 나왔으니 더 적절한 문서라고 할 수 있지만 문서의 길이를 고려하지 못해서 전체 문서에서의 단어 중요도가 반영되지 못했습니다. 1페이지 문서에서 10번 나온 것과 100페이지 문서에서 10번 나왔다면 1페이지에서 10번 나온 문서가 더 밀접한 관계가 있다고 말할 수 있습니다. 그래서 문서의 길이를 고려한 출현 횟수를 산정하는 방법이 바로 Term Frequency 입니다. 그래서 간단한 공식으로는 단어 출현횟수/ 문서내 전체 단어수가 되겠습니다.
그럼 두번째 전체 문서에서의 출현 횟수 왜 필요할까요? 문서중에는 의미가 없는 단어들도 매우 많습니다. 행태소 분석시 나오는 '는', '를', 'ㅂ니다' 같은 요소들은 의미는 없지만 일반적으로 매우 많이 출현하는 단어에 해당합니다. 이러한 단어들에게는 매우 작은 값으로 계산되는 것이 필요하겠습니다. 그러면 이런 숫자는 어떻게 계산할까요? 위에서 설명한 것처럼 모든 문서에서 나타나면 안 중요한 단어이고 해당문서에서만 나타나면 중요한 단어인 것이지요. 이렇게 만들려면 전체 문서수와 해당 단어가 나타난 문서수의 비율로 계산할 수 있겠습니다. 전체 문서수 / 해당 단어 출현 문서수 이렇게 계산하면 되겠군요. 100 개 문서중에 1번 나타난 단어(100/1=100)와 100개 문서중에 10번 나타난 단어(100/10=10)는 중요도가 달라집니다. 그런데 이렇게 하면 전체 문서와 단어 출현 문서수가 클 경우 중요도 차이가 너무 크게 됩니다. 그래서 여기에 log 를 적용하여 숫자를 작게 만듭니다. log(100) = 2, log(10) = 1. 아까는 차이가 9였는데 이제는 1이 되었네요. 그래서 간단한 공식으로는 log(전체 문서수/해당 단어 출현 문서수)가 됩니다. 이것이 Inverse Document Frequency입니다.
그런데 다른 자료들을 보면 계산하는 방법이 이렇게 간단하지 않고 복잡하고, 방법도 여러가지가 있는 걸까요? 그 이유는 좀더 정확한 계산을 위해서 단순한 출현 횟수를 그대로 사용하지 않고 변환을 하기 때문에 그렇습니다. 위에서 log를 적용한 것처럼 말이죠. 중요한 것은 기본을 이해하는 것 입니다. 기본을 이해해야 변형을 이해하기 쉽습니다. 기본은 위에서 말씀 드린 것 처럼 어렵지 않습니다.

큰 숫자에 대응하기 위해 log를 사용하고 분모/분자가 0이 되면 안되므로 문서가 없을 때를 대비해서 분모/분자에 1을 더해줍니다. 그래서, TF-IDF의 공식은 아래와 같습니다.
 
해당 단어의 TF-IDF = Term Frequency X Inverse Document Frequency
해당 단어의 TF-IDF = TF(t,d) X IDF(t, D)
해당 단어의 TF(t,d) = log (f(t,d) + 1)
해당 단어의 IDF(t, D) = log (D / ( {d in D : t in d} ) + 1) )
t: 해당 단어
d: 해당 문서
D: 전체 문서 개수

 

 

2. TF-IDF 계산 해보기

 

위에서 말씀드린 공식을 이용해서 실제 TF-IDF 값을 계산해 보겠습니다.

 

Data

아래와 같은 데이터를 가정하겠습니다.

총 문서 데이터 개수, D = 10

각 문서 별 내용
d1 = I love apple"
d2 = I love peach
d3 = I love lion"
d4 = “You love lemon”
d5 = “Youlove horse"
d6 = “Youlove lion”
d7 = “We love tiger"
d8 = “We hate apple
d9 = “We hate banana"
d10 = “They hate peach

 

 

d1의 tf-idf 구하기

문서 d1에 대하여 TF-IDF를 구합니다. ln은 자연로그 입니다.

t = “I” d1 = “I love apple"
tf(t,d) = tf(“I”,d1) = ln (1 + 1) = 0.6931 (count 로 할때, 문서 d에서 t가 발견되는 건수)
idf(t, D) = log (D / {d in D : t in d} ) = ln(10 / (3 + 1)). = ln(2.5) = 0.9162 10개 문서중 3개 문서에서 I 가 발견됨
“I” tfidf = tf(“I”,d1) * idf(“I", 10) = ln(2) * ln(2.5) = 0.6931 * 0.9162 = 0.6350 ("I"의 TF-IDF입니다.)

t = “love” d1 = “I love apple"
tf(t,d) = tf(“love”,d1) = ln (1 + 1) = 0.6931 (count 로 할때, 문서 d에서 t가 발견되는 건수)
idf(t, D) = log (D / {d in D : t in d} ) = ln(10 / (7 + 1) ) = ln(1.25) = 0.22314 10개 문서중 7개 문서에서 love 가 발견됨니다.
“love” tfidf = tf(“love”,d1) * idf(“love", 10). = ln(2) * ln(1.25) = 0.6931 * 0.22314 = 0.15466 (love라는 단어가 많은(7개) 문서에서 나타나기 때문에 tfidf 값이 비교적 작습니다. 단어가 주는 차별성/특성이 작다고 할 수 있습니다.)

t = “apple” d1 = “I love apple"
tf(t,d) = tf(“apple”,d1) = ln (1 + 1) = 0.6931 (count 로 할때, 문서 d에서 t가 발견되는 건수)
idf(t, D) = log (D / {d in D : t in d} ) = ln(10 / (2 + 1) ) = ln(3.3333) = 1.2039 10개 문서중 2개 문서에서 apple 가 발견됩니다.
“apple” tfidf = tf(“apple”,d1) * idf(“apple", 10). = ln(2) * ln(2.4285) = 0.6931 * 1.2039 = 0.8344 (apple라는 단어가 적은(2개) 문서에서 나타나기 때문에 tfidf 값이 비교적 큽니다. )

d1 = “I love apple” = [0.6350, 0.15466, 0.8344]
 
 

d2의 tf-idf 구하기

t = “I” d2 = “I love peach”
tf(t,d) = 0.6931
idf(t, D) = 0.9162
“I” tfidf = 0.6931 * 0.9162 = 0.6350

t = “love” d2 = “I love peach”
tf(t,d) = 0.6931
idf(t, D) = 0.22314
“peach” tfidf = 0.6931 * 0.22314 = 0.15466

t = “peach” d2 = “I love peach”
tf(t,d) = tf(“peach”,d1) = ln (1 + 1) = 0.6931 (count 로 할때, 문서 d에서 t가 발견되는 건수)
idf(t, D) = log (D / {d in D : t in d} ) = ln(10 / (2 + 1) ) = ln(3.3333) = 1.2039 10개 문서중 2개 문서에서 peach 가 발견됩니다.
“peach” tfidf = tf * idf = 0.6931 * 1.2039 = 0.8344

d2 = “I love peach” = [0.6350, 0.15466, 0.8344]
 
 

d10의 tf-idf 구하기

t = “They” d10 = “They hate peach”
tf(t,d) = tf(“They”,d10) = ln (1 + 1) = 0.6931 (count 로 할때, 문서 d에서 t가 발견되는 건수)
idf(t, D) = log (D / {d in D : t in d} ) = ln(10 / (1 + 1)). = ln(5) = 1.6094 10개 문서중 1개 문서에서 They 가 발견됨
“They” tfidf = tf(“They”,d10) * idf(“They", 10) = ln(2) * ln(2.5) = 0.6931 * 1.6094 = 1.1154 (They라는 단어가 하나의 문서에서 나타나기 때문에 tfidf 값이 매우 큽니다. )

t = “hate” d10 = “They hate peach”
tf(t,d) = tf(“hate”,d1) = ln (1 + 1) = 0.6931 (count 로 할때, 문서 d에서 t가 발견되는 건수)
idf(t, D) = log (D / {d in D : t in d} ) = ln(10 / (3 + 1) ) = ln(2.5) = 0.9162 10개 문서중 3개 문서에서 hate 가 발견됨
“hate” tfidf = tf(“hate”,d1) * idf(“hate", 10). = ln(2) * ln(1.25) = 0.6931 * 0.9162 = 0.6350 (hate라는 단어가 적은 문서(3)에서 나타나기 때문에 tfidf 값이 비교적 큽니다. )

t = “peach” d10 = “They hate peach”
tf(t,d) = tf(“peach”,d1) = ln (1 + 1) = 0.6931 (count 로 할때, 문서 d에서 t가 발견되는 건수)
idf(t, D) = log (D / {d in D : t in d} ) = ln(10 / (2 + 1) ) = ln(3.3333) = 1.2039 10개 문서중 2개 문서에서 peach 가 발견됩니다
“peach” tfidf = tf(“peach”,d1) * idf(“peach", 10). = ln(2) * ln(2.4285) = 0.6931 * 1.2039 = 0.8344 (peach라는 단어가 적은(2개) 문서에서 나타나기 때문에 tfidf 값이 비교적 큽니다. )

d10 = “They hate peach” = [1.1154, 0.7614, 0.8344]
 
 

Summary

d1   = “I love apple”       = [0.6350, 0.1546, 0.8344]
d2   = I love peach”       = [0.6350, 0.1546, 0.8344]
d10 = “They hate peach” = [1.1154, 0.63500.8344]
 

각 문서별 벡터를 가지고 TF-IDF 메트릭스를 만듭니다.

word
d1
d2
d10
i
0.6350
0.6350
0
love
0.1546
0.1546
0
apple
0.8344
0
0
they
0
0
1.1154
hate
0
0
0.6350
peach
0
0.8344
0.8344
 
 
 

문서 간의 유사도 계산

d1 d2유사도 = (0.6350 * 0.6350) + (0.1546*0.1546) + (0.8344*0+ (0*0.8344) = 0.42712616
d1 d10 유사도 = (0.6350 * 0) + (0.1546*0+ (0.8344*0+ (0*1.1154) + (0*0.7614+ (0*1.1154) = 0
d2 d10 유사도 = (0.6350 * 0) + (0.1546*0+ (0.8344*0.8344)  = 0.6962
해석: 3개의 문서중에는 d2과 d10이 가장 유사하고, d1과 d10은 완전히 다른 문서이다.

상기와 같이 문서간의 유사도 계산 뿐만아니라 키워드(검색어)를 가지고 유사도를 계산하면 유사한 문서를 가져오는 정보 검색에 사용할 수 있습니다.

 

 

 

3. TF-IDF의 장점 및 단점

 1. 위 예시에 행렬 테이블에서도 보이는 바와 같이 0이 많이 들어있는 행렬 테이블이 만들어져서 문서의 길이가 길고 중복된 단어가 적을 수록 더 비효율 적입니다. sparce matrix (many number of 0 value)
2. 간단하게 단어의 개수로 표현되어 구현이 쉽지만 단어 위치의 의미를 파악하지는 못합니다. 문서 d1에 있는 i 와 문서  d10에 있는 hate 가 다른 단어 임에도 불구하고 같은 값 0.6350을 갖습니다. simple count of words, not present meaning of position(‘i' in d1 and ‘hate' in d10 have same value, 0.6350)
3. TF-IDF 메트릭스(행렬)에 없는 새로운 단어가 들어오면 계산할 수 없습니다. cold start, new words come, need new matrix(‘happy’?...) 이러한 부작용을 줄이기 위해 BoW(Bag of Words)에서와 마찬 가지로 더미 워드나, hashing 기법 등을 이용할 수 있습니다.

 

 
 
 
 
이렇게 정보검색과 텍스트 마이닝에 많이 쓰이는 단어의 중요도 표현 방법중 하나인 TF-IDF에 대해서 알아보고 실제로 계산을 해보았으며, 장점과 단점에 대해서도 이야기해 보았습니다.
 
 

 

 
 
반응형

+ Recent posts