정리용

[NLP] TF-IDF 본문

딥러닝/이론

[NLP] TF-IDF

무룡룡 2022. 1. 24. 22:55

1. 용어 정의

 

TF = Term Frequency, 특정 단어의 빈도를 타나냄

 

Doc[0] 에서 go 의 TF는 1 , home 의 TF 는 2 이다.

 

 

DF = Document Frequency, 특정 단어가 나타나는 문장 수

 

home은 총 4번 등장했지만 문장수는 3개 이므로 home 의 DF 는 3 이다

 

 

IDF = ln { (1+n) / (1+df) } + 1 , DF의 역수변환

( n = 3 , 총 문장의 수 )

큰 DF 값을 가지는 단어에 패널티를 주는 것이 목적이다.

 

 

 

 

 

 

 

2. TF-IDF 의 특징

 

TF-IDF은 빈도 기반 단어 임베딩 방법 중 하나이며 특징 추출 기법으로 데이터의 특징들만을 추출하여 딥러닝 학습 효율을 높히는 것이다.

 

특정 단어의 빈도를 기반으로한 특징 추출의 경우 " 저, 그, 이, this, i .." 처럼 조사 관사에 높은 점수를 주기때문에 유의미한 결과를 기대하기 힘든데 이러한 단점을 보안하고자 TF-IDF 를 사용한다.

 

TF - IDF 의 점수는 TF x IDF 의 연산으로 이루어지는데 TF가 가산점이라면 IDF는 패널티인 셈이다.

 

 

 

위 사진에서 home의 경우 ( n = 3 )

 

DF = 3 

 

IDF = ln ( 1+3 / 1+3 ) + 1 = ln 1 + 1 = 1

 

 

 

 

 

 

 

3. 백터화 과정

3-1 단어사전

 

from sklearn.feature_extraction.text import TfidfVectorizer
text = ['i go to my home my home is very large',
        'i went out my home i go to the market',
        'i bought a yellow lemon i go back to home']
tf = TfidfVectorizer()
 
tf.fit(text)
tf.vocabulary_
 
 

model fit을 이용해 모든 문서에 대한 단어 사전(Vocabulary_ , 왼쪽 사진)을 생성한다.

 

 

 

이 때 n-gram 을 사용할 수 있는데 단어를 묶어서 단어사전을 만다는 것이다

 

예를 들어 n-gram의 range를 ( 1, 3 )으로 설정하면 

 

back / back to /  back to home / go / go back / go back to ... 와 같이 단어 사전이 생성된다.

 

 

 

 

 

3-2 TF 벡터화

tf.transform(text).toarray()
 

 

각 문장 ( Doc[n] ) 마다 생성한 단어 사전을 컬럼 ( key 값) 으로하는 벡터를 생성한다.

 

 

 

3-3 DF 벡터화

DF 벡터화 과정도 TF와 비슷하다.

 

단 모든 문장 (doc[0] doc[1] doc[2] ... ) 을 종합하여 계산한다.

 

 

 

모든 문장에서 " back " 는 1개의 문장에서 나왔고 " go " 는  3개의 문장에서 나왔음을 의미한다.

 

주의할 점은 단어를 count하는 것이 아닌 출현 문장을 count 하는 것이다.

 

첫 번쨰 문장에서 go가 3번 나오고 나머지 문장에서 나오지 않았다면 1 의 값을 갖는다.

 

 

 

 

 

3-3 IDF 연산

 

tf.idf_ 를 통해 idf 를 계산하면 다음과 같다.
 
 

 

 
첫번째 인덱스의  " back " 의 경우 DF = 1 , n=3 이므로

IDF = ln{ (1+n) / (1+df) } + 1 공식을 적용한다면

 

IDF = ln ( 4 / 2 ) +1 = 0.69314 + 1 = 1.69314 

 

 

 

 

 

3-4 TF-IDF 백터화

 

TF 벡터와 IDF 백터를 한 후

 

극단치를 가지는 값들을 완만하게 만들기 위해 L2 정규화를 적용하여 최종 TF-IDF를 구한다.

 

TF-IDF 연산 과정 

 

 

 

L2 정규화를 거친 3개 문장에 대한 TF-IDF DTM

 

 

 

 

 

 

 

 

 

4. 유사도 측정

 

문서의 유사도는 단어간의 거리보단 각도에 초점을 두는 코사인 유사도 측정하며 벡태의 내적을 활용한다.

 

3개의 문장에 대해 유사도를 측정해보면 다음과 같다.

 

text = ['i go to my home my home is very large',
        'i went out my home i go to the market',
        'i bought a yellow lemon i go back to home']
from sklearn.feature_extraction.text import TfidfVectorizer
tf = TfidfVectorizer()

tf.fit(text)

tf_matrix = tf.transform(text)
from sklearn.metrics.pairwise import linear_kernel
cosine_sim = linear_kernel(tf_matrix, tf_matrix)
cosine_sim
 
 
 
 
 

첫번째 문장과 두번째 문장의 유사도가 가장 높게 나왔다.

 

 

 

 

 

 

Comments