Data Science/자연어 처리 (NLP)

TF-IDF(Term Frequency - Inverse Document Frequency)에 대해 알아보기 - Python3, Windows 10 (Feat. Scikit-Learn)

 

아래 글에서 이어지는 내용이다.

foreverhappiness.tistory.com/35

 

[자연어 처리] 불용어(Stop Words) 처리하기 - Python3, Windows 10

아래 글에서 이어지는 내용이다. foreverhappiness.tistory.com/30 [자연어 처리] KoNLPy를 사용하여 형태소 분석 및 DTM 만들기 - Python3, Windows 10 (feat. Okt, Pandas, Scikit-Le 아래 글에서 이어지는 내용..

foreverhappiness.tistory.com

 

이번에는 TF-IDF(Term Frequency - Inverse Document Frequency)에 대해 알아보고자 한다.

 

TF-IDF는 Term Frequency(단어 빈도)와 Inverse Document Frequency(역 문서 빈도)로 나누어 생각하면 편하다.

 

어떤 문서에 대해 빈도가 높은 키워드(단어)로 검색한다면 해당 키워드가 포함된 다른 문서까지 검색될 것이다.

하지만 빈도가 적은 키워드로 검색을 한다면 원하는 문서를 보다 빠르게 검색할 수 있을 것이다.

 

즉 TF-IDF는 문서에 포함된 어떤 단어가 해당 문서에 얼마나 중요한 키워드인지를 표현하는 방법이다.

 

그럼 TF-IDF는 어떤 방식으로 표현되는지 알아보자.

 


 

  • TF (Term Frequency): 특정 문서의 특정 단어 빈도수

TF는 앞서 만들었던 DTM의 값들이다. i번째 문서에 등장하는 w라는 단어의 등장 횟수를 말한다.

 

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

DF는 전체 문서에 대해 특정 단어가 나타난 문서의 개수이다.

전체 문서의 개수를 n개라고 하자. "Hello"라는 단어가 3번 문서에 10번, 5번 문서에 9번 출현했다면 DF는 2가 된다.

 

  • IDF (Inverse Document Frequency): DF의 역수

IDF는 DF의 역으로 아래와 같은 수식으로 구할 수 있다.

log를 씌워준 이유는 문서의 수가 너무 커질 경우 값이 너무 커질 수 있기 때문이다.

 

  • TF-IDF (Term Frequency - Inverse Document Frequency): 단어 빈도 역 문서 빈도

TF-IDF는 TF와 IDF의 곱으로 나타낼 수 있다.

 


 

TF-IDF를 직접 구현해도 되지만 이번에는 Scikit-Learn 라이브러리를 써볼 것이다.

 

이때 DTM(Document Term Matrix)가 필요하다. 

 

DTM은 이전 게시글을 참고하면 되며 파일이 필요하다면 아래 링크에서 다운로드하면 된다.

https://github.com/happiness96/Web-Crawling/tree/master/crawling

 

happiness96/Web-Crawling

Web Crawling, Text mining, Data mining (Using Python3) - happiness96/Web-Crawling

github.com

 

아래 코드를 실행시켜보자.

 

# -*- encoding: utf-8 -*-
import pandas as pd
from sklearn.feature_extraction.text import TfidfTransformer
# TFIDF를 확인하기 위해 TfidfTransformer을 선언해준다.


if __name__ == '__main__':
    # TFIDF는 DTM으로 확인이 가능하기 때문에 앞전에 만들었던 DTM.csv 파일을 불러온다.
    dataset = pd.read_csv('D:\crawling\DTM.csv')

    # 0번째 열에는 문서 번호가 들어있기 때문에 0번째 열은 pop해준다.
    dataset.pop(dataset.columns[0])

    # fit_transform 함수를 통해 DTM을 TFIDF로 변환할 수 있다.
    tfidf = TfidfTransformer().fit_transform(dataset)

    tfidf_array = tfidf.toarray()       # toarray 함수를 통해 2차원 배열로 만든다.

    # tfidf 배열을 DataFrame 형식으로 변환시킨다.
    tfidf_data_frame = pd.DataFrame(tfidf_array, columns=dataset.columns)

    tfidf_data_frame.to_csv('D:\crawling\TF-IDF.csv', encoding='utf-8-sig')

 

TFIDF는 Scikit-Learn에서 제공하는 TfidfTransformer를 사용하면 된다.

 

이때 DTM이 필요하므로 pandas 모듈을 통해 불러온다.

DataSet형식으로 불러와질 테니 0번째 열은 제거해주고 이를 TfidfTransformer에 fit_transform함수에 넣어 TF-IDF로 변환시켜준다.

여기에 toarray 함수를 사용하면 행이 각 문서, 열이 각 단어에 해당하는 2차원 배열로 반환된다.

 

이를 csv파일로 최종 변환하면 아래와 같은 결과가 나올 것이다.

 

TF-IDF

 

값이 0이면 해당 문서에 해당 단어가 출현하지 않는 것이고, 각 칸에는 TF-IDF 수치가 들어가 있다.

수치가 낮을수록 해당 문서에 그 단어의 중요도가 높은 것이다.

 


 

여기까지 TF-IDF에 대해 알아보았다.

 

TF-IDF는 특정 뉴스나 신문 기사에 대한 정보를 검색할 때나 포괄적이 아닌 세부적으로 unique한 문서를 찾고자 할 때 많이 사용될 것이다.