TF-IDF를 알기 이전에 DTM부터 알아보겠습니다.
DTM(Document-Term Matrix, 문서 단어 행렬)
다수의 문서에서 등장하는 각 단어들의 빈도를 행렬로 표현한 것을 의미합니다.
문서1: "나는 고양이를 좋아합니다."
문서2: "나는 개를 싫어합니다."
단어 | 나는 | 고양이를 | 좋아합니다 | 개를 | 싫어합니다 |
문서1 | 1 | 1 | 1 | 0 | 0 |
문서2 | 1 | 0 | 0 | 1 | 1 |
TF-IDF(Term Frequency-Inverse Document Frequency)
단어의 빈도(TF)와 역 문서 빈도(IDF)를 사용하여 DTM 내의 각 단어들마다 중요한 정도를 가중치로 주는 방법 - 위키독스
*모든 문서에서 등장하는 단어는 중요도가 낮고, 특정 문서에서만 등장하는 단어는 중요도가 높습니다.
tf(d, t): 특정 문서 d에서 특정단어 t의 등장 횟수
TF(term Frequency) 어떤 단어가 특정 문서에서 많이 사용되었는지를 의미합니다. 즉, 많이 사용된 단어가 중요하다고 생각하는 지표입니다.
TF는 DTM(Document Term Matrix)라고도 부릅니다.
예시 문서1, 2에서의 tf는 다음과 같습니다(DTM과 동일)
단어 | 나는 | 고양이를 | 좋아합니다 | 개를 | 싫어합니다 |
문서1 | 1 | 1 | 1 | 0 | 0 |
문서2 | 1 | 0 | 0 | 1 | 1 |
df(t): 특정 단어 t가 등장한 문서의 수
DF(Document Frequency)로 특정 단어가 등장한 문서의 수를 의미합니다. 위의 예시에서 "나는"은 문서1과 문서2에서 각각 한 번씩 등장했으므로 DF는 2가 됩니다. 나머지 단어들의 DF는 1이 되겠네요.
단어 | 나는 | 고양이를 | 좋아합니다 | 개를 | 싫어합니다 |
df | 2 | 1 | 1 | 1 | 1 |
idf(t): df(t)에 반비례하는 수
전체 문서수를 해당 단어의 DF로 나눈 뒤 로그를 취한 값입니다. 그런데 로그를 취하기전에 분모에 +1을 해주는데 특정 단어가 전체 문서에서 등장하지 않을 경우 즉, df(t)가 0인 경우 분모가 0이 되는 것을 방지하기 위함입니다.
또한 대부분의 라이브러리에서 지원하는 idf계산에서는 로그를 자연로그(ln)을 사용합니다. 밑을 자연 상수 e(=2.718..)로 해주는데 계산시 더욱 깔끔한 값이 나오기 때문이라 합니다.
idf(t) = ln(n / 1 + df(t))
# ln(1) = 0 이 되는 것을 막기 위해 +1을 해주는 경우도 있음
idf(t) = ln(n / 1 + df(t)) + 1
n = 2 (주어진 문서의 수)
나는 => ln( 2 / 2+1 ) + 1 = 0.594
고양이를 => ln( 2 / 1 + 1 ) + 1 = 1
좋아합니다 => ln( 2 / 1 + 1 ) + 1 = 1
개를 => ln( 2 / 1 + 1 ) + 1 = 1
싫어합니다 => ln( 2 / 1 + 1 ) + 1 = 1
단어 | 나는 | 고양이를 | 좋아합니다 | 개를 | 싫어합니다 |
IDF | 0.594 | 1 | 1 | 1 | 1 |
TF-IDF
tf-idf = tf(t) * idf(t)
TF-IDF 행렬
단어 | 나는 | 고양이를 | 좋아합니다 | 개를 | 싫어합니다 |
문서1 | 0.594 | 1 | 1 | 0 | 0 |
문서2 | 0.594 | 0 | 0 | 1 | 1 |
이렇게 가중치를 준 값으로 단어간의 유사도를 구하는데 이용할 수 있습니다.
예를 들어 sklearn의 Tfidfvectorizer() 등을 이용해 tfidf 매트릭스를 생성하고 생성된 희소행렬을 이용해 문장간 비교에 활용할 수 있습니다.
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vectorizer = TfidfVectorizer()
'[머신러닝]' 카테고리의 다른 글
[머신러닝] 회귀(Regression) 모델과 성능지표 (1) | 2024.10.27 |
---|---|
[머신러닝] 혼동행렬(Confusion Matrix)과 성능지표 (0) | 2024.10.15 |
[머신러닝] 문장 유사도 분석을 위한 Levenshtein Distance(편집거리 알고리즘) 행렬 구하기 (0) | 2024.04.18 |
[통계] 중앙값, 중간범위, 평균, 최빈값, 범위, 표준편차, 정규분포, 편향, 분산 (0) | 2023.07.15 |