본문 바로가기

Data Analysis

기계학습 - Spark(1) - 시작하면서 바로 TF-IDF 공부

R등을 이용해서 데이터분석등을 공부했지만 여전히 어렵다. 안개속에서 헤매는건 여전하다. 그래도 다시 또 기계학습에 대해 체계적으로 공부해보려 한다. 우선 아파치 Spark를 사용하려 한다. 게다가 Spark사이트에는 좋은 교재가 있다. [Link]


Spark의 설치등은 생략한다. 프로그래밍 언어는 스칼라로 정했다. 스칼라 공부도 겸사겸사.


교재의 첫 단원은 Pipelines는 건너뛰고.


두번째 단원 "Extracting, transforming and selecting features"


"추출, 변환 그리고 특징 선택"으로 해석해 본다.


추출에는, 데이터를 수집하는 의미, 그리고 어느정도는 거르고(필터링), 정형화하는 기능이 포함될 듯 하다. 그 이유는 저장을 해야하기 때문으로 생각한다. (방대한 데이터를 모두 저장하기가... 게다가 저장을 하려면 구조가 필요하니까...)


변환은... 나에게는 무지 어려운 개념이다. 일단 "목적"이 중요하다고 본다. "대체 나는 이 데이터를 가지고 뭘 하려는 거지?" 라는... 물론 공부하다 보면 이런 가정은 틀릴 수 있다.


여튼, 우리는 (데이터의) "특징"을 찾아내는 건데.. 원문은 "선택"이라 표현했다. 중요한 의미가 있다고 본다.



아랫 단원 Features Extractors(특징추출(기)) > TF-IDF


TF-IDF는 Term Frequency - Inverse Document Frequency의 약자인데, 문서들 속에서 의미있는 어떤 가치를 찾아내는 텍스트 마이닝 도구중의 하나로 소개되고 있다. 


"Word Frequency"라고 하지 않고 "Word"대신 "Term"을 쓴 것을 보면 단어 단위가 아닌 좀 더 융통성 있게 최소단위를 정할 수 있다고 짐작된다. 그런데 그 다음 문구에서 "Inverse" 의 의미가 조금은 어렵다. 왜 "Inverse(거꾸로)"인지는 공부하면서 알아봐야겠다.


자, 일단 TF-IDF의 기본 수식이다. 다음과 같이 우선 정의하자.

  • t : 어떤 Term(단어 혹은 문구등)
  • d : 어떤 문서 (문서는 많은 t들로 구성된다)
  • D : 전체(문서) (이 것을 보면 여러개의 문서가 있다고 보는 듯 하다)
  • TF(t, d)  어떤 문서 d 안에서 어떤 Term  t 의 빈도수 
  • DF(t, D) 어떤 t 를 포함하는 문서의 빈도수 
  • |D|  : 전체(문서)내 문서 수
여기서 IDF를 다음과 같이 정의한다.



마지막으로 우리가 얻고자 하는 값 TFIDF는 아래와 같이 구해진다.




자, 이 수식만 봤을 때, 많은 의문점이 들었다. 하나하나 따져 보기로 한다.


먼저, IDF에 대해 살펴보자. 예를 들면, 영어를 기준으로 할 때, 텍스트마이닝에서 (정)관사 a, an, the 등은 거의 의미가 없는데, 이러한 것들을 찾아내기 위해 고안된 값이다. 이 방식은 모든 문서에 걸쳐서 자주 쓰여진 단어는 어떤 문서의 의미를 대표하기에 적절치 않다는 것이다. 


IDF식에서 로그를 빼고 보면 분자는 문서의 갯수고 분모는 빈도수이니 그값은 절대 1보다 작을수 없다. 로그를 취했기 때문에 IDF값은 0보다 크거나 같다. 그런데 이 값은 DF값 즉 문서의 빈도수가 커지면 커질수록 IDF값은 작아진다. 아마도 "Inverse"는 "반비례"로 쓰였다고 본다.


(계속)