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作成手順
- Shiny appのフォルダを作成
- ui.R, server.R, (global.R)のスクリプトファイルを作成
- runApp(フォルダ名)で実行
Shinyアプリケーション”app_hoge”の実行
runApp("app_hoge")
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