部屋とYシャツと私
2015/12/05
Japan.R 2015@株式会社RCO
和田 計也
(4年ぶり2回目)
2015/12/05
いつもの
この発表は個人 の見解であり、 所属する組織の 公式見解ではありません
サイバー系
2
サイバー系
2015/12/05
自己紹介u和田 計也(@wdkz) !
!!
u静岡県袋井市出身 uサイバー系企業でデータマイニングエンジニア職
u 趣味は音楽鑑賞 u 最近は松浦亜弥ばっか聴いてます
サイバー系
3
サイバー系
2015/12/05
部屋とYシャツと私、といえばサイバー系
4
サイバー系
u 2013年12月のライブで松浦亜弥がカヴァーした曲
u それから2年経って…
u部屋 ̶> Shiny u Yシャツ ̶> rApache u私 ̶> DeployR
2015/12/05
Shinyサイバー系
u Rでweb applicationを作るためのframework !
5
サイバー系
2015/12/05
rApacheサイバー系
u RとApacheでWeb Application を作るためのFramework
u mod_perl的なmod_R 6
サイバー系
2015/12/05
DeployRサイバー系
u RでREST API作るためのFramework
7
サイバー系
2015/12/05
比較表サイバー系
8
サイバー系
shiny rApache DeployR
想定ユーザー 人 (人と)プログラム プログラム
メリット簡単にBIツールっぽのが作成できる
戻り値を柔軟に設定できる
開発&デバッグがやりやすい
デメリット同時アクセスにめっぽう弱い
開発&デバッグがやりづらい
戻り値が冗長
ライセンス・AGPL v3 ・RStudio License Agreement
・Apache License 2.0
・AGPL v3 ・Microsoft License Agreement
開発者 R Studio社 Jeffrey HornerMicrosoft(RevolutionAnalytics社)
2015/12/05
ここで一旦CMですサイバー系
9
サイバー系
u サイバー系企業ではエンジニア絶賛募集中です!! u 学会発表できます! u 論文執筆できます! u もちろん実務もバリバリやりましょう!
!
第9回SIG-DOCMAS研究会(2015) より http://www.ai.soc.i.kyoto-u.ac.jp/docmas/ja/
2015/12/05
ここで一旦CMですサイバー系
10
サイバー系
第9回SIG-DOCMAS研究会(2015) より http://www.ai.soc.i.kyoto-u.ac.jp/docmas/ja/
Rでword2vec やりたいじゃないですか
2015/12/05
word2vecやりましょうサイバー系
11
サイバー系
python 2.7以上がインストールされているとしてshell上でgensimをinstall
>pip install gensimbuild_mdl_w2v <- function(input_data = 'text8', #入力
size = 256, windows = 5, sg = 0, min_count = 5, model_out = 'vectors.txt' #出力 ){ library(rPython) python.assign("data", input_data) python.assign("size", size) python.assign("windows", windows) python.assign("sg", sg) python.assign("min_count", min_count) python.assign("model_out", model_out) python.exec("from gensim.models import word2vec") python.exec("sentence = word2vec.Text8Corpus(data)") python.exec("model = word2vec.Word2Vec(sentence, size=size, window=windows, sg=sg, min_count=min_count)") python.exec("model.save_word2vec_format(model_out, binary=False)") } build_mdl_w2v()
2015/12/05
word2vecやりましょうサイバー系
12
サイバー系
vectors.txtというモデルを生成(中身はテキストファイル)
2015/12/05
尚、現在はサイバー系
13
サイバー系
u 2015年11月にGithub上に公開されてたwordVectorsライブラリを使うほうが真っ当
https://github.com/bmschmidt/wordVectors !u rPython使えば、今後も出てくるであろうpythonで書かれ
たライブラリをいち早くRでも利用できるよ!!
2015/12/05
今日やることサイバー系
14
サイバー系
u 作成したmodelを使って、結果を返すようなweb applicationをShiny, rApache, DeployRで作ってみましょう
!
2015/12/05
準備
サイバー系
15
サイバー系
2015/12/05
まずはサイバー系
16
サイバー系
u 表現層ベクトルの演算からのコサイン類似度算出のロジックを作る
u コサイン類似度部分(速度必要なのでRcppで)
library(inline) cos.simfun = cxxfunction( signature(A="numeric", B="matrix"), body = ' NumericVector a(A); NumericMatrix xx(B); NumericVector yy(xx.nrow()); for(int i = 0; i < xx.nrow(); i++){ yy[i] = sum(a * xx(i,_))/sqrt(sum(a*a)*sum(xx(i,_)*xx(i,_))); } return( yy ); ', plugin="Rcpp")
2015/12/05
まずはサイバー系
17
サイバー系
u 表現層ベクトルの演算からのコサイン類似度算出のロジックを作る
u 表現層ベクトル演算(の単発文字列例_このままだと演算できないよ)と類似度TopN算出部分
calc_distance <- function(mdl, word = "king", topn=10 ) { mdl %>% filter(V1 == word) %>% select(-V1) %>% as.numeric -> this_vec data.frame(word = mdl$V1, cos_sim = cos.simfun(A = this_vec, B = as.matrix(mdl[,-1, with=F]) ), stringsAsFactors = F) %>% arrange(desc(cos_sim)) %>% head(topn) }
2015/12/05
まずはサイバー系
18
サイバー系
u 表現層ベクトルの演算からのコサイン類似度算出のロジックを作る
u 実行部分
run_w2v <- function(){ #build_mdl_w2v() library(data.table) mdl <- fread("vectors.txt", sep = ' ', skip = 1, header = F) mdl %>% calc_distance(word = "king - man + woman") }
2015/12/05
Shiny
サイバー系
19
サイバー系
2015/12/05
Shinyでサイバー系
20
サイバー系
u RStudioで「New Project」̶>「New Directory」̶> 「Shiny Web Application」̶>適当な名前付ける
2015/12/05
Shinyでサイバー系
21
サイバー系
u いい感じのテンプレートが生成されるので、後は適当にこのファイル2つserver.Rとui.Rを修正すれば良い
u ちなみに、生成されたままの状態で「Run App」するとこんなのが起動します→→→→→→→
2015/12/05
Shinyでサイバー系
22
サイバー系
u server.R部分修正前 u さっき作ったロジック部分のコードをそれなりの箇所に追記します
よ
library(shiny) !shinyServer(function(input, output) { output$distPlot <- renderPlot({ x <- faithful[, 2] bins <- seq(min(x), max(x), length.out = input$bins + 1) hist(x, breaks = bins, col = 'darkgray', border = 'white') }) })
plotをtable 描写へ 変更
動的にcalc_distance関数 を呼ぶよう追記
library読み込んだり、 関数定義したりする
2015/12/05
Shinyでサイバー系
23
サイバー系
u server.R部分修正後 u こんな感じ
library(shiny); library(dplyr); library(inline) library(data.table); library(rhandsontable) cos.simfun = cxxfunction( … ) #略
calc_distance <- function(mdl, word, topn){…} #略
mdl <- fread(txt, sep = ‘ ’, skip = 1){} #略 shinyServer(function(input, output) { select_data <- reactive({ calc_distance(mdl, word = input$word, topn = input$topn) }) output$table1 <- renderRHandsontable({ if(is.null(input$terms)){ return(NULL) }else{ select_data() %>% rhandsontable } }) })
2015/12/05
Shinyでサイバー系
24
サイバー系
u ui.R部分修正前 u Viewに合わせてそれなりに追記しますよ
library(shiny) shinyUI(fluidPage( titlePanel("Old Faithful Geyser Data"), sidebarLayout( sidebarPanel( sliderInput("bins", "Number of bins:", min = 1, max = 50, value = 30) ), mainPanel( plotOutput("distPlot") ) ) ))
plotをtable 描写へ 変更
input部分を微調整
title表記微調整
2015/12/05
Shinyでサイバー系
25
サイバー系
u ui.R部分修正後 u こんな感じ
library(shiny); library(rhandsontable) shinyUI(fluidPage( titlePanel("word2vec"), sidebarLayout( sidebarPanel( sliderInput("topn", "TopN:", min = 1, max = 50, value = 10), textInput("words", "入力", "king")
), mainPanel( rHandsontableOutput("table1", height = 1250) ) ) ))
plotをtable 描写へ 変更
input部分を微調整
title表記微調整
2015/12/05
Shinyでサイバー系
26
サイバー系
u やってみた例
2015/12/05
rApache
サイバー系
27
サイバー系
2015/12/05
rApacheでサイバー系
28
サイバー系
u まずはRookライブラリでそれっぽいの構築します
library(Rook); library(dplyr); library(inline); library(data.table); cos.simfun = cxxfunction( … ) #略
calc_distance <- function(mdl, term, topn){…} #略
run_w2v <- function(env){ mdl <- fread(txt, sep = ‘ ’, skip = 1){} #略 req <- Rook::Request$new(env); res <- Rook::Response$new() words <- NULL if(!is.null(req$GET()[['word']])){ words <- req$GET()[['word']] mdl %>% calc_distance(term=words) -> res_tbl } res$write('input term.\n') res$write('<form method="GET">\n') res$write('<input type="text" name="term">\n') res$write('<input type="submit" name="Submit"><br>\n</form>\n<br>') if(!is.null(words)) res$write(paste(‘<h1>’,terms,’</h1>\n')) if(exists(‘res_tbl’)) res$write(hwriter::hwrite(res_tbl)) res$finish() }
ここら辺の outputは HTMLベタ書き
2015/12/05
rApacheでサイバー系
29
サイバー系
u まずはRookライブラリで動作チャック
rk <- Rhttpd$new() rk$start(quiet = TRUE) rk$add(app=run_w2v, name="word2vec") rk$browse("word2vec")
一個前で定義した関数
2015/12/05
rApacheでサイバー系
30
サイバー系
u rApacheにデプロイなんだけど、その前にrApacheの準備 u Ubuntuの場合
sudo add-apt-repository ppa:opencpu/rapache sudo apt-get update sudo apt-get install libapache2-mod-r-base sudo vi /etc/apache2/mods-available/mod_R.load
LoadModule R_module /usr/lib/apache2/modules/mod_R.so 1行追記
sudo a2enmod mod_R sudo service apache2 restart
sudo vi /etc/apache2/apache2.conf
<Location /word2vec> SetHandler r-handler RFileEval /home/parallels/sandbox/w2v_rook.R:R::Server$call(run_W2v) </Location>
Rook使って書いた Rのファイル名
Rookのbrowseで 呼んでた関数名
URLの一部になる
2015/12/05
rApacheはサイバー系
31
サイバー系
やること 多くて面倒い
2015/12/05
DeployR
サイバー系
32
サイバー系
2015/12/05
deployRでサイバー系
33
サイバー系
u 起動します !u Vivaldiブラウザで以下のURLにアクセスします
/path/to/deployr/version/startAll.sh
http://<deployr server>:7400/deployr
loginします
2015/12/05
deployRでサイバー系
34
サイバー系
u ログイン後の画面
2015/12/05
deployRでサイバー系
35
サイバー系
u Repository Manager u まだ空ですね
ファイルをuploadしましょう
2015/12/05
deployRでサイバー系
36
サイバー系
u Repository Manager u ファイルupload後
ファイルがuploadできました! & クリック
2015/12/05
deployRでサイバー系
37
サイバー系
u Repository Manager u uploadしたFileのプロパティ
ここら辺でアクセス制御設定できたり
クリック
2015/12/05
deployRでサイバー系
38
サイバー系
u Repository Manager u ブラウザ上で開発ができちゃいます!!
ここで 軽めの 開発
2015/12/05
deployRでサイバー系
39
サイバー系
①
②
③ ④
⑤
⑥
①結果をresという変数に入れるよう変更 ②APIへの入力値としてword <- “king”みたいな感じのを設定 ③resをAPIの戻り値として設定 & ④実行 ⑤実行中の標準出力 ⑥「API Response」ボタンを押して、意図する結果が返るか確認
2015/12/05
deployRでサイバー系
40
サイバー系
u APIを叩いてみよう u 何でRから叩いてるの?とか聞かない
library(RCurl) tt <- postForm(“http://xx.xx.xx.xx:7400/deployr/r/repository/script/execute”, format = "json", filename = "w2v.R", directory = "jr", author = "admin", csvinputs = "word,king", robjects = "res" ) library(jsonlite) tl <- fromJSON(tt)[[1]]$response$workspace$objects$value[[1]]$value names(tl) <- fromJSON(tt)[[1]]$response$workspace$objects$value[[1]]$name as.data.frame(tl)
ここら辺 参考に
2015/12/05
比較表サイバー系
41
サイバー系
shiny rApache DeployR
想定ユーザー 人 (人と)プログラム プログラム
メリット簡単にBIツールっぽのが作成できる
戻り値を柔軟に設定できる
開発&デバッグがやりやすい
デメリット同時アクセスにめっぽう弱い
開発&デバッグが大変面倒い
戻り値が冗長だし柔軟性なし
ライセンス・AGPL v3 ・RStudio License Agreement
・Apache License 2.0
・AGPL v3 ・Microsoft License Agreement
開発者 R Studio社 Jeffrey HornerMicrosoft(RevolutionAnalytics社)
2015/12/05
最後にサイバー系
42
サイバー系
u (主に) DeployR 使ってみたわー u 「スピーカー欲しい人、低額で譲ります!」からの1年経過。
問い合わせ2件、コンバージョン0 u 再募集します!!(アンプ持ってない方、CambridgeAudio
製Azur 350A用意できます!)これ↓の一個まえの型(GX100)左右ペア
@wdkzまでご連絡下さい!!