본문 바로가기
AI

자연어 처리 : 카운트 기반의 단어 표현 : TF-IDF

by 월곡동로봇팔 2020. 3. 6.

1. 정의

(1) TF (Term Frequency)

TF(단어 빈도, term frequency)는 특정한 단어가 문서 내에 얼마나 자주 등장하는지를 나타내는 값으로,

이 값이 높을수록 문서에서 중요하다고 생각할 수 있다.

TF

위의 문장을 보면 car 의 TF 수치가 높은 것을 보아, car가 중요한 문장이다.

하지만 단어 자체가 문서군 내에서 자주 사용되는 경우, 이것은 그 단어가 흔하게 등장한다는 것을 의미한다.

위 그림이 가설의 예시이다.

여기 문장에서 중요한 단어는 friend 이다. 하지만 TF 수치상으로는 a 도 중요하다.

이는 관용적으로 많이 쓰이는 말이고 연관성이 없다는 것 이다.

 

(2) IDF (Inverse Document Frequency)

 

관용적인 표현이나 연관성이 없는 단어의 수치를 DF(문서 빈도, document frequency)라고 하며,

IDF는 ln(문장의 총 수 / 단어가 등장한 문장의 총 수 or +1 (0으로 나누는 행위가 있을수도 있음.))라고 정의한다.

(여러 모듈에서 log 대신 ln을 사용한다.)

 

IDF 값은 문서군의 성격에 따라 결정된다. 

예를 들어 '원자'라는 낱말은 일반적인 문서들 사이에서는 잘 나오지 않기 때문에 IDF 값이 높아지고 문서의 핵심어가 될 수 있지만, 원자에 대한 문서를 모아놓은 문서군의 경우 이 낱말은 상투어가 되어 각 문서들을 세분화하여 구분할 수 있는 다른 낱말들이 높은 가중치를 얻게 된다.

 

(3) TF-IDF

TF-IDF는 TF*IDF 값을 서로 곱한 값이다.

또한 위의 그림은 TF-IDF를 전체적으로 모아둔 table이다.

A, B 문장에서 결국, TF와 IDF가 동시에 높은 수치를 가지는 car, friend가 TF-IDF값이 제일 높은 것을 보인다.

이로써 우리의 keyword를 car, friend가 문장에서 keyword라는 것을 알아내었다. 


2. Sckit-learn을 통한 DTM과 TF-IDF 실습

DTM 구성

from sklearn.feature_extraction.text import CountVectorizer
corpus = [
    'you know I want your love',
    'I like you',
    'what should I do ',    
]
vector = CountVectorizer()
print(vector.fit_transform(corpus).toarray()) # 코퍼스로부터 각 단어의 빈도 수를 기록한다.
print(vector.vocabulary_) # 각 단어의 인덱스가 어떻게 부여되었는지를 보여준다.
output

"""
[[0 1 0 1 0 1 0 1 1]
 [0 0 1 0 0 0 0 1 0]
 [1 0 0 0 1 0 1 0 0]]
 
{'you': 7, 'know': 1, 'want': 5, 'your': 8, 'love': 3, 
 'like': 2, 'what': 6, 'should': 4, 'do': 0}
"""

TF-IDF

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
    'you know I want your love',
    'I like you',
    'what should I do ',    
]
tfidfv = TfidfVectorizer().fit(corpus)
print(tfidfv.transform(corpus).toarray())
print(tfidfv.vocabulary_)
[[0.         0.46735098 0.         0.46735098 0.         0.46735098 0.         0.35543247 0.46735098]
 [0.         0.         0.79596054 0.         0.         0.         0.         0.60534851 0.        ]
 [0.57735027 0.         0.         0.         0.57735027 0.         0.57735027 0.         0.        ]]
{'you': 7, 'know': 1, 'want': 5, 'your': 8, 'love': 3, 'like': 2, 'what': 6, 'should': 4, 'do': 0}

3. Why is TF-IDF?

1. TF-IDF는 단어별로 중요도를 정의, 단어와 문서와의 연관성을 찾아

2. 반복적이고, 관용적인 표현들을 제거하는 방법을 통해

3. 진짜 우리가 원하는 keyword가 필요할 때 쓰인다.!!! + 문서사이 유사도 측정

4. 값이 크다면 ? 특정 문서 내에서 단어 빈도가 높고 전체 문서들 중 그 단어를 포함한 문서가 적을수록!

댓글