TF-IDF 조사 내용

코드 내에서 가중치 적용되는 부분
TF-IDF 가중치를 적용하여 입력된 제품명에 해당하는 제품의 첨가제 정보를 추출
TF-IDF 벡터화를 수행하기 위해 TfidfVectorizer 객체 생성 → 객체 사용하여 모든 제품의 '첨가제' 정보를 TF-IDF 벡터화
tfidf_vectorizer = TfidfVectorizer(max_features=1000, stop_words='english') additives_tfidf = tfidf_vectorizer.fit_transform(df['첨가제'])
Python
복사

TF-IDF(Term Frequency - Inverse Document Frequency)

정보 검색과 텍스트 마이닝에서 이용하는 가중치
여러 문서로 이뤄진 문서군이 있을 때 어떤 단어가 특정 문서 내에서 얼마나 중요한 것인지를 나타내는 통계적 수치
문서의 핵심어 추출, 검색 엔진에서 검색 결과의 순위 결정, 문서 사이 비슷한 정도 구하는 등 용도로 사용
특정 문서 내에서 단어 빈도 ↑, 전체 문서들 중 그 단어 포함한 문서 ↓ → TF-IDF 값 ↑ ⇒ 모든 문서에 흔하게 나타나는 단어를 걸러내는 효과 얻을 수 있음
IDF의 로그 함수 안의 값은 항상 1 이상 → IDF값과 TF-IDF값은 항상 0 이상
특정 단어를 포함하는 문서 ↑ → 로그 함수 안의 값이 1에 가까워짐 ⇒ IDF값과 TF-IDF 값은 0에 가까워짐
빈도만 고려할 경우 빈도수 ↑ 단어일수록 중요한 단어라고 생각
But,
불용어일 수 있음
전체 문서에는 자주 등장 X 특정 문서에서 유난히 자주 등장하는 단어가 중요 단어일 수도 있음
각 문서 특성 구분할 수 있는 단어 → 높은 가중치/ 그렇지 않은 단어 → 낮음 가중치 ⇒ TF-IDF 유용하게 사용

TF, DF, IDF, TF-IDF 구분해 정리한 표

구분
의미
내용
TF
단어 빈도 Term Frequency
- 특정한 단어가 문서 안에서 얼마나 자주 등장하는지를 나타내는 값 - TF 값 ↑ → 문서에서 중요하다고 생각
DF
문서 빈도 Document Frequency
- 특정 단어가 등장한 문서의 수 - 단어 자체가 문서군 안에서 자주 사용되고, 흔하게 등장한다는 의미
IDF
역문서 빈도 Inverse Document Frequency
- DF의 역수, DF에 반비례하는 수
TF-IDF
TF*IDF
- 대부분의 문서에 자주 등장하는 단어 → ↓ 중요도로 계산 - 특정 문서에만 자주 등장하는 단어 → ↑ 중요도로 계산

TF-IDF 가중치 적용하는 방법

사이킷런의 TfidfVectorizer 통해 TF-IDF 변환할 수 있음
CounterVector() + TfidfTransformer()
사용할 수 있는 주요 매개 변수
norm=’l2’ 각 문서의 피처 벡터 정규화 방법
L2: 벡터의 각 원소의 제곱 합이 1이 되도록 만드는 것이 기본값
L1: 벡터의 각 원소의 절댓값의 합이 1이 되도록 크기 조절
smooth_idf=False
True → 피처를 만들 때 0으로 나오는 항목 → 작은 값 더해서 피처 만듦 False → 더하지 않음
sublinear_tf=False
True → 로그 스케일링 False → 단어 빈도 그대로 사용
이상치 → 데이터 심하게 왜곡 ⇒ sublinear_tf=True → 완화되는 효과
use_idf=True
TF-IDF 사용해 피처 만들 것인지 아니면 단어 빈도 자체를 사용할 것인지 결정

코드

# sklearn.feature_extraction.text에서 # TfidfVectorizer를 불러옴 from sklearn.feature_extraction.text import TfidfVectorizer tfidfvect = TfidfVectorizer()
Python
복사
# ver1 # fit(), transform()으로 변환 tfidfvect.fit(corpus) dtm = tfidfvect.transform(corpus) dtm
Python
복사
# ver2 # fit_transform()으로 변환 dtm = tfidfvect.fit_transform(corpus) dtm
Python
복사
# 문서에 토큰이 더 많이 나타남 -> 가중치 ↑ # But, 토큰이 문서에 많이 표시 -> 가중치 ↓ # 희소 행렬 출력 -> dtm.toarray()로 배열 확인 dtm.toarray()
Python
복사
# 판다스의 데이터 프레임 형태로 변환 → 단어 사전 + 행렬 확인 # display_transform_dtm으로 변환 결과를 확인 vocab = tfidfvect.get_feature_names_out() df_dtm = pd.DataFrame(dtm.toarray(), columns=vocab) print("단어 수 : ", len(vocab)) print(vocab) # 판다스의 style.background_gradient() -> 해당 단어마다 TF-IDF 값 비교 # -> 단어 빈도만이 아닌 가중치가 적용됐음을 비교 가능 display(df_dtm.style.background_gradient())
Python
복사
⇒ 단순히 빈도로 단어의 중요도를 표현하지 않고 문서 안에서 해당 단어의 중요도 알 수 있음