ブログ記事の日本語ワードクラウドレポート
次はワードクラウドレポートを作り、CodeZine上の当コーナー「Tech-Sketch」出張所の記事中の単語の出現頻度の可視化をしてみたいと思います。
今回は記事名をユーザーが選択できるパラメータとし、記事ごとの単語の出現頻度を見比べられるようにします。
ワードクラウドとは特定の単語について出現頻度の回数に応じて文字のフォントを大きくして、どの単語がよく出現するか可視化できる手法です。
まずはワードクラウドのイメージをつかむためにこちらをご覧ください。
上記のワードクラウドはロミオとジュリエット(Romeo and Juliet)の本の中に出てくる単語のワードクラウドですね。なんとなく、このワードクラウド中の単語からどのような物語なのか想像することができるのではないでしょうか。
サンプルコードの解説
ワードクラウドのサンプルアプリのコードを解説します。以下、記事中で紹介するサンプルコードは一部を抜粋したものです。完全な形で参照したい場合、こちらから確認することができます。
global.R
global.R
であらかじめ本の一覧をlist型で読み込んでいます。3冊ありますね。
books <<- list("A Mid Summer Night's Dream" = "summer", "The Merchant of Venice" = "merchant", "Romeo and Juliet" = "romeo")
getTermMatrix()関数の中で選択した本の内容、つまり、出てくる単語をファイルから読み込んでいます。
getTermMatrix <- memoise(function(book) { ……(中略)…… text <- readLines(sprintf("./%s.txt.gz", book), encoding="UTF-8") ……(中略)…… sort(rowSums(m), decreasing = TRUE) })
ui.R
ui.R
では以下の入力変数がパラメータとして定義されています。
- selection: 選択した本のタイトル
- freq: 出現頻度の下限値
- max: 最大単語数
sidebarPanel(width = 5, selectInput("selection", "Choose a book:", choices = books), actionButton("update", "Change"), hr(), sliderInput("freq", "Minimum Frequency:", min = 1, max = 50, value = 15), sliderInput("max", "Maximum Number of Words:", min = 1, max = 300, value = 100) ),
さらに、さきほど説明したクラスタリングのサンプルと異なり、本のタイトルを選択してもボタンを押すまでは関数を実行しないようにタイミングを制御しています。そのため、アクションボタンが以下の名前で定義されています。
- update: 更新ボタン
タイミングを制御しているのは、wordcloud()関数で処理するデータが多くなると、Shiny Serverでの処理負荷が高くなるので、関数を呼び出す回数をなるべく減らしたいからです。
つぎに、Main Panelに出力エリアが定義されています。
変数名は以下のとおりです。
- plot: ワードクラウド図
plotOutput("plot")
server.R
server.R
でワードクラウドを作成しています。
Rにはwordcloudというパッケージがあり、このパッケージにwordcloud()関数が用意されています。Rでワードクラウドを作るためにすることは、このパッケージをインストールして、Rのコンソールでwordcloud()関数を呼び出すだけです。
server.R
ではクラスタリングサンプル同様にui.R
から受け取った入力値をwordcloud()関数の引数として実行しています。
output$plot <- renderPlot({ v <- terms() wordcloud_rep(names(v), v, scale=c(4,0.5), min.freq = input$freq, max.words=input$max, colors=brewer.pal(8, "Dark2")) })
ただし、ここではwordcloud()関数をrepeatable()関数でラップしたwordcloud_rep()関数を定義して使っています。この理由は、wordcloud()関数をそのまま呼び出すと、呼び出すたびに乱数のseedが毎回変わってしまい、同じ本のタイトルを選択したとしても毎回の実行結果も変わってしまうからです。実行結果を毎回同じにする(再現性を持たせる)ためにwordcloud_rep()関数を使っています。
wordcloud_rep <- repeatable(wordcloud)
以上がサンプルコードの解説です。
「Tech-Sketch」出張所版ワードクラウドレポートの作成
上記で解説したサンプルコードをベースに少し手を加えて「Tech-Sketch」出張所のワードクラウドレポートにしてみたいと思います。
今回の「Tech-Sketch」出張所の記事のように日本語でワードクラウドを作成する場合、いくつか前処理が必要になります。日本語は英語と異なり、単語ごとに分かち書きされない言語であるため、そのまま単語を認識できません。そのため、MeCabなどの形態素解析エンジンを用いて単語(正確には形態素)ごとに分割する必要があります。
さらにその分割された単語をすべて使うのではなく、名詞のみ使います。その他にもストップワードを取り除いたり、表記ゆれを統一したりという処理も状況によっては実施します。
- 形態素解析
- 名詞抽出
- ストップワードの除去
- 表記ゆれの統一
ただし、今回のShiny記事の中で、これらの前処理についてすべて紹介することは難しいため、筆者であらかじめ前処理を行った状態のデータを使ってワードクラウドレポートを作ることにします。前処理済のデータはこちらに公開しています。これらの前処理について興味がある方は形態素解析などのキーワードを元に調べてみてください。たくさんの情報が見つかるはずです。
前処理データについて
「Tech-Sketch」出張所の記事ごとに、1つのTSV(タブ区切りフォーマット)ファイルにしています。
例えば、前処理済のデータを見てもらうと1列目が単語(word)、2列目が出現頻度(freq)というように単語毎の出現頻度データになっています。
これはShinyの前編の記事の出現頻度データになります。データから「shiny」、「server」という単語がよく登場していることが分かります。