TF-IDF

  • Term Frequency * Inverse Document Frequency 의 값을 의미한다.
  • 사용하는 경우
    1) 문서의 유사도를 구할 때
    2) 검색 시스템에서 검색 결과의 중요도를 구할 때
    3) 문서 내에서 특정 단어의 중요도를 구할 때 등에 주로 사용된다.
    • 특정한 query Q = {q1, q2, … ,qn} 가 어떤 문서에서 해당 점수가 제일 높은지를 봄으로써, 가장 유사도가 있는지 등을 판별해 볼 수 있다.
  • 높을수록 해당 쿼리와 특정 문서 사이의 유사도가 높다, 중요도가 크다. 라고 판단할 수 있다.

  • Term Frequency
    documents DOCS = {doc1, doc2, doc3, ,,,,} (m개의 document 로 구성)
    query Q = {q1, q2, q3, …} (qn개의 단어로 구성)

    $Term Fequency(doc1, q1)$
    특정 단어 q1이 doc1이라는 문서에서 얼마나 빈번하게 등장했는지를 count하여 return한다.
  • Inverse Document Frequency
    • Document Frequency 의 역수의 값을 표현하려 함이다.
      • Document Frequency
        documents DOCS = {doc1, doc2, doc3, ,,,,} 에서 특정한 단어 q1이 몇 개의 문서에서 등장했는지를 count한다.
          cnt = 0
          for doc in docs : 
              if q1 in doc : cnt +=1 
        
    • Inverse DF
      N을 총 문서 수라고 할 때, $log (N / 1 + df(q1))$

      • 분모에 1을 더하는 이유는 df == 0 일 때, 분모가 0이 됨을 막기 위함이다.
      • N / df 값을 취함으로써, 다른 문서에 등장하는 회수가 많아질수록 값은 작아짐 -> 중요도가 낮아지게 된다.
        반대로, 다른 문서에 등장하는 경우가 적으면 적을수록 값은 커짐 -> 중요도가 커진다.
      • log scale 을 적용하여 값이 document 가 매우 많아지더라도 값이 기하 급수적으로 커지는 것을 막는다.
  • 최종 식
      TF_IDF(docs, query): 
          scores = [] 
          for doc in docs :  
              score = 0
              for q in query.split() :
                  score += term_frequency(doc, q) * inverse_document_frequency(docs, q) 
              scores.append(score)
    
    • 해당하는 doc 마다 query 에 대한 score 가 나옴

Reference

  • https://wikidocs.net/31698