[회고] 신입 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  
반응형