티스토리 뷰
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을 더해 사용하는 값입니다.
단순 역수를 취하지 않고 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 |
- nlp #토큰화 #nltk #konply
- #opencv #이미지 연산 #합성
- # 할인행사 #counter #딕셔너리 #프로그래머스
- 로지스틱 회귀 #오즈비 #최대우도추정법 #머신러닝
- #물고기 종류별 대어 찾기 #즐겨찾기가 가장 많은 식당 정보 출력하기 #mysql #programmers
- #프로그래머스 #안전지대 #시뮬레이션
- html #javascript #구구단 출력
- 파이썬 #코딩테스트 #프로그래머스 #스택 #큐
- 머신러닝 #xgboost #
- #tf idf
- #opencv #이미지 읽기 #이미지 제작 #관심영역 지정 #스레시홀딩
- 프로젝트 #머신러닝 #regression #eda #preprocessing #modeling
- python #deque #프로그래머스 #공 던지기 #문자열 계산하기 #코딩테스트
- seaborn #데이터시각화 #타이타닉
- randomforest #bagging #머신러닝 #하이퍼파라미터 튜닝
- 잘라서 배열로 저장하기 #2차원으로 만들기
- #자연어 처리 #정수 인코딩 #빈도 수 기반
- subquery #sql 코딩테스트
- #python #프로그래머스 #외계어사전 #itertools #순열과조합
- # 프로그래머스 # 카펫 # 완전탐색
- 머신러닝 #project #classification #dacon
- 파이썬 #시각화 #matplotlib
- python #프로그래머스 #겹치는선분의길이
- 머신러닝 #lightgbm #goss #ebf
- 자연어 처리 #정제 #정규표현식 #어간 추출 #표제어 추출
- python #프로그래머스 #리스트 #인덱싱
- #attention #deeplearning
- pca #주성분분석 #특이값분해 #고유값분해 #공분산행렬 #차원의 저주
- # 프로그래머스 #연속된 부분수열의 합 #이중 포인터 #누적합
- #seq2seq #encoder #decoder #teacher forcing