Sitemap

TF-IDF (Term Frequency — Inverse Document Frequency) Algorithm

4 min readJun 20, 2018

--

TF-IDF는 여러 개의 문서가 있을 때, 각각의 문서의 내에 있는 단어들에 수치값을 주는 방법인데, 가중치가 적용되어있다. TF-IDF를 계산하면 문서 내에 상대적으로 중요한 단어를 알 수 있다.

TF-IDF는 주로 문서 간 유사도를 측정하는데 사용하는데, 문서 간 유사도를 구하기 위해서는 코사인 유사도를 구하거나 Clustering을 사용하게 된다. 이 때 코사인 유사도나 Clustering을 하기 위해서는 단어들에 수치값이 부여되어 있어야 되는데 이 때 TF-IDF를 계산하여 문서 내에 단어들에 수치값을 부여하게 된다.

이 때, 문서는 글들이 적혀있는 텍스트를 말한다.

TF는 Term Frequency의 약자로 문서에서 해당 단어가 얼마나 나타났는가?를 의미한다. 예를 들어 문서에 “고양이”가 10번 나오면 TF값은 10이 된다.

IDF는 Inverse Document Frequency의 약자로 DF(Document Frequency)의 역수이다. DF는 전체 문서들에서 몇개의 문서에 해당 단어가 나타나있는지에 대한 값이다. 따라서 수식은 DF = 해당 단어가 나타난 문서수 / 전체 문서 수 가 된다. IDF는 이의 역수기 때문에 간단히만 생각하면 IDF = 전체 문서 수 / 해당 단어가 나타난 문서 수가 된다. 그러나 엄청 많은 값을 줄이기 위해서(스케일을 조정하기 위해) log값을 씌우기도 한다. log값은 씌워도 되고 안씌워도 되지만, 보통은 씌워서 많이 사용한다. 그래서 보통 IDF 값은 IDF = log(전체 문서 수 / 해당 단어가 나타난 문서수)로 계산한다.

왜 굳이 DF의 값의 역수값을 사용할까? 그 이유는 가장 DF가 큰 값을 1이 되도록 하기 위함이다. IDF를 확률값으로 처리하는 것이다.

TF-IDF는 이 TF값과 IDF값을 곱한 값이다. 이를 해석해보면, 이 값이 높을 수록 해당 문서에서 자주 등장한다는 뜻이고, 다른 문서에서 등장하면 단어의 중요성이 하락한다는 뜻이 된다.

예제 ) 예를 들어 다음과 같은 3가지 문장이 있다고 해보자.

  • Tom plays soccer. (Doc1)
  • Tom loves soccer and baseball. (Doc2)
  • baseball is his hobby and his job. (Doc3)

TF값 계산

문서에서 해당 단어가 얼마나 나왔는지 알아야 하므로 각 문서에서 해당 단어들이 얼마나 나왔는지 카운트한다.

IDF값 계산

IDF값은 log(전체 문서 수 / 해당 단어가 나타난 문서수) 를 계산한다. 예를 들어 Tom을 계산해보면 해당 단어가 나타난 문서수는 2이고 현재 전체 문서의 수는 3이므로 log(3/2) ≒ 0.18이라는 값이 나온다.

TF-IDF값 계산

TF-IDF값은 TF값과 IDF값을 곱한 값이다. ‘his’ 단어의 경우 TF의 값이 2, IDF값이 0.48이므로 두개를 곱한 2 x 0.48 = 0.96이 TF-IDF값이 된다. 아래 표를 보면 Doc1에서는 ‘plays’, Doc2에서는 ‘loves’, Doc3에서는 ‘his’가 가장 중요한 단어가 된다.

TF-IDF값이 모두 계산되었으므로, 문서 내의 단어들에 수치값을 부여하는 작업은 모두 끝난 것이다. 여기서 이 값들을 이용해 코사인 유사도를 구하거나, 클러스터링 작업을 통해 유사도를 알아볼 수 있다.

TF-IDF 구현

이 TF-IDF는 파이썬에서 간단히 구현할 수 있다. Scikit-Learn 라이브러리를 사용한다.

from sklearn.feature_extraction.text import TfidfVectorizerX = ['Tom plays soccer','Tom loves soccer and baseball','baseball is his hobby and his job']tfidf_vectorizer = TfidfVectorizer(stop_words='english')
tfidf_matrix = tfidf_vectorizer.fit_transform(X)
  • 위에서 사용된 stop_words = ‘english’ 는 불용어를 제거하는 의미로 아래와 같은 코드를 추가해 주어야 한다.
import nltk
nltk.download("stopwords")

--

--

No responses yet