하둡으로 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)
frequency 계산 방법을 드라이버의 configuration을 통해 값을 받아온다.
* 위키 백과에서 계산방법 참조
각 문서마다 포함된 단어의 수 n, 전체 단어의 수 N을 이용하여 Driver의 입력받은 계산 방법으로 tf 값을 계산한다.
D(전체 문서의 수)의 경우 driver에서 값을 가져온다. configuration나 job name으로 암시적으로 값을 넘겨주자.
Driver
- 각각의 job을 실행하기 위해 입출력 path를 설정한다.
- configuration을 통해 값을 전달해주는 행위 같은 설정을 해준다.
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 |
---|