からっぽのしょこ

読んだら書く!書いたら読む!読書読読書読書♪同じ事は二度調べ(たく)ない

【テキストマイニング入門】R言語でネットワークグラフを作成する【やってみた】

〇はじめに

 前回は文書中の単語ごとの出現頻度を計測しました。
www.anarchive-beta.com今回は視覚化していきます。前回のようにテキストを数値で捉えたものを、視覚的に捉えられる形式に加工します。具体的には、ネットワークグラフとワードクラウドを作成します。

・参考書籍
  • 『Rによるテキストマイニング入門』石田基広,森北出版株式会社
  • 『Rによるやさしいテキストマイニング』シリーズ,小林雄一郎,オーム社

〇やってみた

・分析対象データ
 前回と同様にモーニング娘。'18のシングル楽曲を利用します。ファイルの構成は以下の通りです。

  • ディレクトリ名はmor18
  • ファイル名:曲タイトル
  • mor18_65a.txt:A you Happy?
  • mor18_65b.txt:A ganna
  • mor18_66a.txt:フラリ銀座
  • mor18_66b.txt:自由な国だから
  • mor18_66c.txt:Y字路の途中

・ネットワークグラフの作成

 まずは、バイグラムを作成します。バイグラムとは2つの単語の繋がりの事です。例えば
「銀座の街をフラリ散歩しましょう」
という文を
「銀座」-「街」、「街」-「フラリ」、「フラリ」-「散歩」・・・(※名詞, 動詞, 形容詞をピックアップする場合)
というように、ある単語とその次にくる単語をセットにしていきます。今回は2語の繋がりに注目するのでバイグラム(2-gram)と言いますが、分析によっては3語以上の場合もあります。そのため語数に関わらず、単語の連なりをNグラム(n-gram)と呼びます。

library(RMeCab)
file_name1 <- "mor18_66a.txt"
file_path1 <- paste("mor18", file_name, sep = "/")
bigram1 <- docDF(file_path, type = 1, nDF = 1, N = 2, pos = c("名詞", "動詞", "形容詞"))

f:id:anemptyarchive:20181203225838p:plain
出現頻度上位10組程度
 バイグラムの頻度表ができました。続いてこれをネットワークグラフ化します。ネットワークグラフは、バイグラムを組み合わせることで単語の連なりを表します。プロットにはigraphパッケージを利用します。tkplot()でプロットしたグラフはマウスで操作することができます。

library(dplyr)
library(igraph)
bigram2 <- bigram1 %>% select(everything(), FREQ = file_name)
bigram3 <- bigram2 %>% select(N1, N2, FREQ)
network1 <- graph_from_data_frame(bigram3)
tkplot(network1, vertex.color = "SkyBlue", 
       vertex.size = 13, 
       vertex.label.cex = 0.75, 
       vertex.label.dist = 0,
       vertex.label.family = "JP1")

f:id:anemptyarchive:20181203230251p:plain
「フラリ銀座」のネットワークグラフ(名詞,動詞,形容詞)
 右上の赤丸の所から「銀座の街をフラリ散歩しましょう」という文が「銀座」→「街」→「フラリ」→「散歩」→「する」となっています。ちなみに、曲はこちらになります。曲を聴きながら追ってみると感覚的に理解できるのではないでしょうか。

 ネットワークグラフの雰囲気を掴んでいただけたでしょうか。それでは、全ての文書を統合してみましょう。

file_name2 <- list.files("mor18")
file_path2 <- paste("mor18", file_name2, sep = "/")
bigram4 <- data.frame()
for(i in 1:length(file_path2)) {
  tmp1  <- file_path2[i]
  tmp2  <- docDF(tmp1, type = 1, nDF = 1, N = 2, pos = c("名詞", "動詞", "形容詞"))
  tmp3  <- rename(tmp2, FREQ = file_name2[i])
  bigram4 <- rbind(bigram4, tmp3)
}
bigram5 <- bigram4 %>% 
           select(N1, N2, FREQ) %>%
           group_by(N1, N2) %>%
           summarise(FREQ = sum(FREQ))

f:id:anemptyarchive:20181204002202p:plain
出現頻度上位20組
 今回の例だと組み合わせが全部で約450組となりました。多すぎるとグラフがごちゃごちゃして分かりにくくなります。また、文書の特徴を捉えるのが目的であるため、出現頻度の少ない組み合わせは重要ではありません。なので、出現頻度に応じて剪定します。

bigram6 <- bigram5 %>% select(N1, N2, FREQ) %>% filter(FREQ >= 2)
NROW(bigram6)
network2 <- graph_from_data_frame(bigram6)
tkplot(network2, vertex.color = "SkyBlue", 
       vertex.size = 13, 
       vertex.label.cex = 0.75, 
       vertex.label.dist = 0,
       vertex.label.family = "JP1")

f:id:anemptyarchive:20181204005831p:plain
ネットワークグラフ(全文書)
 頻度を2回以上としたところ、組み合わせが約190組となりました。そのグラフになります。filter(FREQ = n)の数値を変えて調整してください。変更後の総数はNROW()で分かります。総数を減らしすぎると切れ切れのグラフになってしまいます。
 以上でネットワークグラフは完成です。ここからどのように解釈していくのかについては、また勉強した後にまとめます!

・ワードクラウドの作成

 次に、皆さん見る機会も多いかと思われるワードクラウドを作成します。プロットにはwordcloud2パッケージのwordcloud2()を利用します。

library(RMeCab)
library(dplyr)
library(wordcloud2)
file_name2 <- list.files("mor18")
file_path2 <- paste("mor18", file_name2, sep = "/")
wc1 <- data.frame()
for(i in 1:length(file_path2)) {
  tmp1 <- file_path2[i]
  tmp2 <- docDF(tmp1, type = 1, pos = c("名詞", "動詞", "形容詞"))
  tmp3 <- tmp2 %>% select(everything(), FREQ = file_name2[i])
  wc1 <- rbind(wc1, tmp3)
}
wc2 <- wc1 %>% select(everything()) %>% 
               group_by(TERM, POS1, POS2) %>% 
               summarize(FREQ = sum(FREQ))
wc3 <- wc2 %>% select(everything()) %>% 
               filter(FREQ >= 3)
NROW(wc3)
wc4 <- wc3[,c("TERM","FREQ")]
wordcloud2(wc4, size = 0.6, color = "random-light")

f:id:anemptyarchive:20181204020329p:plain
ワードクラウド(全文書)
 これまで同様に、RMeCabパッケージを用いて形態素解析を行った後に、プロットする基準とする頻度を変更して単語の総数を調整します。単語数が多いとうまくプロットできないようです。この例では約100語で作成しています。高頻度の単語ほどサイズが大きくなります。文字色はランダムです。

〇さいごに

 今回は、基本的な作成手法についてまとめました。途中にも書きましたが、理論的な話は今後の進捗次第です。記号や品詞の異なる英単語、その他不要な単語を剪定して、必要な単語のみを残すようなアレンジも今後まとめていく予定です。
 最後まで読んでいただきありがとうございました!次回は、出現する単語によって文書を分類する方法について書くつもりです。またよろしくお願いします。
www.anarchive-beta.com


2018.12.30追記:不要な単語を取り除きたい場合にはこちらの記事を参考ください。
www.anarchive-beta.com