Lecture08: Shiny

関数ファイル読み込み

source("func4lec08.R")

前回の文書単語行列データ

記事データの取得

article_urls <- c()
article_urls <- append(article_urls,"https://mainichi.jp/english/articles/20241107/p2a/00m/0et/015000c")
article_urls <- append(article_urls,"https://mainichi.jp/english/articles/20241110/p2g/00m/0li/028000c")
article_urls <- append(article_urls,"https://mainichi.jp/english/articles/20241111/p2g/00m/0na/048000c")
article_urls <- append(article_urls,"https://mainichi.jp/english/articles/20241112/p2g/00m/0sp/005000c")
#length(article_urls)

文書単語行列

#Tokenization (形態素解析)
#library(cleanNLP)
#cnlp_init_udpipe()
contents <- lapply(article_urls, getArticleContent)

### 文書単語行列
#tmMtx <- getDocumentTermMTX(contents)
#tmMtx <- getDocumentTermMTX(contents, term="lemma", punct=TRUE)
tmMtx1 <- getDocumentTermMTX(contents, term="lemma", uposLst=c("NOUN"))
tmMtx2 <- getDocumentTermMTX(contents, term="lemma", uposLst=c("DET"))
dim(tmMtx1)
[1] 152   4
head(tmMtx1)
dim(tmMtx2)
[1] 7 4
head(tmMtx2)

類似度計算

相関係数

ピアソン積率相関係数

\[Corr(x,y)= \frac{\sum (x_{i}-\overline{x}) (y_{i}-\overline{y})}{\sqrt{\sum (x_{i}-\overline{x})^2\sum (y_{i}-\overline{y})^2}} \]

相関係数行列(テキスト間)

uposLst=c(“DET”)

round(cor(tmMtx1),2)
     1    2    3    4
1 1.00 0.74 0.99 0.98
2 0.74 1.00 0.78 0.66
3 0.99 0.78 1.00 0.97
4 0.98 0.66 0.97 1.00

相関係数行列(テキスト間)

uposLst=c(“NOUN”)

round(cor(tmMtx2),2)
     1    2    3    4
1 1.00 0.74 0.99 0.98
2 0.74 1.00 0.78 0.66
3 0.99 0.78 1.00 0.97
4 0.98 0.66 0.97 1.00

相関係数行列(単語間)

転置(transpose): t関数

res_term
   a any depression.The each Oliveirense.To the this
1  8   0              0    0              0  21    2
2 10   1              1    1              0   7    1
3  3   0              0    0              0   7    0
4  2   0              0    0              1   6    1

類似度計算結果

round(cor(res_term),2)

proxyパッケージのインストール

install.packages("proxy", dependencies = TRUE)

proxyパッケージの読み込み

library(proxy)

simil関数による相関係数行列(テキスト間)

行と列を転置(transpose)する

uposLst=c(“DET”)

round(simil(t(tmMtx1)), 2)
     1    2    3
2 0.74          
3 0.99 0.78     
4 0.98 0.66 0.97

テキスト間のコサイン類似度

\[Cos(x,y)= \frac{\sum x_{i} y_{i}}{\sqrt{\sum x_{i}^2\sum y_{i}^2}} \]

res.cos <-simil(t(tmMtx1), method="cosine")

結果の形式:Distant Object出力

round(res.cos,2)
     1    2    3
2 0.82          
3 1.00 0.84     
4 0.98 0.79 0.97

結果の形式:Matrix出力

res2.cos<-simil(t(tmMtx1), method="cosine", diag=T)
res2.cos<-as.matrix(res2.cos)
res2.cos[is.na(res2.cos)] <- 1
round(res2.cos,2)
     1    2    3    4
1 1.00 0.82 1.00 0.98
2 0.82 1.00 0.84 0.79
3 1.00 0.84 1.00 0.97
4 0.98 0.79 0.97 1.00

shiny

Shiny apps Demo

shinyパッケージのインストール

install.packages("shiny", dependencies = TRUE)

shinyパッケージのロード

library(shiny)

Shiny app作成手順

  1. Shiny appのフォルダを作成
  2. ui.R, server.R, (global.R)のスクリプトファイルを作成
  3. runApp(フォルダ名)で実行

app_hoge

  • server.R
  • ui.R

Shinyアプリケーション”app_hoge”の実行

runApp("app_hoge")

app_hoge2

  • server.R
  • ui.R
  • global.R

Shinyアプリケーション”app_hoge2”の実行

runApp("app_hoge2")

プロットマーカーのアプリケーション1”app_pch1”の実行

runApp("app_pch1")

プロットマーカーのアプリケーション2”app_pch2”の実行

runApp("app_pch2")

Shinyでアプリケーションを作成する際の注意点

  • UI(外観)部分から作り始める
  • 少しずつコードを書いて、こまめに動作確認

練習:tmMtx2データを使用し、文書毎に単語出現頻度の情報を棒グラフで表示し、以下の変数をインタラクティブに変更できるようにしてみましょう。

Step1: 棒グラフの色をインタラクティブに変更

Step2: 棒グラフの軸ラベルの向きをインタラクティブに変更

Step3: 文書IDをインタラクティブに変更

runApp("app_tmMtx_freqBar_v1")

棒グラフ描画

#文書1
extractedMtx <- tmMtx2[tmMtx2[1]>0,][1]

freqLst <- unlist(extractedMtx)
names(freqLst) <- rownames(extractedMtx)

barplot(sort(freqLst, decreasing=TRUE))

as.list(extractedMtx)
$`1`
 [1] 4 3 2 2 2 2 2 2 2 2
LS0tCnRpdGxlOiAiTGVjMDg6IFNoaW55LCDpoZ7kvLzluqboqIjnrpciCm91dHB1dDogaHRtbF9ub3RlYm9vawplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KIyBMZWN0dXJlMDg6IFNoaW55CiMjIOmWouaVsOODleOCoeOCpOODq+iqreOBv+i+vOOBvwpgYGB7cn0Kc291cmNlKCJmdW5jNGxlYzA4LlIiKQpgYGAKCiMjIyDliY3lm57jga7mlofmm7jljZjoqp7ooYzliJfjg4fjg7zjgr8KIyMjIOiomOS6i+ODh+ODvOOCv+OBruWPluW+lwpgYGB7cn0KYXJ0aWNsZV91cmxzIDwtIGMoKQphcnRpY2xlX3VybHMgPC0gYXBwZW5kKGFydGljbGVfdXJscywiaHR0cHM6Ly9tYWluaWNoaS5qcC9lbmdsaXNoL2FydGljbGVzLzIwMjQxMTA3L3AyYS8wMG0vMGV0LzAxNTAwMGMiKQphcnRpY2xlX3VybHMgPC0gYXBwZW5kKGFydGljbGVfdXJscywiaHR0cHM6Ly9tYWluaWNoaS5qcC9lbmdsaXNoL2FydGljbGVzLzIwMjQxMTEwL3AyZy8wMG0vMGxpLzAyODAwMGMiKQphcnRpY2xlX3VybHMgPC0gYXBwZW5kKGFydGljbGVfdXJscywiaHR0cHM6Ly9tYWluaWNoaS5qcC9lbmdsaXNoL2FydGljbGVzLzIwMjQxMTExL3AyZy8wMG0vMG5hLzA0ODAwMGMiKQphcnRpY2xlX3VybHMgPC0gYXBwZW5kKGFydGljbGVfdXJscywiaHR0cHM6Ly9tYWluaWNoaS5qcC9lbmdsaXNoL2FydGljbGVzLzIwMjQxMTEyL3AyZy8wMG0vMHNwLzAwNTAwMGMiKQojbGVuZ3RoKGFydGljbGVfdXJscykKYGBgCiMjIyDmlofmm7jljZjoqp7ooYzliJcKYGBge3J9CiNUb2tlbml6YXRpb24gKOW9ouaFi+e0oOino+aekCkKI2xpYnJhcnkoY2xlYW5OTFApCiNjbmxwX2luaXRfdWRwaXBlKCkKY29udGVudHMgPC0gbGFwcGx5KGFydGljbGVfdXJscywgZ2V0QXJ0aWNsZUNvbnRlbnQpCgojIyMg5paH5pu45Y2Y6Kqe6KGM5YiXCiN0bU10eCA8LSBnZXREb2N1bWVudFRlcm1NVFgoY29udGVudHMpCiN0bU10eCA8LSBnZXREb2N1bWVudFRlcm1NVFgoY29udGVudHMsIHRlcm09ImxlbW1hIiwgcHVuY3Q9VFJVRSkKdG1NdHgxIDwtIGdldERvY3VtZW50VGVybU1UWChjb250ZW50cywgdGVybT0ibGVtbWEiLCB1cG9zTHN0PWMoIkRFVCIpKQp0bU10eDIgPC0gZ2V0RG9jdW1lbnRUZXJtTVRYKGNvbnRlbnRzLCB0ZXJtPSJsZW1tYSIsIHVwb3NMc3Q9YygiTk9VTiIpKQpkaW0odG1NdHgxKQpoZWFkKHRtTXR4MSkKZGltKHRtTXR4MikKaGVhZCh0bU10eDIpCmBgYAoKCiMjIOmhnuS8vOW6puioiOeulwojIyDnm7jplqLkv4LmlbAKIyMg44OU44Ki44K944Oz56mN546H55u46Zai5L+C5pWwCiQkQ29ycih4LHkpPSBcZnJhY3tcc3VtICh4X3tpfS1cb3ZlcmxpbmV7eH0pICh5X3tpfS1cb3ZlcmxpbmV7eX0pfXtcc3FydHtcc3VtICh4X3tpfS1cb3ZlcmxpbmV7eH0pXjJcc3VtICh5X3tpfS1cb3ZlcmxpbmV7eX0pXjJ9fSAkJAoKIyMjIOebuOmWouS/guaVsOihjOWIl++8iOODhuOCreOCueODiOmWk++8iQojIyMjIHVwb3NMc3Q9YygiREVUIikKYGBge3J9CnJvdW5kKGNvcih0bU10eDEpLDIpCmBgYAoKIyMjIOebuOmWouS/guaVsOihjOWIl++8iOODhuOCreOCueODiOmWk++8iQojIyMjIHVwb3NMc3Q9YygiTk9VTiIpCmBgYHtyfQpyb3VuZChjb3IodG1NdHgyKSwyKQpgYGAKCiMjIyDnm7jplqLkv4LmlbDooYzliJfvvIjljZjoqp7plpPvvIkKIyMjIyDou6Lnva7vvIh0cmFuc3Bvc2XvvIk6IHTplqLmlbAKYGBge3J9CnJlc190ZXJtIDwtdCh0bU10eDEpCnJlc190ZXJtCmBgYAojIyMg6aGe5Ly85bqm6KiI566X57WQ5p6cCmBgYHtyLCBldmFsPUZBTFNFfQpyb3VuZChjb3IocmVzX3Rlcm0pLDIpCmBgYAojIyMgPGEgaHJlZj0iaHR0cHM6Ly91cmliby5naXRodWIuaW8vcnBrZ19zaG93Y2FzZS9kYXRhLWFuYWx5c2lzL3Byb3h5Lmh0bWwiIHRhcmdldD0iX2JsYW5rIj5wcm94eTwvYT7jg5Hjg4PjgrHjg7zjgrjjga7jgqTjg7Pjgrnjg4jjg7zjg6sKYGBge3IsIGV2YWw9RkFMU0V9Cmluc3RhbGwucGFja2FnZXMoInByb3h5IiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKYGBgCgojIyMgcHJveHnjg5Hjg4PjgrHjg7zjgrjjga7oqq3jgb/ovrzjgb8KYGBge3J9CmxpYnJhcnkocHJveHkpCmBgYAoKIyMjIHNpbWls6Zai5pWw44Gr44KI44KL55u46Zai5L+C5pWw6KGM5YiX77yI44OG44Kt44K544OI6ZaT77yJCiMjIyMg6KGM44Go5YiX44KS6Lui572u77yIdHJhbnNwb3Nl77yJ44GZ44KLCiMjIyMgdXBvc0xzdD1jKCJERVQiKQpgYGB7cn0Kcm91bmQoc2ltaWwodCh0bU10eDEpKSwgMikKYGBgCgojIyDjg4bjgq3jgrnjg4jplpPjga7jgrPjgrXjgqTjg7PpoZ7kvLzluqYKJCRDb3MoeCx5KT0gXGZyYWN7XHN1bSB4X3tpfSB5X3tpfX17XHNxcnR7XHN1bSB4X3tpfV4yXHN1bSB5X3tpfV4yfX0gJCQKCmBgYHtyfQpyZXMuY29zIDwtc2ltaWwodCh0bU10eDEpLCBtZXRob2Q9ImNvc2luZSIpCmBgYAoKIyMjIOe1kOaenOOBruW9ouW8j++8mkRpc3RhbnQgT2JqZWN05Ye65YqbCmBgYHtyfQpyb3VuZChyZXMuY29zLDIpCmBgYAojIyMg57WQ5p6c44Gu5b2i5byP77yaTWF0cml45Ye65YqbCmBgYHtyfQpyZXMyLmNvczwtc2ltaWwodCh0bU10eDEpLCBtZXRob2Q9ImNvc2luZSIsIGRpYWc9VCkKcmVzMi5jb3M8LWFzLm1hdHJpeChyZXMyLmNvcykKcmVzMi5jb3NbaXMubmEocmVzMi5jb3MpXSA8LSAxCnJvdW5kKHJlczIuY29zLDIpCmBgYAojIyBzaGlueQo8YSBocmVmPSJodHRwczovL3NoaW55LnJzdHVkaW8uY29tL2dhbGxlcnkvIiB0YXJnZXQ9Il9ibGFuayI+U2hpbnkgYXBwcyBEZW1vPC9hPgoKIyMjIHNoaW5544OR44OD44Kx44O844K444Gu44Kk44Oz44K544OI44O844OrCmBgYHtyLCBldmFsPUZBTFNFfQppbnN0YWxsLnBhY2thZ2VzKCJzaGlueSIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCmBgYAoKIyMjIHNoaW5544OR44OD44Kx44O844K444Gu44Ot44O844OJCmBgYHtyfQpsaWJyYXJ5KHNoaW55KQpgYGAKCiMjIyBTaGlueSBhcHDkvZzmiJDmiYvpoIYKMS4gU2hpbnkgYXBw44Gu44OV44Kp44Or44OA44KS5L2c5oiQCjIuIHVpLlIsIHNlcnZlci5SLCAoZ2xvYmFsLlIp44Gu44K544Kv44Oq44OX44OI44OV44Kh44Kk44Or44KS5L2c5oiQCjMuIHJ1bkFwcCjjg5Xjgqnjg6vjg4DlkI0p44Gn5a6f6KGMCgoqIDxhIGhyZWY9Imh0dHBzOi8vc2hpbnkucnN0dWRpby5jb20vdHV0b3JpYWwvd3JpdHRlbi10dXRvcmlhbC9sZXNzb24xLyIgdGFyZ2V0PSJfYmxhbmsiPlR1dG9yaWFsPC9hPgoKIyMjIGFwcF9ob2dlCiogc2VydmVyLlIKKiB1aS5SCgojIyMgU2hpbnnjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7MiYXBwX2hvZ2Ui44Gu5a6f6KGMCmBgYHtyLCBldmFsPUZBTFNFfQpydW5BcHAoImFwcF9ob2dlIikKYGBgCgojIyMgYXBwX2hvZ2UyCiogc2VydmVyLlIKKiB1aS5SCiogZ2xvYmFsLlIKCiMjIyBTaGlueeOCouODl+ODquOCseODvOOCt+ODp+ODsyJhcHBfaG9nZTIi44Gu5a6f6KGMCmBgYHtyLCBldmFsPUZBTFNFfQpydW5BcHAoImFwcF9ob2dlMiIpCmBgYAoKIyMjIOODl+ODreODg+ODiOODnuODvOOCq+ODvOOBruOCouODl+ODquOCseODvOOCt+ODp+ODszEiYXBwX3BjaDEi44Gu5a6f6KGMCiogPGEgaHJlZj0iaHR0cDovL3d3dy5zdGhkYS5jb20vZW5nbGlzaC93aWtpL3ItcGxvdC1wY2gtc3ltYm9scy10aGUtZGlmZmVyZW50LXBvaW50LXNoYXBlcy1hdmFpbGFibGUtaW4tciIgdGFyZ2V0PSJfYmxhbmsiPlBDSCBTeW1ib2xzPC9hPgpgYGB7ciwgZXZhbD1GQUxTRX0KcnVuQXBwKCJhcHBfcGNoMSIpCmBgYAoKIyMjIOODl+ODreODg+ODiOODnuODvOOCq+ODvOOBruOCouODl+ODquOCseODvOOCt+ODp+ODszIiYXBwX3BjaDIi44Gu5a6f6KGMCmBgYHtyLCBldmFsPUZBTFNFfQpydW5BcHAoImFwcF9wY2gyIikKYGBgCgojIyMgU2hpbnnjgafjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgpLkvZzmiJDjgZnjgovpmpvjga7ms6jmhI/ngrkKKiBVSe+8iOWkluims++8iemDqOWIhuOBi+OCieS9nOOCiuWni+OCgeOCiwoqIOWwkeOBl+OBmuOBpOOCs+ODvOODieOCkuabuOOBhOOBpuOAgeOBk+OBvuOCgeOBq+WLleS9nOeiuuiqjQoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyAiPue3tOe/kjwvc3Bhbj46dG1NdHgy44OH44O844K/44KS5L2/55So44GX44CB5paH5pu45q+O44Gr5Y2Y6Kqe5Ye654++6aC75bqm44Gu5oOF5aCx44KS5qOS44Kw44Op44OV44Gn6KGo56S644GX44CB5Lul5LiL44Gu5aSJ5pWw44KS44Kk44Oz44K/44Op44Kv44OG44Kj44OW44Gr5aSJ5pu044Gn44GN44KL44KI44GG44Gr44GX44Gm44G/44G+44GX44KH44GG44CCCgojIyMgU3RlcDE6IOajkuOCsOODqeODleOBruiJsuOCkuOCpOODs+OCv+ODqeOCr+ODhuOCo+ODluOBq+WkieabtAojIyMgU3RlcDI6IOajkuOCsOODqeODleOBrui7uOODqeODmeODq+OBruWQkeOBjeOCkuOCpOODs+OCv+ODqeOCr+ODhuOCo+ODluOBq+WkieabtAojIyMgU3RlcDM6IOaWh+abuElE44KS44Kk44Oz44K/44Op44Kv44OG44Kj44OW44Gr5aSJ5pu0CgpgYGB7ciwgZXZhbD1GQUxTRX0KcnVuQXBwKCJhcHBfdG1NdHhfZnJlcUJhcl92MSIpCmBgYAoKIyMg5qOS44Kw44Op44OV5o+P55S7CmBgYHtyfQoj5paH5pu477yRCmV4dHJhY3RlZE10eCA8LSB0bU10eDJbdG1NdHgyWzFdPjAsXVsxXQoKZnJlcUxzdCA8LSB1bmxpc3QoZXh0cmFjdGVkTXR4KQpuYW1lcyhmcmVxTHN0KSA8LSByb3duYW1lcyhleHRyYWN0ZWRNdHgpCgpiYXJwbG90KHNvcnQoZnJlcUxzdCwgZGVjcmVhc2luZz1UUlVFKSkKYGBgCgpgYGB7cn0KZG9jSUQ9MQpleHRyYWN0ZWRNdHggPC0gdG1NdHgyW29yZGVyKHRtTXR4MlssIGRvY0lEXSwgZGVjcmVhc2luZz1UUlVFKSxdWzE6MTAsXVtkb2NJRF0KZXh0cmFjdGVkTXR4CmFzLnZlY3RvcihleHRyYWN0ZWRNdHgpCmFzLmxpc3QoZXh0cmFjdGVkTXR4KQpiYXJwbG90KGFzLnZlY3RvcihleHRyYWN0ZWRNdHgpLCByb3duYW1lcyhleHRyYWN0ZWRNdHgpKQpgYGAKCmBgYHtyfQpkb2MxPC10bU10eDJbdG1NdHgyWzFdPjAsXVsxXQoKZG9jMVtvcmRlcihkb2MxWywxXSldCnRtTXR4MltvcmRlcih0bU10eDJbLCAxXSwgZGVjcmVhc2luZz1UUlVFKSwgXQoKZG9jMVtvcmRlcihkb2MxWywgMV0sIGRlY3JlYXNpbmc9VFJVRSksIF0Kcm93bmFtZXMoZG9jMVtvcmRlcihkb2MxWywgMV0sIGRlY3JlYXNpbmc9VFJVRSksIF0pCmRpbShkb2MxKQpsZW5ndGgocm93bmFtZXMoZG9jMSkpCmxlbmd0aChkb2MxW1sxXV0pCmRvYzFbWzFdXQpiYXJwbG90KGhlaWdodD1kb2MxW1sxXV0scm93bmFtZXMoZG9jMSkpCmBgYAoK