お知らせ

ただいま、シンタックスハイライターの設定を見直しております。
プログラムが見にくくなっているページがありますが、ご容赦ください。

Rでテキストマイニングを試してみる(8)クラスタリング

テキストマイニング

こんにちは。まだまだテキストマイニングをやってみることにします。

今回はクラスタリングです。(アイキャッチ画像がぶどうなのは、「クラスター」が房という意味なので、ぶどうの房の画像を載せることにしたからです。)

対象の文章を集める

クラスタリングで、データを分類整理していくので、さすがに「檸檬」だけというわけにはいきません。

そこで、青空文庫から3人の作者の短編小説を集めました。

梶井基次郎:「檸檬」「愛撫」「桜の樹の下には」

新美南吉:「ごんぎつね」「手袋を買いに」「丘の銅像」

宮沢賢治:「注文の多い料理店」「どんぐりと山猫」「黄いろのトマト」

の9作品を使っていくことにします。

選んだ3人の作家が短命だったのは、ただの偶然です。

クラスタリングをしてみる

いつもは、結果を出すための一通りの処理がわかるように、プログラムをすべて掲載し、その後に実行結果を掲載していました。

今回は、やっていることがわかるように、対話形式でひとつひとつのコマンドを入力したときの実行結果を確認しながら進めていくことにします。

はじめに必要なライブラリをすべて読み込みます。インストールされていないものがある場合には、install.packageでインストールしておいてください。

library(RMeCab)
library(ggdendro)

RMeCab と ggdendro の 2 つのライブラリを使います。

ggdendro はデンドログラムや樹形図を描くパッケージらしいです。

デンドログラムは、クラスター分析でよく見かけるトーナメント表みたいな図です。

次に、作品ごとに用意した9個のテキストファイルが保存されているディレクトリから、文章を読み込み TF-IDF を求めます。

novel<-docMatrix2(choose.dir(),pos=c("名詞","動詞","形容詞"),weight="tf*idf*norm")
head(novel,10)

それでは、novel 変数の最初の 10 件を表示した結果を掲載します。

           kajii_aibu.txt kajii_lemon.txt kajii_sakurano_kino_shitaniwa.txt
Crescendo      0.02675013               0                                 0
HOUSE          0.00000000               0                                 0
RESTAURANT     0.00000000               0                                 0
WILDCAT        0.00000000               0                                 0
、             0.00000000               0                                 0
ー             0.00000000               0                                 0
ぁ             0.00000000               0                                 0
あい           0.00000000               0                                 0
あいだ         0.00000000               0                                 0
あいつ         0.00000000               0                                 0
           miyazawa_chumonno_oi_ryoriten.txt miyazawa_dongurito_yamaneko.txt
Crescendo                         0.00000000                               0
HOUSE                             0.01984265                               0
RESTAURANT                        0.01984265                               0
WILDCAT                           0.01984265                               0
、                                0.00000000                               0
ー                                0.00000000                               0
ぁ                                0.00000000                               0
あい                              0.00000000                               0
あいだ                            0.00000000                               0
あいつ                            0.01984265                               0
           miyazawa_kiirono_tomato.txt niimi_gongitsune.txt niimi_okano_dozo.txt
Crescendo                   0.00000000                    0          0.000000000
HOUSE                       0.00000000                    0          0.000000000
RESTAURANT                  0.00000000                    0          0.000000000
WILDCAT                     0.00000000                    0          0.000000000
、                          0.00000000                    0          0.008248387
ー                          0.00000000                    0          0.006270321
ぁ                          0.01105975                    0          0.000000000
あい                        0.00000000                    0          0.008248387
あいだ                      0.00000000                    0          0.008248387
あいつ                      0.00000000                    0          0.000000000
           niimi_tebukuroo_kaini.txt
Crescendo                  0.0000000
HOUSE                      0.0000000
RESTAURANT                 0.0000000
WILDCAT                    0.0000000
、                         0.0000000
ー                         0.0272396
ぁ                         0.0000000
あい                       0.0000000
あいだ                     0.0000000
あいつ                     0.0000000

あまり特徴のない語句なので、数値もパッとしません。

ちなみに、いくつの語句(形態素)があるか確認しておきます。

nrow(novel)

実行結果です。

[1] 2832

2832 件あるようです。意外と少ないような気がします。

先ほど求めた TF-IDF の結果の行と列を転置します。

novel2<-t(novel)

これは実行結果を載せてもよくわからないだけなので、実行結果は割愛します。

次に、文書間の距離を求めます。とりあえずデフォルトのユークリッド距離としておきます。

dis<-dist(novel2)
dis

計算されたユークリッド距離(変数 dis)を表示してみます。

                                  kajii_aibu.txt kajii_lemon.txt
kajii_lemon.txt                         1.105714                
kajii_sakurano_kino_shitaniwa.txt       1.305338        1.312821
miyazawa_chumonno_oi_ryoriten.txt       1.329554        1.312851
miyazawa_dongurito_yamaneko.txt         1.345855        1.339584
miyazawa_kiirono_tomato.txt             1.273333        1.228148
niimi_gongitsune.txt                    1.333678        1.323934
niimi_okano_dozo.txt                    1.345069        1.351200
niimi_tebukuroo_kaini.txt               1.345588        1.331810
                                  kajii_sakurano_kino_shitaniwa.txt
kajii_lemon.txt                                                    
kajii_sakurano_kino_shitaniwa.txt                                  
miyazawa_chumonno_oi_ryoriten.txt                          1.356279
miyazawa_dongurito_yamaneko.txt                            1.361794
miyazawa_kiirono_tomato.txt                                1.343117
niimi_gongitsune.txt                                       1.358633
niimi_okano_dozo.txt                                       1.364801
niimi_tebukuroo_kaini.txt                                  1.365800
                                  miyazawa_chumonno_oi_ryoriten.txt
kajii_lemon.txt                                                    
kajii_sakurano_kino_shitaniwa.txt                                  
miyazawa_chumonno_oi_ryoriten.txt                                  
miyazawa_dongurito_yamaneko.txt                            1.307178
miyazawa_kiirono_tomato.txt                                1.266411
niimi_gongitsune.txt                                       1.309118
niimi_okano_dozo.txt                                       1.347234
niimi_tebukuroo_kaini.txt                                  1.335098
                                  miyazawa_dongurito_yamaneko.txt
kajii_lemon.txt                                                  
kajii_sakurano_kino_shitaniwa.txt                                
miyazawa_chumonno_oi_ryoriten.txt                                
miyazawa_dongurito_yamaneko.txt                                  
miyazawa_kiirono_tomato.txt                              1.318479
niimi_gongitsune.txt                                     1.341822
niimi_okano_dozo.txt                                     1.360197
niimi_tebukuroo_kaini.txt                                1.360189
                                  miyazawa_kiirono_tomato.txt niimi_gongitsune.txt
kajii_lemon.txt                                                                   
kajii_sakurano_kino_shitaniwa.txt                                                 
miyazawa_chumonno_oi_ryoriten.txt                                                 
miyazawa_dongurito_yamaneko.txt                                                   
miyazawa_kiirono_tomato.txt                                                       
niimi_gongitsune.txt                                 1.306458                     
niimi_okano_dozo.txt                                 1.349001             1.330931
niimi_tebukuroo_kaini.txt                            1.325912             1.305905
                                  niimi_okano_dozo.txt
kajii_lemon.txt                                       
kajii_sakurano_kino_shitaniwa.txt                     
miyazawa_chumonno_oi_ryoriten.txt                     
miyazawa_dongurito_yamaneko.txt                       
miyazawa_kiirono_tomato.txt                           
niimi_gongitsune.txt                                  
niimi_okano_dozo.txt                                  
niimi_tebukuroo_kaini.txt                     1.373620

改行があるために見にくいですが、kajii_aibu.txt と kajii_lemon.txt との距離は 1.105714 というように、列と行の交差した箇所に距離が表示されています。

次に、クラスタリングをします。といっても hclust() を使ってしまうと簡単にできてしまいます。

hc<-hclust(dis,"ward.D2")

第2引数で ward.D2 としていますが、クラスタリングの際の距離の比較方法には、いろいろあるようです。

わかりやすかったサイトへのリンクを貼っておきます。

この実行結果を表示しようと試みたのですが、わかりやすくできません。もう少し、R を使い込まないと・・・

それでは、図示してみます。

ggdendrogram(hc,rotate=TRUE)

このような図が描けました。

少し見にくいのですが、比較的同じ作者の作品同士が近い距離にあるようです。

中身は薄いのですが、案外長くなったので、今回はこれでおしまいにします。それではまた。

Posted by kasugai