심심해서 하는 블로그 :: 'R프로그래밍' 태그의 글 목록

이클립스와 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



,

학교에서 간단하게 배운 R로 일상생활에서 무엇을 해 볼 수 있을까? 고민하다가

"그 동안 여자친구랑 했던 카톡들 중에 어떤 말이 가장 많았을까?" 하는 궁금증에 야심차게(?) 수행해보았다. 


1. 데이터 수집

   컴퓨터 버전 카카오톡에서 [Ctrl + S]를 누르면 이 때까지 상대방과 대화하였던 내용을 .txt파일 형태로 

   저장시켜준다. 그 후 R의 Working Directory 위치에 이 txt파일을 옮겨준다.

   이제 파일을 열어보면....

   허.. 완전 추위에 오돌오돌 떨던 시절의 대화부터 저장되어있다.. txt파일이 12.6MB라니... 

   양이 방대한지라 분석하는데 오래 걸리길래 7월부터 현재까지 대화내용을 분석해 보기로 했다.


2. 데이터 정제

   우선 한글과 워드클라우드로 출력하기 위한 라이브러리를  설치한다.


1
2
3
4
5
6
7
8
9
10
install.packages("KoNLP")
install.packages("wordcloud")
install.packages("RColorBrewer")
install.packages('httr')
library(KoNLP)
library(wordcloud)
library(RColorBrewer)
library(stringr)
 
useSejongDic()
cs


   7월부터 현재까지의 대화내용은 kakao1.txt 파일에 저장되어 있다. 

   특수문자나 숫자, 분석에 필요없는 내용에 대하하여 삭제를 해주는 과정이 필요하다. 

   data1 <- str_replace_all(data1, "[^[:alpha:]]", "") 에서 이 과정을 처리한다.

   카카오톡 계정명인 내 이름과 여자친구 저장명을 삭제하고 

   각 종 게임 아이템 주고 받을 때마다 나오는 메세지 내용을 삭제하고 ㅋㅋ, ㅎㅎ, ㅠㅠ 등등을 

   gsub("대체당할 문자", "대체 하고자하는 문자", 변수)를 활용하여 제거해준다.

   (우리는 프랜즈팝을 즐겨해서 프랜즈팝이 온데간데 등장한다)


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
data1 <- readLines("kakao1.txt")
data1
data1 <- gsub("손찬호""", data1)
data1 <- gsub("여보♥""",data1)
data1 <- str_replace_all(data1, "[^[:alpha:]]""")
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)
data1 <- gsub("월""", data1)
data1 <- gsub("일""", data1)
write(data1,"kakao_1.txt") # 정제한 결과 저장
cs

3. 데이터 분석

    어느 정도로 필터링이 완료되면 이제 이것들의 갯수를 새어주는 코드를 작성한다.

    이 때 2글자 이상의 단어만 카운트가 되도록 하였다.

   

1
2
3
4
5
6
data2 <- readLines("kakao_1.txt")
data2 <- sapply(data1, extractNoun, USE.NAMES = F)
data3 <- unlist(data2)
data3 <- Filter(function(x){nchar(x)>=2}, data3)
wordcount <- table(data3)
wordcount
cs

4. 워드클라우드로 표현하기

   이제 집계된 결과를 기반으로 워드클라우드를 만들어 본다.


1
2
3
4
5
<- head(sort(wordcount, decreasing = T), 30)
palete <- brewer.pal(9"Set2")
wordcloud(names(a), freq = wordcount, scale=c(150,0.5), 
        rot.per = 0.25, min.freq = 1, random.order = F, 
        random.color = T, colors = palete)
cs

5. 결 과

   


7월 달에 여자친구가 시험때문에 같이 한숨을 많이 쉬었던지라 ㅋㅋㅋ 에휴가 1등이다 ㅋㅋㅋ

그외에도 곡성을 보고나서 뭐시중헌디 뭐시중헌디 거렸던것이  임팩트가 있었나보다..ㅋㅋ

차후에 다른 그래프로도 표현을 해보고 매달마다 자동적으로 분석해주는 프로그램을 만들어보고 싶다.

,