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
'🛠 기타 > Data & AI' 카테고리의 다른 글
자주 사용되는 numpy.random 함수들 (0) | 2020.07.22 |
---|---|
[scikit-learn 라이브러리] KNN 분류기 옵션 (0) | 2020.07.22 |
[scikit-learn 라이브러리] iris 데이터셋 사용 예제 (0) | 2020.07.20 |
[scikit-learn 라이브러리] 비만도 데이터 기반 분류 문제 (0) | 2020.07.17 |
선형회귀와 경사하강법(Gradient Descent) (0) | 2020.07.17 |