사이킷런에서는 CountVectorizer 대신 TfidfVectorizer를 사용하면 가중치가 적용된 문서단어행렬을 얻을 수 있음
TF-IDF (실습)
원문 바로 TF-IDF 적용
from sklearn.feature_extraction.text import TfidfVectorizer
tv = TfidfVectorizer(tokenizer=extract_nouns, min_df=10)
doc_vectors = tv.fit_transform(df.abstract) # TF-IDF 가중치 계산
doc_vectors[0].toarray() # 첫 번째 문서의 단어 벡터
문서 단어 행렬에 TF-IDF 적용
from sklearn.feature_extraction.text import TfidfTransformer
tt = TfidfTransformer()
doc_vectors = tt.fit_transform(dtm) # dtm을 이용해 TF-IDF 가중치 계산
doc_vectors[0].toarray() # 첫 번째 문서의 단어 벡터
유사한 단어 보기
word_vectors = doc_vectors.T # 단어 벡터로 변환# 거리 계산
dist = pairwise_distances(word_vectors[j], word_vectors, metric='l2').flatten()
rank = np.argsort(dist) # 거리 가까운 순으로 단어 번호를 정렬
[words[i] for i in rank[:10]] # 가장 가까운 단어 10개
TF-IDF의 확장
Okapi BM25 ← 주로 검색에서 TF-IDF 대신 많이 쓰이는 방법
TF-ICF
ATC
LTU
MI
PosMI
Lin98
Gref94
Okapi BM25
f(qi,D): 문서 D에서 단어 qi의 빈도
∣D∣: 문서 길이 (avgdl: 평균 길이)
k1: 단어 빈도의 포화(saturation)를 결정하는 하이퍼파라미터(보통 1.2 ~ 2.0)