Search
Duplicate

2-4 문장과 문서 분류 : TF-IDF

문장이나 문서와 같은 긴 텍스트 뭉치를 분류하는 것이 자연어 처리의 가장 기본적인 작업 중 하나입니다. 문서를 분류하는 데에는 굉장히 다양한 방법들이 있는데 TF-IDF 표현이 그 중 하나입니다.

TF-IDF (Term Frequency - Inverse Document Frequency)

TF(Term Frequency)는 어떤 한 단어가 문서 내에 얼마나 자주 등장하는지를 나타내는 값입니다. DF(Document Frequency)는 그 단어가 얼마나 많은 문서에 나타나는지를 나타내는 값이며, 이 값의 역수를 IDF(Inverse Document Frequency)라고 합니다. 즉, TF-IDF(Term Frequency - Inverse Document Frequency)라는 것은 TF와 IDF를 곱한 값으로, 특정한 단어가 얼마나 다른 문서에는 자주 등장하지 않으면서 동시에 해당 문서에 자주 등장하는지를 알려줍니다.
특정한 단어의 TF 값이 높을수록 중요한 단어라고 생각할 수 있는데, my, and, this 와 같이 다른 문서에도 굉장히 많이 등장하는 단어들은 해당 문서에서 TF값이 높다고 하더라도 중요한 단어라고 보기가 힘듭니다. 그래서 IDF 값을 TF에 곱해주어 흔한 단어들에는 가중치를 낮추고 흔하지 않아 문서의 특색을 살려주는 단어들에는 가중치를 높입니다.
TF-IDF의 공식은 아래와 같이 정의됩니다.
wx,y=tfx,y×log(Ndfx)w_{x,y} = tf_{x,y} \times log({N \over df_x})
wx,yw_{x,y} : 문서 y 속 단어 x의 TF-IDF
tfx,ytf_{x,y} : 문서 y 속 단어 x의 TF
dfxdf_x : 단어 x를 포함하는 문서의 개수
NN : 총 문서의 개수
사이킷런을 사용해 TF-IDF 표현을 만들어봅시다.
#우선 단어 분류 from sklearn.feature_extraction.text import TfidfVectorizer text = ['I go to my home my home is very large', # Doc[0] 'I went out my home I go to the market', # Doc[1] 'I bought a yellow lemon I go back to home'] # Doc[2] tfidf_vectorizer = TfidfVectorizer() # TF-IDF 객체선언 tfidf_vectorizer.fit(text) # 단어를 학습시킴 tfidf_vectorizer.vocabulary_ # 단어사전을 출력 sorted(tfidf_vectorizer.vocabulary_.items()) # 단어사전 정렬
Python
복사
#출력 결과 [('back', 0), ('bought', 1), ('go', 2), ('home', 3), ('is', 4), ('large', 5), ('lemon', 6), ('market', 7), ('my', 8), ('out', 9), ('the', 10), ('to', 11), ('very', 12), ('went', 13), ('yellow', 14)]
Python
복사
코드 속 문서의 개수는 총 3개, 단어의 개수는 총 15개(I와 a는 제외함)입니다.
첫 번째 문서의 TF 벡터는 [0, 0, 1, 2, 1, 1, 0, 0, 2, 0, 0, 1, 1, 0, 0],
두 번째 문서의 TF 벡터는 [0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0],
세 번째 문서의 TF 벡터는 [1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1] 입니다.
그리고 세 문서에 동일하게 적용되는 DF 벡터는 [1, 1, 3, 3, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1] 입니다.
이 TF, DF 값들을 위 TF-IDF 공식에 대입해주면 다음과 같은 결과가 나옵니다.
#TF-IDF 코드 tfidf_vectorizer.transform(text).toarray()
Python
복사
#출력 결과 array([[0. , 0. , 0.2170186 , 0.4340372 , 0.36744443, 0.36744443, 0. , 0. , 0.55890191, 0. , 0. , 0.2170186 , 0.36744443, 0. , 0. ], [0. , 0. , 0.24902824, 0.24902824, 0. , 0. , 0. , 0.42164146, 0.3206692 , 0.42164146, 0.42164146, 0.24902824, 0. , 0.42164146, 0. ], [0.44514923, 0.44514923, 0.26291231, 0.26291231, 0. , 0. , 0.44514923, 0. , 0. , 0. , 0. , 0.26291231, 0. , 0. , 0.44514923]])
Python
복사
TF-IDF 표현을 사용하면 그 문서만의 특성을 구별할 수 있는 단어들을 가려낼 수 있기 때문에 예를 들어 의학 용어가 많이 나온다면 의학 관련 글로, 예술 용어가 많이 나온다면 예술 관련 글로 구분 지으며 문서를 용이하게 분류할 수 있도록 해줍니다.
TF-IDF 표현 이외에도 서포트 벡터 머신, 퍼지 k-평균, 계층적인 베이지안 클러스터링과 같은 지도, 비지도 학습과 레이블된 데이터셋이 적을 때 유용한 나이브 베이즈 분류기, Nearest 분류기와 같은 준지도 학습을 통해 문서를 분류하는 방법들도 있습니다. 문장이나 문서를 분류하면 상품 리뷰의 감성을 예측하거나 스팸 이메일을 필터링하거나 언어를 식별하는 등 다른 작업을 할 때나 우리의 일상생활에 도움이 됩니다.
이전 글 읽기