728x90

1. TF-IDF (단어 빈도-역 문서 빈도, Term Frequency - Inverse Document Frequency)란?

TF-IDF를 알려면 먼저 Bag of Words(BoW)에 대해 알아야 한다. BoW는 문서 내에 등장하는 단어들을 순서는 전혀 고려하지 않은 채 오직 빈도수에 중점을 두는 방법이다.

 

<Bow를 만드는 방법>

1. 각 단어에 고유한 인덱스를 부여한다(정수 인코딩)

2. 각 인덱스의 위치에 단어 토큰의 등장 횟수를 기록한 벡터를 만든다.

 

Document-Term Matrix(DTM)

이때 BoW 기반 표현을 통해 문서의 정보를 벡터, 행렬화하는 것이 가능해진다. 이것이 문서-단어 행렬(Document-Term Matrix, DTM)이다. 이는 각 행에 문서(document)가, 각 열에 단어(term)가 위치한 행렬이다.

DTM 예시(출처:https://blog.naver.com/shino1025/221868521724)

DTM은 간단하다는 장점이 있지만 다음과 같은 단점이 있다.

 

1. 대용량 문서의 경우 리소스 낭비 심각

2. 빈도 수 접근의 위험성 --> ex. 불용어. ==> 이를 적절히 선별해주는 전처리 작업이 필요!

 

TF-IDF (Term Frequency-Inverse Document Frequency)

 

TF-IDF는 기존의 DTM에서 각 단어의 중요도라는 개념을 가중치로 부여하는 기법이다. 기존의 DTM을 사용하는 것보다 더 심도있게 접근할 수 있으며 보다 더 많은 정보를 고려하여 문서들을 비교할 수 있다. 

 

여러 문서에서 무분별하게, 어떤 연관성 등의 이유없이 많이 등장하는 단어에 가중치를 적게 주어 큰 특징이 없지만 자주 등장하는 단어가 설명력이 높아지는 것을 방지한다. TF, IDF는 각각 단어 빈도, 역문서 빈도라는 의미이다. 그 정의를 하나씩 알아보자.

 

출처:https://velog.io/@rsj9987/딥러닝-자연어-등장횟수-기반의-단어표현

 

TF(d, t)

  • TF는 특정 문서 d에서 단어 t가 등장한 횟수를 말한다.
  • 1 글자는 빈도수에서 제외된다.
  • 이는 기존의 DTM과 완전히 똑같은 개념이기 때문에 DTM 자체가 이미 TF 값인 셈이다.
 

 

DF(t)

  • DF는 특정 단어 t가 등장한 문서의 수이다.
  • 하나의 문서 내에서 얼마나 많이 등장했냐는 상관없다. 오직 등장했던 문서의 수를 뜻한다.
  • 즉 문서 총 3개 안에서, 'bag'이란 단어가 6번 쓰였지만 나타난 총 문서 수는 2라면 DF=2이다.

 

IDF(d, t)

  • IDF는 기본적인 의미로는 DF의 역수, DF와 반비례하는 수를 뜻한다.
  • 그러나 위 식은 단순히 df를 내리는 뿐만 아니라 log를 취하고 있는데, 이는 총 문서의 수 N이 커지면 커질수록 값이 너무 커져버리기 때문에 log를 사용한다. 이러한 방식으로 많이 등장하는 단어에 penalty를 줄 수 있다.
  • 1을 더하는 이유는 단순히 분모가 0이 되는 것을 방지하기 위해서이다.

 

코드

from sklearn.feature_extraction.text import TfidfVectorizer
# TF-IDF vectorizer. 테이블을 작게 만들기 위해 max_features=15로 제한
tfidf = TfidfVectorizer(stop_words='english', max_features=15)

# Fit 후 dtm을 만든다.(문서, 단어마다 tf-idf 값을 계산)
dtm_tfidf = tfidf.fit_transform(sentences)

dtm_tfidf = pd.DataFrame(dtm_tfidf.todense(), columns=tfidf.get_feature_names())
dtm_tfidf

# 출처 : https://velog.io/@rsj9987/딥러닝-자연어-등장횟수-기반의-단어표현
출처:https://velog.io/@rsj9987/딥러닝-자연어-등장횟수-기반의-단어표현

 

 

2. TF-IDF는 어떨 때 유용한가?

큰 특징 없이 자주 등장하는 불용어, 혹은 글의 주제라는 이유로 어떤 맥락에든 지속적으로 등장하는 단어등의 영향을 줄이는 역할을 한다. 이를 통해 문서 내에서 실질적인 단어 간 관계를 더 잘 나타내도록 할 수 있다.

 

 


참고

https://velog.io/@rsj9987/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EC%9E%90%EC%97%B0%EC%96%B4-%EB%93%B1%EC%9E%A5%ED%9A%9F%EC%88%98-%EA%B8%B0%EB%B0%98%EC%9D%98-%EB%8B%A8%EC%96%B4%ED%91%9C%ED%98%84

 

[딥러닝] 자연어-등장횟수 기반의 단어표현

등장횟수 기반의 단어표현 CounterVectorizer, TF-IDF

velog.io

https://blog.naver.com/shino1025/221868521724

 

[NLP 입문] 문서의 행렬 표현 (BoW, DTM, TF-IDF)

기계학습을 위해서는 텍스트 데이터를 숫자로 이루어진 행렬 단위로 변환해야 한다. 이번 포스팅에서는 문...

blog.naver.com

 

728x90