코드 내에서 가중치 적용되는 부분
•
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
복사
⇒ 단순히 빈도로 단어의 중요도를 표현하지 않고 문서 안에서 해당 단어의 중요도 알 수 있음