티스토리 뷰

2025.03.28 - [자연어처리] - [3] 정수 인코딩

 

[3] 정수 인코딩

2025.03.24 - [자연어처리] - [2] 정제와 추출 [2] 정제와 추출2025.03.21 - [자연어처리] - [1] 토큰화(Tokenizer) [1] 토큰화(Tokenizer)NLP(Natural Language Processing)은 인간의 언어를 이해하고 해석하기 위한 목적으

up-one-coding.tistory.com

TF - IDF은 문서에서 각 단어가 가지는 가중치를 구해 특징을 추출하는 방법입니다. TF - IDF은 단어의 단순 빈도수를 기준으로 가중치를 구하는 것이 아닌, 특정 단어가 전체 문서에서 얼마나 중요한지를 나타내는 가중치를 구하여 특징을 추출하는 방법입니다. 단순 빈도수를 기준으로 가중치를 구하면 의미가 중요하지 않은 단어에 높은 가중치를 부여할 수 있는 단점이 있습니다. 이러한 단점을 TF - IDF은 특정 문서에 자주 나타나는 단어에는 가중치를 높게 부여하는 대신, 모든 문서에서 자주 나타나는 단어에는 낮게 가중치를 부여하는 방식으로 특징을 추출합니다.

 

1. TF

TF은 특정 문서에서 특정 단어의 빈도 수를 의미합니다. TF 값이 클수록 특정 문서에서 자주 나타났다는 의미입니다.

#Tf 구하기(특정 문서에서 단어의 빈도수)
#t은 특정 단어, d은 특정 문서
def TF(t,d):
  return d.count(t)

2. IDF

DF은 특정 단어가 나타나는 전체 문서의 수를 의미합니다. IDF은 쉽게 이해할 수 있듯이 DF 값을 역수를 취해 표현하는 값입니다. 단순 역수만 취하는 값이 아닌 log을 더해 사용하는 값입니다.

IDF 공식(n은 전체 문서 수)

 

단순 역수를 취하지 않고 log을 더해 사용하는 이유는 n(전체 문서 수)가 기하 급수적으로기하급수적으로 증가하여 IDF도 같이 기하급수적으로 증가하는 것을 방지하기 위해서입니다. IDF 값이 클수록 특정 문서에서 자주 나타나는 단어이고, 중요도가 높다고 해석할 수 있습니다. 반대로 IDF 값이 작을수록 전체 문서에서 자주 나타나는 단어이고, 중요도가 낮다고 해석할 수 있습니다.

#IDF 구하기(DF은 특정 단어가 나타나는 전체 문서의 수)
def IDF(t):
  df = 0
  for doc in docs:
    df += t in doc
  return log(N / (1+df))

 

3. TF IDF

TF IDF 값은 위에서 구한 DF값과 IDF값을 곱해서 나온 값입니다. TF IDF 값을 통해 의미 없이 자주 등장하는 단어에는 낮은 가중치를 부여됨을 확인할 수 있습니다.

def TFIDF(t,d):
  return TF(t,d)*IDF(t)

 

#결과 확인
#카운트 기반 행렬 생성
result = []
for i in range(N):
  result.append([])
  d = docs[i]       #특정 문서
  for j in range(len(vocab)):
    t = vocab[j]    #단어
    result[-1].append(TF(t,d))    #특정 문서에서 단어의 빈도 수를 result에 넣기
tf_ = pd.DataFrame(result, columns = vocab)

#각 단어에 대한 idf
result_idf = []
for idx in range(len(vocab)):
  t = vocab[idx]
  result_idf.append(IDF(t))

idf_ = pd.DataFrame(result_idf, index=vocab, columns=['IDF'])

tf_idf_list = []
for i in range(N):
  tf_idf_list.append([])
  d = docs[i]
  for j in range(len(vocab)):
    t = vocab[j]
    tf_idf_list[-1].append(TFIDF(t,d))

df = pd.DataFrame(tf_idf_list, columns=vocab)
df.head()

 

4. sklearn의 TfidfVectorizer

sklearn의 TfidfVectorizer 라이브러리를 통해 다양한 파라미터를 조정할 수 있습니다.

  • max_df : 상위 -%의 빈도 수를 가진 단어를 제거
  • min_df : 특정 빈도 수 이하로 가진 단어를 제거
  • stop_words : 불용어 설정
  • max_features : 가장 많이 등장하는 -개의 단어 선택
  • ngram_range : 단어 단위 및 연속된 개수 추출
from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer(max_df=0.95, min_df=2, max_features=2000, stop_words=None, ngram_range=(1,2),lowercase=True)
matrix = vectorizer.fit_transform(docs)
word_list = [i[0] for i in sorted(vectorizer.vocabulary_.items())]
df = pd.DataFrame(matrix.toarray(), columns=word_list)

 

5. 직접 구현한 코드의 결과와 라이브러리의 결과 차이

example : ['먹고 싶은 사과', '먹고 싶은 바나나', '길고 노란 바나나 바나나', '저는 과일이 좋아요']

  과일이 길고 노란 먹고 바나나 사과 싶은 저는 좋아요
0 0 0 0 0.287 0 0.693 0.287 0 0
1 0 0 0 0.287 0.287 0 0.287 0 0
2 0 0.693 0.693 0 0.57 0 0 0 0
3 0.693 0 0 0 0 0 0 0.693 0.693

<직접 구현한 코드의 결과(소수점 셋째짜리까지 표현>

  과일이 길고 노란 먹고 바나나 사과 싶은 저는 좋아요
0 0 0 0 0.526 0 0.667 0.52 0 0
1 0 0 0 0.577 0.577 0 0.577 0 0
2 0 0.472 0.472 0 0.744 0 0 0 0
3 0.577 0 0 0 0 0 0 0.577 0.577

<라이브러리 코드의 결과(소수점 셋째짜리까지 표현>

'자연어처리' 카테고리의 다른 글

[3] 정수 인코딩  (0) 2025.03.28
[2] 정제와 추출  (0) 2025.03.24
[1] 토큰화(Tokenizer)  (0) 2025.03.21
TAG more
글 보관함
최근에 올라온 글