심심해서 하는 블로그 :: 심심해서 하는 블로그

이클립스와 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)
<- 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, falsenull);
        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(10001000);
        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



,

역시 삽질은 즐거워... 매번 당하면서도 왜 피하질 못하니ㅠㅠ 


1. R 또는 RStudio를 실행하여 install.packages("rJava")를 실행하여 rJava를 설치한다.

2. [R의 설치 경로]\R-3.3.1\library\rJava\jri로 가면 jar파일 3개가 보인다. 얘네들을 써먹을 거다.




3. 이클립스를 자바 프로젝트를 하나 생성한다.  그 후 해당 프로젝트 오른쪽 마우스 클릭 > Properties 

  Java Build Path > Libraries > Add Extermal JARs.. 클릭 2번의 3개의 파일을 찾아 등록한다. 


4. 환경변수를 추가한다.

    1) R_HOME 추가 : R의 설치경로

       


   2) 환경변수 편집(Window 10.. Window 버전에 따라서 조금 설정화면이 다를 수 있어욤)

       


5. Example Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package Test;
 
import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;
 
public class REngineTest02 {
    public static void main(String[] args) {
        String[] Rargs = {"--vanilla"};
        Rengine re = new Rengine(Rargs, falsenull);
        System.out.println("Create R Engine...");
        
        if(!re.waitForR()){
            System.out.println("Loading R engine was failed");
            return;
        }
        
        REXP a = re.eval("a <- 10"true);
        System.out.println(a.asDouble());
    }
}
 
cs






,

1. 등장 인물(아니 부품?)

   1) PC (Program Counter) : 다음 실행할 명령어의 주소를 저장

   2) 기억장치 주소 레지스터(MAR) : 다음에 읽거나 쓸 기억장소의 주소를 지정

   3) 기억장치 버퍼 레지스터(MBR) : 기억장치에 저장될 데이터 혹은 기억장치로 부터 읽은 데이터를 임시 저장

   4) 명령어 레지스터(IR) : 현재 수행중인 명령어 저장

   5) 산술 논리 장치(ALU) : 산술연산과 논리연산을 수행 


2. 명령어 패치(Fetch Cycle)

   1) PC에서 다음 수행할 명령어 주소를 MAR에 저장하고 PC에 저장된 주소는 +1


   2) MAR에 저장된 주소에 해당되는 값을 메모리에서 가져와 MBR에 저장

      이 때 메모리에서 받아온 값은 Data 또는 Opcode

  3) Opcode(명령어) 라면  IR에서 명령어를 Decode한다.

   4) 1)~2) 과정으로 Data(Operand)를 메모리로부터 읽어온 후 ALU에서 연산을 수행한다.(Excute Cycle)

       그리고 연산 결과는 MBR을 거쳐 메모리로 다시 저장한다



,