Lecture09: 階層的クラスター分析

自作関数ファイルの読み込み

source("func4lec09.R")

分析テキストURL

article_urls <- c()
article_urls <- readLines("Lec09_ArticleURL_info")
article_urls
 [1] "https://mainichi.jp/english/articles/20241107/p2a/00m/0et/015000c"
 [2] "https://mainichi.jp/english/articles/20241110/p2g/00m/0li/028000c"
 [3] "https://mainichi.jp/english/articles/20241111/p2g/00m/0na/048000c"
 [4] "https://mainichi.jp/english/articles/20241112/p2g/00m/0sp/005000c"
 [5] "https://mainichi.jp/english/articles/20241209/p2g/00m/0sp/035000c"
 [6] "https://mainichi.jp/english/articles/20241207/p2g/00m/0sp/037000c"
 [7] "https://mainichi.jp/english/articles/20231124/p2a/00m/0et/016000c"
 [8] "https://mainichi.jp/english/articles/20230526/p2a/00m/0et/013000c"
 [9] "https://mainichi.jp/english/articles/20241203/p2a/00m/0li/022000c"
[10] "https://mainichi.jp/english/articles/20241209/p2g/00m/0na/024000c"
[11] "https://mainichi.jp/english/articles/20241207/p2g/00m/0bu/002000c"
[12] "https://mainichi.jp/english/articles/20241208/p2g/00m/0sc/027000c"

Term-Document Matrixの作成

contents <- lapply(article_urls, getArticleContent)
tmMtx <- getDocumentTermMTX(contents, term="lemma")
Processed document 10 of 12
dim(tmMtx)
[1] 1119   12
head(tmMtx)

相対頻度行列

文書単語行列(相対頻度 & TF-IDF2)

文書頻度(Dcument Frequency:DF)

DF<-apply(tmMtx, 1, function(x) length(x[x>0]))
head(DF)
-team     '    's  15th    20   20s 
    1     1    10     1     1     1 

文書数

(N<-ncol(tmMtx))
[1] 12

TF-IDF

\[w=tf*(log(\frac{N}{df})+1) \]

tf_idf2 <- relative_tmMtx*(log(N/DF)+1)
head(tf_idf2)

練習1:DF値を条件として、tmMtxを部分抽出する

DF値が5以上の行を抽出してください

結果の抜粋(抽出結果を変数名tmMtx_c5に格納)

head(tmMtx_c5)

tmMtx_c5の行列サイズを確認

dim(tmMtx_c5)
[1] 41 12

階層的クラスター分析

文書間の距離を測る(euclidean距離)

dist.euclidean <- as.matrix(dist(t(relative_tmMtx)))
round(dist.euclidean,3)
       1     2     3     4     5     6     7     8     9    10    11    12
1  0.000 0.119 0.129 0.128 0.112 0.102 0.085 0.083 0.112 0.099 0.104 0.107
2  0.119 0.000 0.143 0.127 0.107 0.119 0.113 0.121 0.102 0.109 0.113 0.128
3  0.129 0.143 0.000 0.146 0.138 0.136 0.132 0.123 0.137 0.132 0.132 0.147
4  0.128 0.127 0.146 0.000 0.128 0.116 0.136 0.137 0.129 0.121 0.130 0.140
5  0.112 0.107 0.138 0.128 0.000 0.104 0.107 0.116 0.115 0.111 0.106 0.127
6  0.102 0.119 0.136 0.116 0.104 0.000 0.107 0.109 0.112 0.105 0.109 0.111
7  0.085 0.113 0.132 0.136 0.107 0.107 0.000 0.083 0.114 0.108 0.106 0.119
8  0.083 0.121 0.123 0.137 0.116 0.109 0.083 0.000 0.112 0.107 0.111 0.116
9  0.112 0.102 0.137 0.129 0.115 0.112 0.114 0.112 0.000 0.101 0.110 0.118
10 0.099 0.109 0.132 0.121 0.111 0.105 0.108 0.107 0.101 0.000 0.086 0.108
11 0.104 0.113 0.132 0.130 0.106 0.109 0.106 0.111 0.110 0.086 0.000 0.118
12 0.107 0.128 0.147 0.140 0.127 0.111 0.119 0.116 0.118 0.108 0.118 0.000

階層的クラスター分析1

  • Distance measure: euclidean
  • Agglomeration method: ward

粗頻度データ

hc.raw.euclidean <- hclust(dist(t(tmMtx)), method = "ward.D2")
plot(hc.raw.euclidean)

相対頻度データ

hc.relative.euclidean <- hclust(dist(t(relative_tmMtx)), method = "ward.D2")
plot(hc.relative.euclidean)

TF-IDFデータ

hc.tfidf.euclidean <- hclust(dist(t(tf_idf2)), method = "ward.D2")
plot(hc.tfidf.euclidean)

階層的クラスター分析2

  • Distance measure: canberra
  • Agglomeration method: ward

粗頻度データ

hc.raw.canberra <- hclust(dist(t(tmMtx)), method = "ward.D2")
plot(hc.raw.canberra)

相対頻度データ

hc.relative.canberra <- hclust(dist(t(relative_tmMtx), method = "canberra"), method = "ward.D2")
plot(hc.relative.canberra)

TF-IDFデータ

hc.tfidf.canberra <- hclust(dist(t(tf_idf2), method = "canberra"), method = "ward.D2")
plot(hc)

課題(締め切り2024年12月17日)

“app_tmMtx_hclust”フォルダのserver.Rを編集して、次のTask1-3に取り組んでください。

Task1: UI.Rの変数”tfIdf”がTRUE値をとるとき、tf-idf2の計算結果をweigited_tmMtxに代入する

Task2: UI.Rの変数”smilMethod”の値が変更されたとき、simil関数の引数methodに反映して、動的にSimilarity Matrixの結果を表示する

Task3: UI.Rの変数”distance”と”agglomeration”が変更されたとき、階層的クラスタリング結果を、動的に表示する

LS0tCnRpdGxlOiAiTGVjMDk6IChGYWxsIDIwMjQpIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgojIExlY3R1cmUwOTog6ZqO5bGk55qE44Kv44Op44K544K/44O85YiG5p6QCiMjIOiHquS9nOmWouaVsOODleOCoeOCpOODq+OBruiqreOBv+i+vOOBvwpgYGB7cn0Kc291cmNlKCJmdW5jNGxlYzA5LlIiKQpgYGAKCiMjIOWIhuaekOODhuOCreOCueODiFVSTApgYGB7cn0KYXJ0aWNsZV91cmxzIDwtIGMoKQphcnRpY2xlX3VybHMgPC0gcmVhZExpbmVzKCJMZWMwOV9BcnRpY2xlVVJMX2luZm8iKQpgYGAKCiMjIFRlcm0tRG9jdW1lbnQgTWF0cml444Gu5L2c5oiQCmBgYHtyfQpjb250ZW50cyA8LSBsYXBwbHkoYXJ0aWNsZV91cmxzLCBnZXRBcnRpY2xlQ29udGVudCkKdG1NdHggPC0gZ2V0RG9jdW1lbnRUZXJtTVRYKGNvbnRlbnRzLCB0ZXJtPSJsZW1tYSIpCmRpbSh0bU10eCkKaGVhZCh0bU10eCkKYGBgCgojIyDnm7jlr77poLvluqbooYzliJcKLSA8YSBocmVmPSJodHRwczovL3d3dy5yLWJsb2dnZXJzLmNvbS8yMDIyLzA3L2hvdy10by11c2UtdGhlLXN3ZWVwLWZ1bmN0aW9uLWluLXIvIiB0YXJnZXQ9Il9ibGFuayI+c3dlZXDplqLmlbA8L2E+44Gu5Yip55SoCgpgYGB7cn0KIyMjIGFwcGx5KHRtTXR4LCAyLCBmdW5jdGlvbih4KSB4L3N1bSh4KSkgI2NmLiBsZWN0dXJlMDYKcmVsYXRpdmVfdG1NdHggPC0gc3dlZXAodG1NdHgsIE1BUkdJTiA9IDIsIGNvbFN1bXModG1NdHgpLCBGVU4gPSAiLyIpCmhlYWQocmVsYXRpdmVfdG1NdHgpCmBgYAoKIyMg5paH5pu45Y2Y6Kqe6KGM5YiXKOebuOWvvumgu+W6piAmIFRGLUlERjIpIAojIyMg5paH5pu46aC75bqmKERjdW1lbnQgRnJlcXVlbmN5OkRGKQpgYGB7cn0KREY8LWFwcGx5KHRtTXR4LCAxLCBmdW5jdGlvbih4KSBsZW5ndGgoeFt4PjBdKSkKaGVhZChERikKYGBgCgojIyMg5paH5pu45pWwCmBgYHtyfQooTjwtbmNvbCh0bU10eCkpCmBgYAojIyMgVEYtSURGCiQkdz10ZioobG9nKFxmcmFje059e2RmfSkrMSkgJCQKYGBge3J9CnRmX2lkZjIgPC0gcmVsYXRpdmVfdG1NdHgqKGxvZyhOL0RGKSsxKQpoZWFkKHRmX2lkZjIpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyAiPue3tOe/kjE8L3NwYW4+OkRG5YCk44KS5p2h5Lu244Go44GX44Gm44CBdG1NdHjjgpLpg6jliIbmir3lh7rjgZnjgosKIyMjIERG5YCk44GMNeS7peS4iuOBruihjOOCkuaKveWHuuOBl+OBpuOBj+OBoOOBleOBhApgYGB7ciwgZWNobz1GQUxTRX0KdG1NdHhfYzUgPC0gdG1NdHhbKERGPj01KSwgXQpgYGAKCiMjIyDntZDmnpzjga7mipznsovvvIjmir3lh7rntZDmnpzjgpLlpInmlbDlkI10bU10eF9jNeOBq+agvOe0jSkKYGBge3J9CmhlYWQodG1NdHhfYzUpCmBgYAojIyMgdG1NdHhfYzXjga7ooYzliJfjgrXjgqTjgrrjgpLnorroqo0KYGBge3J9CmRpbSh0bU10eF9jNSkKYGBgCgojIyDpmo7lsaTnmoTjgq/jg6njgrnjgr/jg7zliIbmnpAKKiA8YSBocmVmPSJodHRwczovL2JlbGxjdXJ2ZS5qcC9zdGF0aXN0aWNzL2NvdXJzZS8yNzE1NS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+5Y+C6ICD44K144Kk44OIMTog6ZqO5bGk55qE44Kv44Op44K544K/44O85YiG5p6QPC9hPgoqIDxhIGhyZWY9Imh0dHBzOi8vbnVtZXJpY3MubWF0aGRvdG5ldC5jb20vRGlzdGFuY2UiIHRhcmdldD0iX2JsYW5rIj7lj4LogIPjgrXjgqTjg4gyOiDot53pm6LooYzliJc8L2E+CgojIyMg5paH5pu46ZaT44Gu6Led6Zui44KS5ris44KL77yIZXVjbGlkZWFu6Led6Zui77yJCmBgYHtyfQpkaXN0LmV1Y2xpZGVhbiA8LSBhcy5tYXRyaXgoZGlzdCh0KHJlbGF0aXZlX3RtTXR4KSkpCnJvdW5kKGRpc3QuZXVjbGlkZWFuLDMpCmBgYAoKIyMjIOmajuWxpOeahOOCr+ODqeOCueOCv+ODvOWIhuaekDEKKiBEaXN0YW5jZSBtZWFzdXJlOiBldWNsaWRlYW4KKiBBZ2dsb21lcmF0aW9uIG1ldGhvZDogd2FyZAoKIyMjIyDnspfpoLvluqbjg4fjg7zjgr8KYGBge3J9CmhjLnJhdy5ldWNsaWRlYW4gPC0gaGNsdXN0KGRpc3QodCh0bU10eCkpLCBtZXRob2QgPSAid2FyZC5EMiIpCnBsb3QoaGMucmF3LmV1Y2xpZGVhbikKYGBgCgojIyMjIOebuOWvvumgu+W6puODh+ODvOOCvwpgYGB7cn0KaGMucmVsYXRpdmUuZXVjbGlkZWFuIDwtIGhjbHVzdChkaXN0KHQocmVsYXRpdmVfdG1NdHgpKSwgbWV0aG9kID0gIndhcmQuRDIiKQpwbG90KGhjLnJlbGF0aXZlLmV1Y2xpZGVhbikKYGBgCgojIyMjIFRGLUlERuODh+ODvOOCvwpgYGB7cn0KaGMudGZpZGYuZXVjbGlkZWFuIDwtIGhjbHVzdChkaXN0KHQodGZfaWRmMikpLCBtZXRob2QgPSAid2FyZC5EMiIpCnBsb3QoaGMudGZpZGYuZXVjbGlkZWFuKQpgYGAKCiMjIyDpmo7lsaTnmoTjgq/jg6njgrnjgr/jg7zliIbmnpAyCiogRGlzdGFuY2UgbWVhc3VyZTogY2FuYmVycmEKKiBBZ2dsb21lcmF0aW9uIG1ldGhvZDogd2FyZAoKIyMjIyDnspfpoLvluqbjg4fjg7zjgr8KYGBge3J9CmhjLnJhdy5jYW5iZXJyYSA8LSBoY2x1c3QoZGlzdCh0KHRtTXR4KSksIG1ldGhvZCA9ICJ3YXJkLkQyIikKcGxvdChoYy5yYXcuY2FuYmVycmEpCmBgYAoKIyMjIyDnm7jlr77poLvluqbjg4fjg7zjgr8KYGBge3J9CmhjLnJlbGF0aXZlLmNhbmJlcnJhIDwtIGhjbHVzdChkaXN0KHQocmVsYXRpdmVfdG1NdHgpLCBtZXRob2QgPSAiY2FuYmVycmEiKSwgbWV0aG9kID0gIndhcmQuRDIiKQpwbG90KGhjLnJlbGF0aXZlLmNhbmJlcnJhKQpgYGAKCiMjIyMgVEYtSURG44OH44O844K/CmBgYHtyfQpoYy50ZmlkZi5jYW5iZXJyYSA8LSBoY2x1c3QoZGlzdCh0KHRmX2lkZjIpLCBtZXRob2QgPSAiY2FuYmVycmEiKSwgbWV0aG9kID0gIndhcmQuRDIiKQpwbG90KGhjKQpgYGAKCiMjICDoqrLpoYzvvIjnt6DjgoHliIfjgooyMDI05bm0MTLmnIgxN+aXpe+8iQojIyMgImFwcF90bU10eF9oY2x1c3Qi44OV44Kp44Or44OA44Guc2VydmVyLlLjgpLnt6jpm4bjgZfjgabjgIHmrKHjga5UYXNrMS0z44Gr5Y+W44KK57WE44KT44Gn44GP44Gg44GV44GE44CCCgojIyMjICBUYXNrMTogVUkuUuOBruWkieaVsCJ0ZklkZiLjgYxUUlVF5YCk44KS44Go44KL44Go44GN44CBdGYtaWRmMuOBruioiOeul+e1kOaenOOCkndlaWdpdGVkX3RtTXR444Gr5Luj5YWl44GZ44KLCgojIyMjIFRhc2syOiBVSS5S44Gu5aSJ5pWwInNtaWxNZXRob2Qi44Gu5YCk44GM5aSJ5pu044GV44KM44Gf44Go44GN44CBc2ltaWzplqLmlbDjga7lvJXmlbBtZXRob2Tjgavlj43mmKDjgZfjgabjgIHli5XnmoTjgatTaW1pbGFyaXR5IE1hdHJpeOOBrue1kOaenOOCkuihqOekuuOBmeOCiwoKIyMjIyBUYXNrMzogVUkuUuOBruWkieaVsCJkaXN0YW5jZSLjgagiYWdnbG9tZXJhdGlvbiLjgYzlpInmm7TjgZXjgozjgZ/jgajjgY3jgIHpmo7lsaTnmoTjgq/jg6njgrnjgr/jg6rjg7PjgrDntZDmnpzjgpLjgIHli5XnmoTjgavooajnpLrjgZnjgosKCgoKCg==