본문 바로가기

빅데이터/Hadoop

[Hadoop] 하둡으로 TF-IDF

하둡으로 wordcount 말고 tf-idf를 진행해보았다.

 

tf-idf는 어떤 단어가 특정 문서내 얼마나 중요한지 나타내는 통계적 수치이다.

 

자세한설명은 위키참조

 

https://en.wikipedia.org/wiki/Tf%E2%80%93idf

 

 

순서는 다음과 같이 진행한다.

 

1. hadoop mapreduce

 

2. tf-idf 코드 작성

 

3. tf-idf 예제 실행 및 결과 확인

 


 

 

1. hadoop mapreduce

 

mapreduce job : 입력 데이터셋을 독립적인 청크로, 데이터를 의미있게 분할하는 작업

 

map : 입력 데이터가 <key, value>로 변환된 자료구조

ex) wordcount의 경우 문서 내의 모든 단어를 <단어, 1> 으로 mapping 해주게 됨

 

reduce : map의 자료구조를 <key, value>를 통해 연산하는 과정

ex) wordcount에서 <단어, 1>로 저장된 map에서 단어(key)를 확인하여 같은 단어(key)의 value(1)를 전부 더해줌

 

빅데이터를 처리할 때에는 map, reduce를 진행하면서 목적에 맞는 데이터를 정제해내야함

 

2. tf-idf 코드 작성

 

tf-idf 과정을 3단계의 job을 통해 진행하였다. 각각의 job은 map, reduce 2개의 클래스로 구성

각각의 job을 순차적으로 실행시킬 driver는 HadoopTfidf 클래스를 사용

 

1단계 : frequency - 특성 문서를 읽고 특정 word의 빈도수를 계산한다.

2단계 : wordcount - 1단계의 결과를 입력으로 모든 문서의 단어의 총 개수를 계산 후, tfidf 연산 하기위한 형태로 변환

3단계 : tfidf - 실제 tfidf값을 계산한다.

 

 

1단계 - frequency

 

- mapper : (document, each line contents) --> (word@document, 1)

간단하게 문서를 읽고 <word@document, 1> 형태로 데이터를 변환한다.

 

**실제로 특수문자 제거나 자주 나오는 단어(전치사 같은..?)는 제외 해줘야 더 정확하다.. 현재는 그런 고도화된 작업은 없다.

 

 

- reducer : (word@docuemnt, 1) --> (word@document, n)

특정 문서에서 특정 단어가 몇 번 나오는지 연산해준다.

 

 

2단계 - wordcount

 

- mapper : (word@document) --> (document, word=n)

문서에서 총 단어의 수를 세기 위한 형태로 mapping 해준다.

 

 

- reducer : (word@docuement, n/N)

총 단어의 수 N을 계산해 준다. document(key)의 value에서 n 값을 전부 더해 N을 계산한다.

 

 

3단계 - TFIDF

 

- mapper : (word@document, n/N) --> (word, document=n/N)

 

tfidf를 계산하기 위해, 특정 단어에 대해서 등장 문서와, 그 문서의 총 단어의 갯수 및 단어 등장 횟수로 mapping한다.

 

 

- reducer : (word, document=n/N) --> (word@document, d/D, n/N, TFIDF)

 

tfidf reducer-1

frequency 계산 방법을 드라이버의 configuration을 통해 값을 받아온다.

* 위키 백과에서 계산방법 참조

 

tfidf reducer-2

 

tfidf reducer-3

 

각 문서마다 포함된 단어의 수 n, 전체 단어의 수 N을 이용하여 Driver의 입력받은 계산 방법으로 tf 값을 계산한다.

 

D(전체 문서의 수)의 경우 driver에서 값을 가져온다. configuration나 job name으로 암시적으로 값을 넘겨주자.

 

 

Driver

- 각각의 job을 실행하기 위해 입출력 path를 설정한다.

- configuration을 통해 값을 전달해주는 행위 같은 설정을 해준다.

 

초기 입출력 path, 연산 방법을 사용자에게 입력받는다.

 

job1 - frequency
job2 - wordcount
job3 - tfidf

 

 

3. tf-idf 예제 실행 및 결과 확인

 

입력 폴더 확인

tfidf를 진행시키기위한 workspace를 만들고, 문서들을 넣어준다.

 

 

Jar 파일을 생성하고, 실행해준다.

Hadoop jar [jar file] classpath [mode] [input_path] [output_path]

 

결과

 

실제로 위와 같이 word@document, [d/D, n/N, tfidf] 값으로 결과가 나온것을 확인할 수 있다.

 

 

 

후기

- 예제 문서를 그냥 hadoop, spark, hbase 소개 페이지를 긁어다 써서 조잡하다.. 나중에 크롤링 결합해서 더 정교하게 할 수 있지 않을까..

- JAR 만드는걸 IntelliJ가 알아서 해줬는데, cli로 만드는 방법을 찾아봐야겠다.

- 데이터 처리 방법을 더 공부해야할 것 같다. 모르는게 너무 많다. 난 바보다.

- spark도 써보고 싶다...

 

 

레퍼런스

1. https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html : hadoop mapreduce tutorial

2. https://hadoop.apache.org/docs/stable/api/index.html : hadoop API

3. https://en.wikipedia.org/wiki/Tf%E2%80%93idf : tfidf wiki

'빅데이터 > Hadoop' 카테고리의 다른 글

[Hadoop] Hadoop 설치 + wordcount 예제  (0) 2019.12.10