[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🛠 기타/Data & AI

TF, DF, IDF

inu 2020. 7. 21. 23:02

TF

  • 특정 단어가 문서에 등장한 횟수

DF

  • 전체 문서 중 특정 단어가 등장한 문서의 수

IDF

  • DF의 역수
  • 로그를 취해 수가 많이 커지는 것을 방지하고, 분모에 1을 더해 분모가 0이되는 것을 방지했다.
  • n은 전체 문서수

활용 예제

import pandas as pd from math import log from konlpy.tag import Okt from collections import Counter doc_list = [ ​​​​'안녕하세요 감사해요 잘있어요 다시 만나요', ​​​​'안녕하세요 오늘도 좋은 하루 보내세요', ​​​​'안녕하세요 안녕하세요 안녕하세요 오늘도 날씨가 좋네요', ] token_list = Okt().morphs(' '.join(doc_list)) token_list = list(set(token_list)) token_list def tf(term, document): ​​​​return document.count(term) def idf(term): ​​​​df = 0 ​​​​for doc in doc_list: ​​​​​​​​if (tf(term, doc)): ​​​​​​​​​​​​df += 1 ​​​​return log(len(doc_list)/(1+df)) ​​​​# doc_list 에서 term 이 등장한 문서 수를 count def tfidf(term, document): ​​​​return tf(term,document) * idf(term) ​​​​# tf * idf dtm = [] for doc in doc_list: ​​​​dtm.append([]) ​​​​for token in token_list: ​​​​​​​​dtm[-1].append(tf(token,doc)) ​​​​# document term matrix (문서별 단어 등장 횟수) 를 구현해보자, 3 (문서) x 13 (단어) 의 행렬을 리스트로 구성하면 된다 dtm_pd = pd.DataFrame(dtm, columns=token_list) print(dtm_pd) idf_list = [] for token in token_list: ​​​​idf_list.append(idf(token)) ​​​​# 단어별로 idf의 값을 구한 리스트를 만들어보자 ​​​​# 위 idf 함수를 이용하면 된다 idf_pd = pd.DataFrame(idf_list, columns=['idf'], index=token_list) print(idf_pd) tfidf_list = [] for doc in doc_list: ​​​​tfidf_list.append([]) ​​​​for token in token_list: ​​​​​​​​tfidf_list[-1].append(tfidf(token, doc)) ​​​​# tfidf 를 구현해보자, 3 (문서) x 13 (단어) 의 행렬을 리스트로 구성하면 된다 ​​​​# 내부의 요소는 모두 tfidf 값으로 구성 tfidf_pd = pd.DataFrame(tfidf_list, columns=token_list) print(tfidf_pd)
==결과== 보내세요 다시 좋네요 만나요 잘있어요 좋은 하루 감사해요 날씨 오늘 가 안녕하세요 도 0 0 1 0 1 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 1 0 0 1 0 1 1 2 0 0 1 0 0 0 0 0 1 1 1 3 1 idf 보내세요 0.405465 다시 0.405465 좋네요 0.405465 만나요 0.405465 잘있어요 0.405465 좋은 0.405465 하루 0.405465 감사해요 0.405465 날씨 0.405465 오늘 0.000000 0.405465 안녕하세요 -0.287682 0.000000 보내세요 다시 좋네요 만나요 잘있어요 좋은 하루 \ 0 0.000000 0.405465 0.000000 0.405465 0.405465 0.000000 0.000000 1 0.405465 0.000000 0.000000 0.000000 0.000000 0.405465 0.405465 2 0.000000 0.000000 0.405465 0.000000 0.000000 0.000000 0.000000 ​​​​​​​감사해요 날씨 오늘 가 안녕하세요 도 0 0.405465 0.000000 0.0 0.000000 -0.287682 0.0 1 0.000000 0.000000 0.0 0.000000 -0.287682 0.0 2 0.000000 0.405465 0.0 0.405465 -0.863046 0.0