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은 간단하다는 장점이 있지만 다음과 같은 단점이 있다.
1. 대용량 문서의 경우 리소스 낭비 심각
2. 빈도 수 접근의 위험성 --> ex. 불용어. ==> 이를 적절히 선별해주는 전처리 작업이 필요!
TF-IDF (Term Frequency-Inverse Document Frequency)
TF-IDF는 기존의 DTM에서 각 단어의 중요도라는 개념을 가중치로 부여하는 기법이다. 기존의 DTM을 사용하는 것보다 더 심도있게 접근할 수 있으며 보다 더 많은 정보를 고려하여 문서들을 비교할 수 있다.
여러 문서에서 무분별하게, 어떤 연관성 등의 이유없이 많이 등장하는 단어에 가중치를 적게 주어 큰 특징이 없지만 자주 등장하는 단어가 설명력이 높아지는 것을 방지한다. TF, IDF는 각각 단어 빈도, 역문서 빈도라는 의미이다. 그 정의를 하나씩 알아보자.
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/딥러닝-자연어-등장횟수-기반의-단어표현
2. TF-IDF는 어떨 때 유용한가?
큰 특징 없이 자주 등장하는 불용어, 혹은 글의 주제라는 이유로 어떤 맥락에든 지속적으로 등장하는 단어등의 영향을 줄이는 역할을 한다. 이를 통해 문서 내에서 실질적인 단어 간 관계를 더 잘 나타내도록 할 수 있다.
참고
https://blog.naver.com/shino1025/221868521724
'TIL저장소' 카테고리의 다른 글
[백준/파이썬] 11047번 동전 0 (0) | 2022.04.04 |
---|---|
[PyTorch] RuntimeError: CUDA out of memory. Tried to allocate 128.00 MiB 메모리 관련 문제 해결 (0) | 2022.03.28 |
[AI Interview] Weight Initialization 방법 (0) | 2022.03.24 |
[AI Interview] 차원의 저주란? (0) | 2022.03.24 |
[백준/파이썬] 1904번 01타일 (0) | 2022.03.23 |