[텍스트 마이닝-분석] TF-IDF: sklearn Tfidfvectorizer 사용
텍스트 마이닝을 할 때 분석 데이터가 크면 클수록 얻을 수 있는 정보의 양도 많아지지만,
데이터가 너무 많을 수록 쓸모 있는 정보를 찾아내기도 어려워집니다.
일상적으로 쓰이는 단어(나, 그, 저, 때, 등)같이 빈도는 많지만 그 중요도는 떨어지는 단어를 가려내는 데 유용하게 쓸 수 있는 게 바로 TF-IDF입니다.
TF-IDF의 자세한 정의는 아래 문서에서 찾아보실 수 있습니다.
https://wikidocs.net/31698
04-04 TF-IDF(Term Frequency-Inverse Document Frequency)
이번에는 DTM 내에 있는 각 단어에 대한 중요도를 계산할 수 있는 TF-IDF 가중치에 대해서 알아보겠습니다. TF-IDF를 사용하면, 기존의 DTM을 사용하는 것보다 보다 많…
wikidocs.net
직접 TF-IDF를 구하는 식을 만들어서 구할 수도 있지만
이미 우리를 앞서나간 개발자들이 손쉽게 TF-IDF를 구하도록 만들어둔 걸 활용하면 더 빠르고 편하게 얻을 수 있습니다.
분석에 필요한 모듈과 패키지를 임포트해줍니다.
import pandas as pd # pandas 패키지 임포트
import numpy as np # numpy 패키지 임포트
from tqdm.notebook import tqdm # for 반복문 진행상황 표시
from collections import Counter
# scikit-learn에서 제공하는 TF-IDF 생성 패키지 임포트
from sklearn.feature_extraction.text import TfidfVectorizer
불용어 파일과 분석할 파일을 불러옵니다.
# 불용어 파일
stopwords_df = pd.read_csv("파일저장경로", encoding='UTF-8')
stopwords = stopwords_df['불용어'].to_list()
# 분석할 파일
df = pd.read_csv("파일저장경로", encoding='UTF-8)
corpus = df['형태소'].to_list()
scikit-learn의 TfidfVectorizer를 이용해서 불용어를 설정하고 DTM을 만들어줍니다.
# stop_words에는 위에서 조사만 추출해서 만든 불용어 리스트 사용
# 이때, 한 글자짜리 단어도 TF-IDF 값에 포함하기 위해서는 token_pattern을 아래와 같이 지정해야 합니다.
# 지정하지 않을 경우 두 글자 단어부터 포함되므로 주의하세요.
tfidf = TfidfVectorizer(stop_words = stopwords, token_pattern=r'\w{1,}')
dtm = tfidf.fit_transform(corpus)
TF-IDF를 만들고 이를 데이터 프레임에 담습니다.
# 만든 TF-IDF를 데이터 프레임에 담기 위해 우선 numpy.array()로 변환함
tfidf_array = dtm.toarray()
# 변환한 array를 다시 pd.Dataframe으로 바꿈
tfidf_DF = pd.DataFrame(tfidf_array)
# 이 데이터프레임의 컬럼명은 숫자로 되어 있음. 이를 feature_names로 바꿔줘야 함.
featurenames = tfidf_v.get_feature_names_out()
tfidf_DF.columns = featurenames
tfidf_DF
칼럼명 지정까지 잘 되었다면 우선 파일로 저장해줍니다.
tfidf_DF.to_csv("이름 TF-IDF 행렬.txt", index=False, encoding='UTF-8')
tfidf_DF.to_excel("이름 TF-IDF 행렬.xlsx")
각 단어의 전체 문서에 걸친 TF-IDF 값을 구하고 싶다면 아래와 같이 하나로 합쳐줍니다.
# 각 단어에 대한 TF-IDF의 합
word_count = pd.DataFrame({
'단어': tfidf.get_feature_names_out(),
'tf-idf': tdm.sum(axis=0).flat
})
합계가 잘 계산됐는지 상위 값을 뽑아서 확인해봅니다.
# 상위 n 개의 샘플만 미리 확인해보고 싶은 경우 n 에 원하는 숫자 넣고 실행
word_count.sort_values('tf-idf', ascending=False).head(n)
원하는 파일 형태로 저장하면 끝! 입니다.
# 단어 - TF-IDF 파일로 저장.
word_count.to_csv("파일저장경로_tfidf 합.txt", index=False, encoding='UTF-8')
word_count.to_excel("파일저장경로_tfidf 합.xlsx", index=False)
다른 기술 블로그들이 그렇듯,
코드를 블로그에 공유하는 것은 기록과 '공유'를 위해서입니다.
만약 제 글의 도움을 받아 본인의 글을 작성하신다면 출처를 남겨주시길 바랍니다.
문의는 댓글로 남겨주시면 확인 후 답변드리겠습니다.