はじめに
こんにちは。WEBサービス開発グループ2019年新入社員のユと申します。
今回はRを使ってワードクラウドを作ってみようと思います。
もう知っている方も多いと思いますが、Rは統計・データ分析などに使われる言語で公式サイトでは
Rは統計計算とグラフィックスに活用する無料のソフトウェア環境
R is a free software environment for statistical computing and graphics
と紹介しています。
今回、このRを使って作るワードクラウドは以下の写真のような単語集めのイメージのことです。
このような画像、もしくはこのようなWebページを作ることができます。
上はトランプ大統領の就任演説の日本語訳を分析し、作ったワードクラウドです。
文書で出現した単語の回数が多いほど、単語の大きいさが大きくなります。
こういったデータ可視化はデータの理解をしやすくしてくれる役割をします。
必要なソフトウェア環境
以下の四つをインストールしてください。
- R:統計とグラフの操作のためのインタプリタプログラミング言語です。
リンクに入りWindowsのBaseをダウンロードしてください。
- Rtools(Windows): Rを使う時、色んな機能を提供するツールです。
インストール中、パスはチェックを入れてください。 - R Studio:Rを使うときに有用なエディタです。
- MeCab:日本語の分析を手伝ってくれるライブラリであるRMeCabを
使うためのソフトウェアです。Bainary package for MS-Windowsを
ダウンロードしてください。Encoding設定はShift-jisをお勧めします。
Rtools以外はデフォルトにしてインストールしてください。
基本設定
上記のインストールが終わりましたら、RStudioを管理者権限で起動した後、
上のメニューのToolsのGlobal Optionsに入ってください。
まず、GeneralメニューでRのパスを設定します。その下はWorkplaceを設定するところです。
その後、CodeのSavingのTabに入ってEncodingの設定を確認してください。
設定は完了です。上の File>NewFile>R Script を選択し、プロジェクトを作りましょう。
画面内の説明を簡単にすると
1はコードを入力するところです。Rのコードを書いてCtrl+Enterで1行ずつ実行させることができます。
2は実行の結果が表記されるConsole画面です。
3は今メモリに保存されている変数やデータを表記してくれるEnvironment情報を見せてくれる画面です。
4ではWorkspaceの状況・作ったデータのイメージなどを見ることができます。
例えば
左上でStartの変数を作り、”Hello! R World!”を代入しました。
Rでは行ごとにコードを実行させることができます。
1行に入力カーソルを載せてCtrl+Enterしてください。
その後、2番目のコードを実行させると、その結果が左下に表記されます。
同時にメモリに情報が保存され、右上に表示されます。
データ加工
必要なライブラリと分析するテキストダウンロード
Rではライブラリを以下のようにインストールします。
1 2 |
install.packages('libraryName') library('libraryName') |
Rではライブラリのインストールだけではなく、ライブラリをメモリ上に載せる必要があります。
メモリ上にあるライブラリのデータを利用して結果を返すような形をしてます。
データを加工するためには二つのライブラリが必要です。
まず、tidyverseを設置しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# ------------------ 実行するコード ------------------ install.packages('tidyverse') library('tidyverse') # ------------------ 無事設置が成功したら ------------------ # > library('tidyverse') # -- Attaching packages --------------------------------------- tidyverse 1.2.1 -- # √ ggplot2 3.2.0 √ purrr 0.3.2 # √ tibble 2.1.3 √ dplyr 0.8.1 # √ tidyr 0.8.3 √ stringr 1.4.0 # √ readr 1.3.1 √ forcats 0.4.0 # -- Conflicts ------------------------------------------ tidyverse_conflicts() -- # x dplyr::filter() masks stats::filter() # x dplyr::lag() masks stats::lag() |
tidyverseはデータ処理のためのライブラリを集めてある総合ライブラリです。
その次に必要なライブラリはRMeCabです。
1 2 |
install.packages(“RMeCab”, repos = “http://rmecab.jp/R”) library('RMeCab') |
RMeCabは日本語を形態素単位で分解してくれるライブラリです。
例えば「やったね、パパ 明日はホームランだ!」をRMeCabで分解すると
「やる(動詞)」+「た(助動詞)」+「ね(助詞)」+「、 (記号)」+「パパ(名詞)」+「明日(名詞)」+「は(助詞)」+「ホームラン(名詞)」+「だ(助動詞)」+「! (記号)」
という文章の構造と単語の品詞とその頻度が返ります。
これから名詞だけでワードクラウドを作りますので、このライブラリは必ず必要になります。
ライブラリの設置が完了したらこのテキストファイルをspeech.txtという名前でダウンロードしてください。
(平成31年1月28日 第百九十八回国会における安倍内閣総理大臣施政方針演説 | 令和元年 | 総理の演説・記者会見など | ニュース | 首相官邸ホームページ)
これは今年初の安倍内閣総理大臣のスピーチ資料です。ダウンロードし、上で設定したWorkspaceに置いてください。
分析しやすい型に変えます。
まず、RMeCabFreq関数を使ってspeech.txtデータを分析します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# ------------------ 実行するコード ------------------ sample <-RMeCabFreq("speech.txt") # ------------------ 読み込み成功 ------------------ # > sample <-RMeCabFreq("speech.txt") # file = speech.txt # length = 1602 # ------------------ 成功確認するために実行 ------------------ tail(sample) #------------------ 結果 ------------------ # > tail(sample) # Term Info1 Info2 Freq # 1597 その 連体詞 * 32 # 1598 どの 連体詞 * 1 # 1599 確固たる 連体詞 * 1 # 1600 輝ける 連体詞 * 1 # 1601 大きな 連体詞 * 24 # 1602 同じ 連体詞 * 1 |
tail関数は後ろからの行を持ってくる機能を持っています。
ここまで無事持ってくることができましたら、sampleデータをtibbleのデータ型に変えます。
tibbleはtidyverseライブラリで使うデータフレームです。
データフレームは簡単に説明するとRで使う、データベースのテーブルのようなものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# ------------------ 実行するコード ------------------ result <- sample %>% as_tibble result # ------------------ 型変換成功 ------------------ ## > sample %>% as_tibble # A tibble: 1,602 x 4 # Term Info1 Info2 Freq # <chr> <chr> <chr> <int> # 1 あら 感動詞 * 1 # 2 ありがとう 感動詞 * 1 # 3 A 記号 アルファベット 2 # 4 G 記号 アルファベット 1 # 5 I 記号 アルファベット 2 # 6 ・ 記号 一般 17 # 7 ゝ 記号 一般 1 # 8 ( 記号 括弧開 10 # 9 「 記号 括弧開 18 # 10 ) 記号 括弧閉 10 # # ... with 1,592 more rows |
ここでの「%>%」はパイプラインを意味します。
sampleのデータをパイプラインを通してsampleのデータをas_tribble()関数に渡すイメージです。
そのパイプラインの過程を終えてresultという変数にデータを入れます。
データで名詞だけ取ります。
この変換が終わりましたらまず、名詞だけとってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# ------------------ 実行するコード ------------------ result <- result %>% filter(Info1=="名詞") result # ------------------ 名詞のデータ取り成功 ------------------ # # A tibble: 1,206 x 4 # Term Info1 Info2 Freq # <chr> <chr> <chr> <int> # 1 お願い 名詞 サ変接続 1 # 2 お詫び 名詞 サ変接続 1 # 3 しわ寄せ 名詞 サ変接続 1 # 4 ふかん 名詞 サ変接続 2 # 5 アップ 名詞 サ変接続 1 # 6 カバー 名詞 サ変接続 1 # 7 サービス 名詞 サ変接続 1 # 8 スタート 名詞 サ変接続 3 # 9 ストップ 名詞 サ変接続 1 # 10 チャレンジ 名詞 サ変接続 1 # # ... with 1,196 more rows |
filterはtidyverseライブラリで使う関数で条件に合うデータを抜き出してくれます。
名詞の単語だけ抽出しました。それでも1196個のデータが存在します。
出現回数が低い単語・一文字の単語を排除します。
後で作るワードクラウドは入っている全てのデータを表示しようとしますので
1000個を超えるデータは逆に可視化しづらいです。
ですので、頻度が5以下のデータと数字のデータは除きましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# ------------------ 実行するコード ------------------ result <- result %>% filter(Freq>=5) %>% mutate(noun=str_match((Term), '[^0-90-9]+')) # ------------------ 結果 ------------------ # > result # # A tibble: 237 x 5 # Term Info1 Info2 Freq noun[,1] # <chr> <chr> <chr> <int> <chr> # 1 ・ 記号 一般 17 ・ # 2 ( 記号 括弧開 10 ( # 3 「 記号 括弧開 18 「 # 4 ) 記号 括弧閉 10 ) # 5 」 記号 括弧閉 18 」 # 6 。 記号 句点 319 。 # 7 記号 空白 144 # 8 、 記号 読点 576 、 # 9 ない 形容詞 自立 13 ない # 10 強い 形容詞 自立 6 強い # # ... with 227 more rows |
まず、filterで出現回数5以下のデータを除きます。
正期表現で数字のデータが入っているデータを除いた列をデータフレームに付けます。
mutateは新しい列を入れる時使う関数、str_matchはRで正期表現を使うときの関数です。
右上のEnvironmentを見ると、result変数には237個のデータが入っていることが分かります。
最初に比べて、データ数はかなり減りましたが、上記の結果を見るとまだ意味のない記号が入っていることが分かります。
そこで、文字列が2以上のデータだけに絞ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# ------------------ 実行するコード ------------------ result <- result %>% filter(str_length(noun[,1])>=2) # ------------------ 結果 ------------------ #> result # # A tibble: 156 x 5 # Term Info1 Info2 Freq noun[,1] # <chr> <chr> <chr> <int> <chr> # 1 ない 形容詞 自立 13 ない # 2 強い 形容詞 自立 6 強い # 3 新しい 形容詞 自立 9 新しい # 4 力強い 形容詞 自立 6 力強い # 5 から 助詞 格助詞 30 から # 6 といった 助詞 格助詞 5 といった # 7 と共に 助詞 格助詞 6 と共に # 8 について 助詞 格助詞 8 について # 9 によって 助詞 格助詞 11 によって # 10 により 助詞 格助詞 5 により # # ... with 146 more rows |
noun[,1]列の文字列の長さが2以上のデータだけとりました。
必要な単語と頻度データだけを取ります。
これから、ワードクラウドに入れるデータは頻度データと、名詞データだけ必要ですので
次は二つの列データを取って、見やすくするため頻度を基準に降順に並び変えてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# ------------------ 実行するコード ------------------ result <- result %>% select(5, 4) %>% arrange(desc(Freq)) # ------------------ 結果 ------------------ #> result # # A tibble: 100 x 2 # noun[,1] Freq # <chr> <int> # 1 こと 40 # 2 皆さん 33 # 3 たち 31 # 4 日本 30 # 5 ため 27 # 6 時代 22 # 7 社会 22 # 8 世界 21 # 9 経済 20 # 10 我が国 19 # # ... with 90 more rows |
select(5, 4)は5番目と4番目の列を取得する命令を表します。
かなり綺麗な結果が出ました。RMeCabが分類した名詞「こと・皆さん・たち・ため」はあまり意味のない単語です。この結果は除外しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# ------------------ 実行するコード ------------------ result <- result[-c(1,2,3,5),] # ------------------ 結果 ------------------ # # A tibble: 96 x 2 # noun[,1] Freq # <chr> <int> # 1 日本 30 # 2 時代 22 # 3 社会 22 # 4 世界 21 # 5 経済 20 # 6 我が国 19 # 7 世代 19 # 8 子ども 16 # 9 高齢 15 # 10 平成 15 # # ... with 86 more rows |
[-c(1,2,3,5),] は1・2・3・5番目の行を除きいて、全ての行列を入れることを意味します。
これでワードクラウド作りに使うデータの加工は終わりました。
次はワードクラウドを作ってみます。
ワードクラウド作り
ワードクラウドを作るためには、関連のライブラリが必要です。
1 2 |
install.packages('wordcloud2') library('wordcloud2') |
このライブラリのドキュメントはこちらで確認できます。
ライブラリのインストールが終わりましたら、
まず、上で作ったデータでワードクラウドを作ってみましょう。
1 |
result %>% wordcloud2() |
そしたら、右下のViewerにこういった画面がでるはずです。
デフォルトの設定でも充分綺麗ですが、もうすこし変えてみます。
まず、文字サイズを減らします。次は色は青く、斜めの文字は読み難いのでその辺も調整します。
また、ダイア模様も付けてみましょう。
1 |
result %>% wordcloud2(fontFamily='HG丸ゴシックM-PRO', color='skyblue', minRotation=0, maxRotation=0, size=0.5, shape='diamond') |
そしたらこのような結果が出ます。
ドキュメントを参考し作れば、こんな風に様々なスタイルを適用することができます。
この画像は標準で対応している機能機能のみで作りましたが、さらにカスタマイズしたい方はdevtoolsのlchiffon/wordcloud2を参考にしてください。
このように作られたワードクラウドはイメージ、もしくはHTMLのCanvasで作ったWebページでExportできます。
WebページとしてExportした場合、最初に見せたようなページが作られて、すこし手を加えればClickイベントなども付けることもできます。
最後に
ここまで、各ステップを丁寧に説明してきましたが、以下にまとめたコードでも同じ結果のワードクラウドを得ることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
install.packages('RMeCab', repos = "http://rmecab.jp/R") install.packages('tidyverse') install.packages('wordcloud2') library('RMeCab') library('tidyverse') library('wordcloud2') sample <-RMeCabFreq("speech.txt") result <- sample %>% as_tibble %>% filter(Info1=="名詞") %>% filter(Freq>=5) %>% mutate(noun=str_match((Term), '[^0-90-9]+')) %>% filter(str_length(noun[,1])>=2) %>% select(5, 4) %>% arrange(desc(Freq)) %>% filter(!noun[,1] %in% c("こと", "たち", "皆さん", "ため")) result %>% wordcloud2() |
フィルタリングが上手い人はこのコードよりも短くできると思います。
このようにRは上手く使えば、強力なツールになりますので活用して行きましょう。