이 포스트에서 소개하는 태그 클라우드(tag cloud, word cloud, weighted list라는 다양한 이름으로 불림)는 어떤 문서의 빈번히 나타나는 단어를 시각화해서 보여주는 방법입니다(영문 위키 참조: 링크).


이전 글에서 2017/09/16 - [노트정리/자바 JAVA] - 자바(Java)에서 HtmlUnit을 이용해 트위터 특정 사용자의 친구 목록 크롤링하는 예제를 소개했습니다.


해당 글의 방법을 응용해서 특정 사용자의 친구 목록에 있는 사용자를 크롤링하는 방법 뿐 아니라 특정 사용자의 트위터 메시지, 친구들의 메시지도 긁어올 수 있습니다.


친구 목록에 있는 사람들의 메시지를 긁어와서 <아이디.txt> 파일로 저장했다고 가정하고, 태그 클라우드 예제를 살펴보겠습니다.


크롤링하는 대상은 http://koreantweeters.com/ktwitter/top/0/1/tags 에서 팔로워 수 순위 상위 20인입니다(지드래곤, 최시원, 닉쿤 등등).



1. 트윗 메시지 크롤링


이전 글을 참고하시기 바랍니다.



2. 태그 클라우드 라이브러리 설치


Kumo의 태그 클라우드 라이브러리를 사용합니다(링크 참고).


설치는 우분투에서 brew를 써서 합니다.


brew install https://raw.githubusercontent.com/kennycason/kumo/master/script/kumo.rb


brew가 없다면 apt-get install로 brew를 먼저 설치합니다.


설치하고 나면 어느 위치에 jar파일이 있는지 알려줍니다.


제 경우는 $HOME/.cache/Homebrew 입니다.



3. 태그 클라우드 만들기 예제


소스: 링크


package tagcloud;

import java.awt.Color;
import java.awt.Dimension;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.kennycason.kumo.CollisionMode;
import com.kennycason.kumo.WordCloud;
import com.kennycason.kumo.WordFrequency;
import com.kennycason.kumo.bg.RectangleBackground;
import com.kennycason.kumo.font.scale.LinearFontScalar;
import com.kennycason.kumo.nlp.FrequencyAnalyzer;
import com.kennycason.kumo.palette.ColorPalette;

public class Top20TagCloud {
	private static ArrayList<String> getTop20IDs(String fileName) {
		ArrayList<String> IDs = new ArrayList<String>();
		
		BufferedReader inputStream = null;
		
		try {
			inputStream = new BufferedReader(new FileReader(fileName));
			
			String l;
			while((l = inputStream.readLine()) != null) {
				IDs.add(l);
			}
		} catch (IOException e) {
			System.err.println("IOException: "+e.getMessage());
			System.exit(1);
		}
		
		return IDs;
	}
	
	private static void getTweets(ArrayList<String> IDs) throws InterruptedException {
		for (int i = 0; i < IDs.size(); i++) {
			String userName = IDs.get(i);
			TwitterCrawler.crawlingMessage(userName);
		}
	}
	
	private static void getTagcloud(String textFile) throws IOException {
		final FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();
		final List<WordFrequency> wordFrequencies = frequencyAnalyzer.load("./output/"+textFile+".txt");
		final Dimension dimension = new Dimension(600, 600);
		final WordCloud wordCloud = new WordCloud(dimension, CollisionMode.RECTANGLE);
		wordCloud.setPadding(2);
		wordCloud.setBackground(new RectangleBackground(dimension));
		wordCloud.setBackgroundColor(Color.WHITE);
		wordCloud.setColorPalette(new ColorPalette(new Color(0x4055F1), new Color(0x408DF1), new Color(0x40AAF1), new Color(0x40C5F1), new Color(0x40D3F1), new Color(0xFFFFFF)));
		wordCloud.setFontScalar(new LinearFontScalar(20, 60));
		wordCloud.build(wordFrequencies);
		wordCloud.writeToFile("./output/"+textFile+".png");
	}
	
	private static void drawTagCloud(ArrayList<String> IDs) throws IOException {
		for (int i = 0; i < IDs.size(); i++) {
			String textFile = IDs.get(i);
			getTagcloud(textFile);
		}
	}
	
	public static void main(String[] args) throws InterruptedException, IOException {
		ArrayList<String> IDs = getTop20IDs("top20ids.txt");
		getTweets(IDs);
		drawTagCloud(IDs);
	}
}


위와 같이 사각형의 태그클라우드를 만듭니다.



4. 태그 클라우드 결과


태그 클라우드는 사용자가 많이 언급한 단어를 강조해서 만듭니다.


팔로워가 많은 상위 20명 사용자 중에서 일부만 표시합니다.


(1) 지드래곤



(2) 이민호




(3) 이외수



(4) 박원순



5. 결론


한국 트위터 팔로워 수 상위 20 명 사용자의 태그 클라우드를 만드는 예제를 보았습니다.


태그 클라우드 결과로 각 사용자가 자신의 직업, 관심사에 해당하는 단어를 트윗에 빈번하게 포스트하는 것을 확인했습니다.

신고
Posted by 공돌이pooh

댓글을 달아 주세요