이클립스와 R의 연동은 http://ssoonidev.tistory.com/10 을 참고해주세요
1. 준비물
1) 카카오톡 대화내용 File
컴퓨터용 카카오톡 메신저에서 분석하고자하는 대화방에 들어가서 [Ctrl + S]를 누르면
대화내용을 Text 파일로 저장할 수 있다. 파일명은 편의상 kakao_temp.txt라고 하였다.
2) R 스크립트
주의해야할 것은 아무리 함수가 길더라도 줄바꿈을 하면 안된다.
이거 때매 결과가 안 나와서 뻘짓 정말 많이 했다 ㅠㅠ 이름은 form.R로 저장했다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | library(KoNLP) library(wordcloud) library(RColorBrewer) library(stringr) useSejongDic() data1 <- readLines("kakao_temp.txt", encoding = "UTF-8") data1 <- gsub("손찬호", "", data1) # 대화명1 data1 <- gsub("여보♥", "",data1) # 대화명2 data1 <- str_replace_all(data1, "[^[:alpha:]]", "") #특수문자 Bye~~ data1 <- str_replace_all(data1, "[A-Za-z0-9]", "") #영문, 숫자도 Bye~~ data1 <- gsub("ㅋ", "", data1) data1 <- gsub("ㅠ", "", data1) data1 <- gsub("ㅜ", "", data1) data1 <- gsub("ㅎ", "", data1) data1 <- gsub("오전", "", data1) data1 <- gsub("오후", "", data1) data1 <- gsub("이모티콘", "", data1) data1 <- gsub("월요일", "", data1) data1 <- gsub("화요일", "", data1) data1 <- gsub("수요일", "", data1) data1 <- gsub("목요일", "", data1) data1 <- gsub("금요일", "", data1) data1 <- gsub("토요일", "", data1) data1 <- gsub("일요일", "", data1) data1 <- gsub("년", "", data1) data1 <- gsub("월", "", data1) data1 <- gsub("일", "", data1) data1 <- gsub("음성메세지", "", data1) data1 <- gsub("사진", "", data1) data1 <- gsub("프렌즈팝", "", data1) write(data1,"kakao_1.txt") data2 <- readLines("kakao_1.txt") data2 <- sapply(data1, extractNoun, USE.NAMES = F) data3 <- unlist(data2) data3 <- Filter(function(x){nchar(x)>=2 && nchar(x) <= 4}, data3) wordcount <- table(data3) a <- head(sort(wordcount, decreasing = T), 100) write(a,"kakao_count.txt") palete <- brewer.pal(8, "Set2") jpeg(filename = "cloud.jpg", width = 1000, height = 1000) wordcloud(names(a), freq = a, scale=c(20,2), rot.per = 0.25, min.freq = 1, random.order = F, random.color = T, colors = palete) dev.off() | cs |
3) 이클립스로 프로젝트를 생성하고 해당 자바 프로젝트 폴더 안에 준비물을 넣어 둔다.
2. REnginManager.java
R 스크립트를 읽어 실행하는 클래스이다.
Rengine의 멤버 함수 eval(String text)에서 R스크립트 내용을 수행한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | import java.io.BufferedReader; import java.io.FileReader; import org.rosuda.JRI.Rengine; public class REngineManager { /** * @class R스크립트 파일을 REngine으로 실행하는 클래스 */ private Rengine re; private boolean isRunning = false; private enum SCRIPT_PROCESSING {sucess, fail}; private SCRIPT_PROCESSING state; public REngineManager(){ } public boolean isSucessful(){ if(state == SCRIPT_PROCESSING.sucess) return true; else return false; } public boolean isRunning(){ return isRunning; } public void createREngine(){ String[] Rargs = {"--no-save"}; re = new Rengine(Rargs, false, null); System.out.println("Create R Engine..."); if(!re.waitForR()){ System.out.println("Loading R engine was failed"); isRunning = false; return; } isRunning = true; System.out.println("Create R Engine Sucess !!"); init(); } private void init(){ System.out.println("Install Package...."); re.eval("install.packages(\"KoNLP\")"); re.eval("install.packages(\"wordcloud\")"); re.eval("install.packages(\"RColorBrewer\")"); re.eval("install.packages(\"httr\")"); System.out.println("Install Package Complete!!!"); } public void readScript(String filePath){ try{ BufferedReader reader = new BufferedReader(new FileReader(filePath)); String textLine; while(true){ textLine = reader.readLine(); if(textLine == null) break; re.eval(textLine); } state = SCRIPT_PROCESSING.sucess; reader.close(); } catch(Exception e){ state = SCRIPT_PROCESSING.fail; e.printStackTrace(); } } public void close(){ re.eval("q()"); } } | cs |
3. REnginTest01.java
이 소스코드는 REngineManager가 잘 운영하는지 보기위해 작성되었다
form.R의 결과물을 위의 R스크립트에서 cloud.jpg로 저장되어진다..
싱글 쓰레드에서 자바코드와 REngine가 실행되어져서
REngine이 실행되어지는 동안에는 자바 코드의 수행이 이루어 지지 않는다.
좀 더 효율적인 운영을 위해서 멀티쓰레드 방식을 사용하는 것을 고려해야겠다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | import java.awt.BorderLayout; import java.awt.Color;import java.awt.Component; import java.awt.Graphics; import java.awt.Insets; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.Border; import REngine.REngineManager; public class REngineTest01 extends JFrame { JLabel Image = new JLabel(); public REngineTest01(){ init(); } private void init(){ setSize(1000, 1000); setLayout(new BorderLayout()); setLocationRelativeTo(null); // 화면 중앙으로 setTitle("카카오 워드클라우드"); setResizable(false); } public void setImg(ImageIcon img){ Image.setIcon(img); add("Center", Image); setVisible(true); } public static void main(String[] args){ REngineTest01 testFrame = new REngineTest01(); REngineManager manager = new REngineManager(); manager.createREngine(); System.out.println("Read form.R"); manager.readScript("form.R"); if(manager.isSucessful()){ System.out.println("Complete"); System.out.println("Loading Wordcloud Image..."); ImageIcon cloudImg = new ImageIcon("cloud.jpg"); testFrame.setImg(cloudImg); } else{ System.out.println("Fail"); } } } | cs |
'Data Mining' 카테고리의 다른 글
[Python]pyplot으로 데이터 가시화하기 (1) | 2017.04.08 |
---|---|
[Data Mining] k-NN 알고리즘 (1) | 2017.04.02 |
[Tensorflow]선형 회귀(Linear Regression) (0) | 2017.03.07 |
[R프로그래밍] R과 이클립스를 연동해보자 (0) | 2016.10.01 |
[R프로그래밍] 카톡내용을 분석하여 워드클라우드 만들기 (2) | 2016.08.16 |