특정 문서 내에서 특정 단어의 빈도인 TF(Term Frequecy) 와,
전체 문서 내에서 특정 단어의 빈도인 DF(Document Frequency)의 역수를 활용하여
어떠한 단어가 얼마나 중요한지를 나타낸 통계적 수치!
이 문서에는 자주 등장하고,
다른 문서에는 덜 등장할수록 그 수치가 크게 부여된다.
code
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
import numpy as np
corpus = [
'먹고 싶은 사과',
'먹고 싶은 바나나',
'길고 노란 바나나 바나나',
'저는 과일이 좋아요'
]
vect = CountVectorizer()
document_term_matrix = vect.fit_transform(corpus) # 문서-단어 행렬
tf = pd.DataFrame(document_term_matrix.toarray(), columns=vect.get_feature_names())
# TF (Term Frequency)
D = len(tf)
df = tf.astype(bool).sum(axis=0)
idf = np.log((D+1) / (df+1)) + 1 # IDF (Inverse Document Frequency)
# TF-IDF (Term Frequency-Inverse Document Frequency)
tfidf = tf * idf
tfidf = tfidf / np.linalg.norm(tfidf, axis=1, keepdims=True)
장점 : 일반적인 Bag of words를 통한 단순한 비교보다 더 높은 정확성을 보인다.
단점 : 단어의 빈도로 판단할 뿐 맥락적 유사도는 반영하지 못한다.
-> Word2Vec Embedding, ConceptNet(Knowledge graph)로 개선