Processing math: 100%

이론

[NLP] TF-IDF, Term Freq.-Inverse Document Freq. 개념 정리

weweGH 2025. 5. 6. 09:00
반응형

 

TF-IDF 개념 정리
TF-IDF 개념 정리


TF-IDF, Term Frequency-Inverse Document Frequency 개념 정리


들어가며


TF-IDF(Term Frequency- Inverse Document Frequency)는 문서 집합에서 단어의 중요도를 평가하는 데 사용하는 통계적 수치입니다. 예를 들어, TF-IDF를 활용하여 자주 등장하는 일반적인 단어보다는 특정 문서에만 등장하는 '알고리즘', '신경망' 같은 단어를 더 중요한 키워드로 판단할 수 있습니다. 단순히 등장 횟수만으로 중요성을 판단할 경우, 너무 자주 등장하는 단어(the, and, is)가 불필요하게 높게 평가되므로 전체 문서의 희귀성을 함께 고려하여 중요한 단어를 가려냅니다.



TF-IDF 수식


TF | Term Frequency

단어 t가 문서 d에서 얼마나 자주 등장하는지를 나타냅니다.

TF(t,d)=tdd

IDF | Inverse Document Frequency

단어 t가 전체 문서 집합에서 얼마나 드문지를 나타냅니다. 여기서, N은 전체 문서 수, df(t)는 단어 t가 등장한 문서의 수입니다. 분모에서 1을 더하는 이유는 분모가 0이 되는 것을 방지하기 위함입니다.

IDF(t)=log(N1+df(t))

TF-IDF

TF-IDF는 TF와 IDF를 곱한 값입니다.

TFIDF(t,d)=TF(t,d)×IDF(t)


TF-IDF 예제


다음과 같이 3개의 예제 문장을 각각 하나의 문서로 간주하여 TF-IDF를 계산해보겠습니다.

문서 1: 파이썬은 데이터 분석에 자주 사용됩니다.  
문서 2: 자바는 안드로이드 앱 개발에 많이 활용됩니다.
문서 3: 파이썬과 자바는 모두 프로그래밍 언어입니다.

3개의 예제 문장을 불용어 제거 없이 띄어쓰기 기준으로 나누면 다음과 같습니다.

예제 문장
예제 문장


위의 문서들 중 문서 2의 '자바는'문서 2의 '안드로이드'에 대해 TF-IDF를 비교하겠습니다.

'자바는' 의 TF-IDF

'자바는'이라는 단어는 문서 2의 6개 단어 중 1개이므로 TF는 다음과 같습니다.

TF(,2)=160.167

'자바는'이라는 단어는 문서 2와 문서 3에서 총 2번 등장하므로 IDF는 다음과 같습니다.

IDF()=log(31+2)=log(1)=0

따라서,

TFIDF(,2)=TF×IDF=0.167×0=0


'안드로이드' 의 TF-IDF

'안드로이드'이라는 단어는 문서 2의 6개 단어 중 1개이므로 TF는 다음과 같습니다.

TF(,2)=160.167

'안드로이드 '이라는 단어는 문서 2에서 1번 등장하므로 IDF는 다음과 같습니다.

IDF()=log(31+1)log(1.5)0.405

따라서,

TFIDF(,2)=TF×IDF=0.167×0.405=0.068


2개의 단어에 대한 TF-IDF 점수를 비교했을 때, '자바는'의 경우 0, '안드로이드'는 0.068입니다. '자바는'과 같은 단어는 여러 문서에 공통으로 등장하여 중요도가 낮게 평가됩니다. 반면, '안드로이드'와 같은 단어는 특정 문서에만 등장하기 때문에 TF-IDF 점수가 높아지고, 해당 문서를 잘 대표하는 핵심 키워드로 판단할 수 있습니다.

반응형

파이썬을 활용한 TF-IDF


파이썬을 활용하여 TF-IDF를 계산할 때는 sklearn의 TfidVectorizer를 사용합니다.

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd

# 예제 문서 3개
docs = [
    "파이썬은 데이터 분석에 자주 사용됩니다.",
    "자바는 안드로이드 앱 개발에 많이 활용됩니다.",
    "파이썬과 자바는 모두 프로그래밍 언어입니다."
]

# TF-IDF 벡터화
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(docs)

# 결과
feature_names = vectorizer.get_feature_names_out()
tfidf_df = pd.DataFrame(tfidf_matrix.toarray(), columns=feature_names, index=["문서1", "문서2", "문서3"])
print("TF-IDF 벡터화 결과:")
print(tfidf_df)

TF-IDF 파이썬 결과
TF-IDF 파이썬 결과


수기로 계산한 값과 차이가 나는 이유는 IDF 수식의 차이 때문입니다. 하지만, 앞서 살펴본 것처럼 '안드로이드'는 상대적으로 더 높은 TF-IDF 값을 가지는 것을 확인할 수 있습니다.

print('자바는 TF-IDF: ', tfidf_df["자바는"]["문서2"])
print('안드로이드 TF-IDF: ', tfidf_df["안드로이드"]["문서2"])

자바, 안드로이드
자바, 안드로이드


반응형