본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

AI/NLP

빈도분석 - TF-IDF란? , Term Frequency Inverse Document Frequency 단어빈도 역문서 빈도의 조합.

빈도분석 - TF-IDF, Term Frequency Inverse Document Frequency 단어빈도 역문서 빈도의 조합. 

빈도가 높다는 것은 글을 대표한다라는 질문에서 시작됨. 

빈도가 높다고 해서 무조건 중요한 것은 아니라는 한계를 극복하고자했다. 

IT문서내에서는 컴퓨터라는 단어가 빈도가 높지만 중요도가 낮고 , 

초등학교 일기에서 '나는 오늘'이 가장 많이 나온다고 해서 일기의 핵심주제가 된다는 의미가 아니듯.

from sklearn.feature_extraction.text import TfidfVectorizer

docs = [
    "나는 오늘 밥을 먹었다",
    "나는 오늘 빵을 먹었다",
    "나는 어제 국을 먹었다"
]

vectorizer = TfidfVectorizer()

X = vectorizer.fit_transform(docs)

print(vectorizer.get_feature_names_out())
print(X.toarray())
단어: ['나는', '오늘', '어제', '먹었다', '밥', '빵', '국']

문서1: [0.5 0.5 0.0 0.4 0.6 0.0 0.0]
문서2: [0.5 0.5 0.0 0.4 0.0 0.6 0.0]
문서3: [0.5 0.0 0.6 0.4 0.0 0.0 0.6]

“나는”, “먹었다” → 여러 문서에 등장 → 중요도 낮아짐
“밥”, “빵”, “국” → 특정 문서에서만 등장 → 중요도 높아짐

 

 


1958년 IBM의 한스피터 룬에 의해 재연된 아이디어이며 현재까지도 거의 모든 검색 엔진의 핵심 기술로 널리 사용되고있음.
해석이 명확하고 직관적이며 불용어 자동감소효과와 문서 유사도 계산에 탁월하나 단어의 순서와 문맥 정보를 모두 무시해 미묘한 의미차이는 구별하기 힘들다. 품사 태깅을 결합하거나 Word2Vec, BERT 같은 문맥 임베딩 기술과 혼합해 한계를 극복할 수 있음. 

 


공통된 단어일 수록 점수가 깍이는 정도를 세밀하게 조정하는 확장 방식, 스무딩을 사용함.

import numpy as np

# 예시 문서 (문서 3개)
docs = [
    "나는 오늘 밥을 먹었다",
    "나는 오늘 빵을 먹었다",
    "나는 어제 국을 먹었다"
]

# 단어 등장 행렬 (Count)
from sklearn.feature_extraction.text import CountVectorizer

cv = CountVectorizer()
X = cv.fit_transform(docs).toarray()

# N: 전체 문서 수
N = len(docs)

# df: 각 단어가 등장한 문서 수
df = np.count_nonzero(X, axis=0)

print("df:", df)
idf_smooth = np.log((N + 1) / (df + 1)) + 1

print("idf:", idf_smooth)