슬기로운 연구생활

Classification - [7] TF-IDF 본문

슬기로운 NLP 생활

Classification - [7] TF-IDF

vhrehfdl 2020. 8. 23. 16:29

이전 글

[1] 자연어처리란?

[2] Classification Task

[3] POS Tagging

[4] Stemming, Lemmatizing

[5] 형태소 분석기

[6] One-Hot Encoding, Bag Of Word

 

들어가며

이전 글에서는 Text To Vector의 가장 기본적인 단계인 One-Hot Encoding과 Bag of Words에 대해 알아보았습니다. Bag of Words의 문제점은 중요한 단어들에 대해 가중치를 주지 못한다는 문제점이 있습니다. 

그래서 이번 글에서는 단어마다 가중치를 부여해 서로 다른 값을 가지는 TF-IDF에 대해 알아보겠습니다.

 

TF-IDF

TF-IDF란 단어의 빈도와 역문서 빈도를 계산해 단어에 가중치를 부여하는 방법입니다.

TF ( Term Frequency ) : 특정 문서 d에서 특정 단어 t의 등장 회수.

ex) "과자"라는 단어가 문서3에서 3번 등장하면 TF는 3입니다.

DF( Document Frequency ) : 특정 단어 t가 등장한 문서의 수.

ex) "과자"라는 단어가 문서2와 문서3에서 언급되었습니다.

이럴 경우 DF는 2입니다.

IDF ( Inverse Document Frequency ) : DF(t)에 반비례하는 수.

분모에 1을 추가해주는 이유는 df가 0일 경우에 분모가 0이 되기 때문입니다.

​분자의 n은 전체 문서의 개수를 의미합니다.

log( 전체문서 / ( 1+ 단어가 포함된 문서의 수 ) ) 

ex) "과자"라는 단어가 문서1에서 0번, 문서2에서 100번, 문서3에서 200번 언급되었다고 가정 해보겠습니다..

log( 분자 : 3 / 분모 : 1+2 ) 가 됩니다.

 

최종적으로 TF 값 x IDF 값을 곱하면 단어의 가중치가 구해집니다.

 

TF-IDF 의미

TF-IDF는 이전 글에서 배웠던 Bag of Words와는 다르게 단어마다 가중치가 부여됩니다. 

BoW에서는 "사과"와 "행복"이라는 단어가 똑같이 1로 연산되었다면, TF-IDF에서는 단어의 중요도에 따라 다르게 연산이 되어집니다.

 

모든 문서에서 자주 사용되는 단어는 무엇일까요? 

"은", "는", "이", "가"와 같은 조사가 제일 많이 사용될 것 입니다.

 

그렇다면 조사가 해당 문서의 특성을 가장 잘 나타내는 단어일까요?

TF-IDF의 수식에 의해 전체 문서에 전체적으로 등장하는 조사는 IDF의 값이 작아지게 되므로 단어의 가중치가 낮아지게 됩니다.

 

반대로, 특정 문서 내에서 빈도가 높은 단어일 수록 TF-IDF 값이 높아지게 됩니다.

따라서 모든 문서에 나타나는 흔한 단어들을 걸러내며, 특정 단어가 가지는 중요도를 알 수 있습니다.

 

TF-IDF 구현 예시​

전체소스코드는 github에 공개되어있습니다.

https://github.com/vhrehfdl/Blog_code/blob/master/%EC%8A%AC%EA%B8%B0%EB%A1%9C%EC%9A%B4%20%EC%9E%90%EC%97%B0%EC%96%B4%EC%B2%98%EB%A6%AC/%EC%8A%AC%EA%B8%B0%EB%A1%9C%EC%9A%B4_%EC%9E%90%EC%97%B0%EC%96%B4%EC%B2%98%EB%A6%AC_%5B7%5D_TF_IDF.ipynb

 

vhrehfdl/Blog_code

Contribute to vhrehfdl/Blog_code development by creating an account on GitHub.

github.com

1. 기본 버전

TF-IDF는 sklearn을 사용해 구현했습니다.

리스트는 3x10으로 구성되어 있습니다.

3은 문장의 개수이며 10은 vocabulary에 등록된 단어의 개수입니다.

 

2. 특정 빈도수 보다 낮은 단어 제외

TF-IDF는 Default 값으로 한 글자 단어는 제외하게 되어있습니다.

Version2 코드는 한 글자인 단어도 Vocabulary에 등록하는 방법입니다.

 

3. N-gram 설정

TF-IDF는 설정에 따라 2글자, 3글자 단위로 Vocabulary를 구성할 수 있습니다.

Version3 코드가 다음과 같습니다.

 

마무리

이번글에서는 TF-IDF에 대해 알아보았습니다.

TF-IDF는 이전 글에서 배웠던 Bag of Words와는 다르게 단어마다 가중치가 부여됩니다. BoW에서는 "사과"와 "행복"이라는 단어가 똑같이 1로 연산되었다면, TF-IDF에서는 단어의 중요도에 따라 다른 가중치가 부여됩니다.

TF-IDF도 BoW와 마찬가지로, Sparse Vector이기 때문에 단어간의 의미적 유사성을 알 수 없습니다. 또한, Sparse Vector는 Vocabulary의 수가 많아지면 한 단어를 표현하는데 불필요한 공간이 많이 필요합니다. 

다음글에서는 이러한 문제를 멋지게 해결한 Word Embedding 방법에 대해 알아보도록 하겠습니다. 개인적으로 NLP의 꽃이며 핵심이라고 생각되는 부분이니 많은 Embedding 방법에 대해 상세하게 살펴보겠습니다.

 

Comments