공부하고 기록하는, 경제학과 출신 개발자의 노트

프로그래밍/이것저것_개발일지

Rails로 카카오톡 대화 분석 결과를 보여주는 웹페이지 만들기

inspirit941 2017. 9. 27. 01:15
반응형


170903.



(1)의 글로 카카오톡 텍스트를 R로 분석하는 작업을 거쳤고, 남은 과제는 Ruby on Rails를 활용해 웹페이지를 만드는 것이었다. 

구상한 웹페이지의 기본 형식은


사용자에게서 카카오톡 텍스트데이터를 받는다
받은 텍스트데이터를 Ruby on rails로 분석한다
R에서 분석한 결과값을 웹페이지에서 볼 수 있게 출력한다.


이렇게 세 가지였다.




그런데 R과 Rails를 동시에 쓰려니 생기는 문제점은, Rails에서 R 언어를 활용할 수 있는 방법이 마땅치 않다. Python은 라이브러리가 워낙 많기 때문에 자체적으로 KoNLPy로 형태소 분석과 시각화가 가능하지만, Ruby는 해당 기능을 지원하지 않기 때문이다.


그래서 멋쟁이사자처럼에서 Rails 활용을 위해 쓰고 있는 c9에서 해결의 실마리를 찾았다.


c9에서 Rails를 실행할 때, Rails가 실행되는 c9 웹 서버의 운영체제는 ubuntu다. 아예 ubuntu에 R을 설치하고 R 스크립트를 저장한 후, Rails에서 R 스크립트를 실행하는 명령어를 입력할 수 있다면 어느 정도 해결이 가능하다.


이렇게, Rails에서 R을 돌리기 위한 머나먼 여정이 시작됐다.




1. ubuntu에 R 설치하기

참고: https://www.digitalocean.com/community/tutorials/how-to-set-up-r-on-ubuntu-14-04#step-1-—-setting-up-apt


위 사이트에서 제공하는 명령어들을 bash창에 그대로 하나씩 적어가면 된다.


sudo sh -c 'echo "deb http://cran.rstudio.com/bin/linux/ubuntu trusty/" >> /etc/apt/sources.list' gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9 gpg -a --export E084DAB9 | sudo apt-key add - sudo apt-get update 

sudo apt-get -y install r-base



하나하나 실행한 다음 bash창에 


R


을 입력하면 R이 실행되는 것을 볼 수 있다.
R이 실행되면, 패키지들 다운받는 방법은 기존의 R 사용법과 동일하다.
install.packages(원하는 패키지 이름)을 입력하면 알아서 설치한다.


단, KoNLP 패키지를 제대로 설치하려면 먼저 처리해야 할 작업들이 몇 개 있다.




1-1. ubuntu에 java 설치하기.


KoNLP를 설치하려 할 때, OS 안에 java 언어가 없으면 KoNLP가 제대로 설치되지 않는다.
R의 KoNLP 패키지가 java 언어를 기반으로 동작하기 때문이라고.
참고: http://ngee.tistory.com/276


Rails의 bash창에서 ubuntu 시스템 제어 명령어를 입력할 때는
앞에 sudo 라는 명령어를 붙여주면 된다. 즉 


sudo apt-cache search jdk 

sudo apt-get install openjdk-7-jdk


참고로 올렸던 웹페이지는 루트 설정을 하기 위해 추가 명령어가 필요하지만, c9에서 R 돌리는 용도로만 설치하는 거라면 여타 설정을 할 필요는 없다.



1-2. 한글 locale 설정하기.

이 과정을 마친 다음에도 KoNLP를 설치하려 하면 Charsetlocale 관련 오류가 뜨면서 설치가 안 된다. c9의 기본 언어 locale이 C.UTF-8이라서 생기는 문제인 듯 했다.
해결 방법은 참고: http://blog.daum.net/bagjunggyu/225 , http://blog.1day1.org/81
즉 Rails에서 기본적으로 설정되어 있는 locale 외에, 한글을 지원하는 locale을 새로 설치하고 변형하면 된다.



sudo apt-get install language-pack-ko 로 한글 언어팩을 설치한 다음 

bash창에 locale -a를 입력하면 사용 가능한 locale들이 나온다.


locale -a C C.UTF-8 POSIX ko_KR.euckr 

ko_KR.utf8


내 경우는 이렇게 나오는데, 그럼 여기 있는 한글 locale을 기본으로 설정하면 된다.
locale이 무엇으로 지정되었는지 확인하는 명령어는 bash창에 locale 입력하면 나온다.


locale

LANG=C LANGUAGE=C.UTF-8 LC_CTYPE="C.UTF-8" LC_NUMERIC="C.UTF-8" LC_TIME="C.UTF-8" LC_COLLATE="C.UTF-8" LC_MONETARY="C.UTF-8" LC_MESSAGES="C.UTF-8" LC_PAPER="C.UTF-8" LC_NAME="C.UTF-8" LC_ADDRESS="C.UTF-8" LC_TELEPHONE="C.UTF-8" LC_MEASUREMENT="C.UTF-8" LC_IDENTIFICATION="C.UTF-8" LC_ALL=C.UTF-8


기본 설정은 C.UTF-8이지만, export 명령어로 locale을 바꾸자.


export LC_ALL="ko_KR.UTF-8" export LANG="ko_KR.UTF-8" 

export LANGUAGE="ko_KR.UTF-8"


세 개의 명령어를 bash창에 입력한 다음 다시 locale을 입력해 바뀌었는지 확인하자.

그럼 이제 java문제와 locale이 해결되었으므로 KoNLP 패키지도 설치될 것이다. 

내 경우 저 두 개의 오류를 해결하니 KoNLP 패키지가 정상 작동했다.





2. R 스크립트를 Rails 명령어로 실행하기.


우선, R 스크립트를 c9 경로 어딘가에 저장해야 한다.
어디에 둬도 상관없지만, 나는 보기 편하게 /lib 안에 R 폴더를 만들고, 그 안에 저장했다.
즉 경로는 /lib/R.


piechart.R을 보면, /lib/R 안에 저장되어 있다.



R 폴더 안에 새 파일을 만들고, 확장자명을 .R로 저장하면 ubuntu가 R 스크립트로 인식한다.
명령어로 한 번에 원하는 결과를 얻어야 했기 때문에, R 스크립트도 4개다.
톡방 지분 확인.R, 시간대별 카톡량 확인.R, 워드클라우드.R, 연관성분석.R 네 가지로 시행했다.

각각의 R스크립트는 한 번의 실행만으로 결과값이 나와야 하기에, 최대한 간결하게 코드를 짜서 ubuntu의 부하를 적게 했다.



이제, Rails의 bash 창에 명령어를 입력하면 저 R코드가 실행되도록 해야 한다.


run_r.rake 파일에 명령어를 입력해야 한다.



/lib 폴더의 /task 내에 run_r.rake 파일을 활용하면 된다.


task :piechart_create => :environment do puts "running R!" filepath = Rails.root.join("lib", "R", "piechart.R") @output = `Rscript --vanilla #{filepath}` puts @output 

end



filepath는 R스크립트가 있는 곳의 R스크립트 파일 이름을 지정해 주면 된다. 위의 명령어로는 /lib/R/piechart.R 이라는 파일을 지정했고, 'Rscript --vanilla #{filepath}'로 R 스크립트를 실행한다.
task :_______ <- 이 공간에 어떤 명령어를 bash창에 입력하면 명령을 실행할 지 적는 코드란이다.
즉 저 코드는


bash창에 rake piechart_create 를 입력하면 piechart.R이라는 R스크립트를 실행하고 

그 결과를 @output으로 받는다


가 된다. 마찬가지로 다른 명령어들도 이렇게 지정할 수 있다.





3. 웹페이지에서 자동으로 R 스크립트 실행 결과값 받기.


Rails controller와 routes 설정만으로 해결할 수 있다.
카톡 지분율 결과값이 piechart로 나타나기 때문에 piechart라는 이름을 사용했다.
원하는 결과 형태는



pdf 형태로 결과를 다운로드 받을 수 있게 하는 것,



우선
views에 piechart.html.erb 파일을 하나 생성해 주고, controller에도 piechart를 정의해 준다.
이 piechart.html.erb의 routes는 post 형태로 만들자. 

html 파일을 실제로 보여줄 필요도 없고, pdf 형태로 PC에 다운로드만 되면 되니까.



#routes의 설정 post 'rinruby/piechart', as: :piechart #그리고 controller에서 def piechart system "rake piechart_create" send_file( "#{Rails.root}/public/data/piechart1.pdf", filename: "카톡 대화방 지분율.pdf", type: "application/pdf" )  

end


형태로 만들어 준다.
system 'rake piechart_create'는 rake piechart_create라는 명령어를 bash창에 실행하라는 의미.
send_file은 큰따옴포 안에 있는 파일을 filename으로 지정해 pdf 형태로 반환하라는 의미다.


rake piechart_create의 R 스크립트를 통해 pdf 파일 형태로 카톡 대화방 지분율 그래프를 만들고,
그 그래프를 send_file 명령어로 웹 서비스 사용자에게 전달하는 형태이다.
이와 같은 방식으로 R 스크립트 명령어를 Rails를 통해, 정확히는 c9의 ubuntu와 Rails를 통해 실행할 수 있었다.


멋쟁이사자처럼에서 한 학기 배운 실력에 구글 검색으로 찾아서 하다 보니, ubuntu 서버도 작고 불편한 c9밖에 활용할 줄 몰라서 이런 고행길을 걸었다. 뉴비인 나는 이렇게 찾아보면서 이것저것 알게 되고 공부한 계기가 됐지만, c9으로 R 분석을 하려는 사람이 있다면 말리고 싶다. 512MB RAM을 제공하는 c9의 ubuntu OS는 R 텍스트분석을 버텨내기엔 너무 작다. 워드클라우드 파일 하나 만드는 데 40분이 걸리고, 연관성분석은 아예 시간초과로 작동하지 않는다. c9 유료결제를 활용해도, RAM이 최대 2.5GB에 그치는지라 시간이 오래 걸리는 건 매한가지다. 다른 방법이 있었다면, 그 방법을 써 봐도 되지 않았을까.


R 텍스트 분석과 Ruby on Rails로 웹페이지 구현. 두 개의 결과물을 만드는 데 2017년 여름방학이 지나갔다.

반응형