관리 메뉴

Bull

[NLP] TF-IDF(Term Frequency-Inverse Document Frequency) | study book 본문

Artificial Intelligence/NLP

[NLP] TF-IDF(Term Frequency-Inverse Document Frequency) | study book

Bull_ 2024. 9. 22. 00:04

Bow(Bag-ofWords)에 가중치를 부여하는 방식이다.

  I like this movie don't famous is
This movie is famous moive 0 0 1 2 0 1 1
I like this movie 1 1 1 1 0 0 0
I don't like this moive 1 1 1 1 1 0 0

단어 빈도 (Term Frequency)


  • 문서 내에서 특정 단어의 빈도 수를 나타냄.
    $$ TF(t,d) = count(t,d) $$
    위의 표에서 3개의 문서 중 4개의 movie가 나오면 $TF=4$ 가 된다.
    즉, t = 4(term 수), d = 3 (document 수)

문서 빈도 (Document Frequency)


  • 한 단어가 얼마나 많은 문서에 나타나는지 의미.
    $$ DF(t,D) = count(t∈d:d∈D) $$
    반대로 생각하면 된다. 3개의 문서에서 4개의 movie 단어가 등장하므로 $DF=3$ 이다.
    즉, t = 4(term 수), d = 3 (document 수)이다.

해석하면 t가 들어간 총 문서 수를 의미한다.

역문서 빈도 (Inverse Document Frequency)


  • 전체 문서 수를 문서 빈도로 나눈 다음 로그를 취한 값이다. 문서 내에서 단어의 중요도를 나타낸다고 할 수 있다.
    $$ IDF(t,D) = log(\frac{count(D)}{1+DF(t,D)}) $$
  • 문서 빈도가 높을수록 단어가 일반적, 상태적으로 중요하지 않다는 의미.
  • 단어 빈도 수 ↓ --> IDF ↑
  • +1은 0이 되는 것을 방지.
  • log를 사용하는 이유는 큰값을 방지하기 위해.

TF-IDF의 수식


$$ TF-IDF(t,d,D) = TF(t,d)\times IDF(t,d) $$

  • (단어 빈도)x(역문서 빈도)로 나타낼 수 있다.
  • 문서 내 단어가 자주 등장하지만 전체 문서 내에서 해당 단어가 적게 등장한다면 TF-IDF 값은 커진다.

TF-IDF CODE


TF-IDF 형태로 쉽게 변환해주는 작업이다.

설치

pip install scikit-learn

코드

from sklearn.feature_extraction.text import TfidfVectorizer

corpus = [
    "That movie is famous movie",
    "I like that actor",
    "I don’t like that actor"
]

tfidf_vectorizer = TfidfVectorizer()
tfidf_vectorizer.fit(corpus)
tfidf_matrix = tfidf_vectorizer.transform(corpus)
# tfidf_matrix = tfidf_vectorizer.fit_transform(corpus)

print(tfidf_matrix.toarray())
print(tfidf_vectorizer.vocabulary_)

결과

[[0. 0. 0.39687454 0.39687454 0. 0.79374908 0.2344005 ]
[0.61980538 0. 0. 0. 0.61980538 0. 0.48133417]
[0.4804584 0.63174505 0. 0. 0.4804584 0. 0.37311881]]
{'that': 6, 'movie': 5, 'is': 3, 'famous': 2, 'like': 4, 'actor': 0, 'don': 1}
  • fit_transform() 은 fit과 transform 메소드를 동시에 수행한다.
  • tfidf_matrix.toarray() 의 결과에서 각 행과 열은 (문서수) x (단어 수)의 형태이다.
    결과는 3x7 형태이다. 총 단어 수는 7개이고 문서는 3개이기 때문이다.

TfidfVectorizer class

tfidf_vectorizer = TfidfVectorizer(
  input='content',
  encoding='utf-8',
  lowercase=True, 
  stop_words=None, 
  ngram_range=(1, 1),
  max_df=1.0,
  min_df=1,
  vocabulary=None,
  smooth_idf=True,
)
  • input : 문자열 데이터.
  • ngram_range : N-gram 범위. (1,2)는 유니그램과 바이그램을 사용한다는 의미.
  • max_df : 일정 횟수 이상 DF는 불용어로 처리한다.
  • min_df : 일정 횟수 미만 DF는 불용어로 처리한다.
  • vocabulary : 미리 구축해놓은 단어 사전을 사용한다.
  • smooth_idf : IDF 계산 시 분모에 1 더하는 작업, 0이 될 일이 없으면 False로 해놓는 경우가 있나보다 생각하고 넘어가자.

 

참고자료

https://product.kyobobook.co.kr/detail/S000209621433

 

파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습 | 윤대희 - 교보문고

파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습 | 트랜스포머는 딥러닝 분야에서 성능이 우수한 모델로 현대 인공지능 분야의 핵심 기술입니다. 트랜스포머와 비전 트랜스

product.kyobobook.co.kr