R
自然言語処理
ワードクラウド
wordcloud2

Rのワードクラウドで審美的なアウトプット wordcloud2ライブラリの紹介

目的

Rのwordcloud2パッケージでワードクラウドを作成すると、日本語の文章でも大変美しいワードクラウドが描画できます。このパッケージを検証します。

美しいwordcluod2パッケージを使う

1. データ準備

サンプルデータとして、とある掲示板のとあるトピックの内容を1つにまとめたデータを使用しました。
RMeCabのdocMatrix2関数で、ファイルの文書を読み形態素解析し、名詞だけを抽出して、ターム・文書行列を作成します。
ファイル1つだけなので行列は1列になります

library(RMeCab)

file <-"topic_id_99999999" 

#docMatrix2関数で、文書fileのターム・文書行列を作成する。ここでは名詞だけに限定した。
#docMatrix2関数で、第1引数にファイルが渡された場合、ワードの頻度が1列目に入ったマトリクスが返される。
# フォルダが指定された場合、フォルダ内の各ファイル毎に列をとり、頻度が入ったマトリクスが返される。
tmpdf <-docMatrix2(file,pos=c("名詞"))

#データフレームに変換する
tmpdf<-as.data.frame(tmp_df)

#行名をtermという列に格納する。
tmpdf$term <- row.names(tmpdf)

colnames(tmpdf) <- c("Freq","term")

#列を、term,Freqの順に入れ替え
df <-tmpdf %>% dplyr::select(term,Freq)

#除外ワードファイルは、1列だけ
exclude_df <- read.table("stopword.tsv",header=T)
#リストにする。
exclude_word <- exclude_df$exclude_word

#除外するワードを除外する
df <- df %>% dplyr::filter(!(term %in% exclude_word)) 

dfは、ワード毎の頻度が格納されたデータフレーム

term Freq
ワード1 249
ワード2 64
ワード3 93

2.関数wordcloud2にワード、頻度の2列だけのデータフレームを渡す

library(wordclud2)
library(dplyr)

# wc_dfというデータフレームに、頻度の降順にソートする。
# データフレームのレコード数(ワード数)を上位100個までに絞る。
# wordcloud2関数に引き渡すデータの列の順番は、ワード、頻度、に合わせる。

wc_df <- df %>% dplyr::arrange(desc(Freq)) %>% head(100)

# size=1がデフォルト、minSizeは謎
wordcloud2(wc_df,size=1,minSize=0)

3. wordcloud2のアウトプット

こんな感じでできます。

全トピックのワードクラウド_名詞_st.png

4. wordcloud2の注意点 

ワード毎の頻度で、以下のように頻度に上位数個のワードとそれ以外とで著しい差がある場合、上位のワードはデフォルトのオプション指定だとワードクラウドに描画されません。

以下の例で検証します。
ワード毎の頻度分布

term Freq
ベビーカー 249
バス 93
抱っこ 64
子供 62
マナー 50
ママ 43
迷惑 41
(省略) (省略)

4.1. size=1の場合

「ベビーカー」がワードクラウドから漏れてしまっています。

wordcloud2(wc_df,size=1,minSize=0)

Wc_size1_minsize_0.png

4.2. size=0.7の場合

頻度が1位の「ベビーカー」が表示されます。これでは、2位以下のワードとのフォントサイズの差が激しいです。

wordcloud2(wc_df,size=0.7,minSize=0)

Wc_size_07_minsize_0.png

4.3. size=2の場合

フォントが大きくなります。上位の「ベビーカー」は描画に含まれません。

   wordcloud2(wc_df,size=2,minSize=0)

Wc_size2_minsize_0.png

4.4. size=3にした場合

最低の頻度のワードのフォントサイズが大きくなっています。「ベビーカー」は表示されません。

Wc_size3_minsize=0.png

4.5 オプションminSize

minSize=25とすると、下位のワードはワードクラウドから消滅します。しかし、ワード頻度が25以上のワードが描画されたわけではなく、上位25位のワードを描画したわけでもないようです。
minsizeは、パッケージヘルプによると
A character string of the subtitle
となっていますが、サブタイトルの文字列? ちょっと解せません。

githubに、wordcloud2.jsでは、「キャンバスに描画するフォントサイズの最小値」なので、上記「subtitle」の説明は間違ってるのでは?という問題があがっていました(https://github.com/Lchiffon/wordcloud2/issues/26)

とにかく、minSizeに任意の数値を指定すると「頻度が下位のワードはワードクラウドで可視化されなく」なります。minSizeの値が大きいほど、頻度が上位のワードだけが可視化の対象になりました。

wordcloud2(wc_df,size=2,minSize=25)

Wc_size_2_minsize_25.png

4.6 オプションgridSize

gridsizeを大きくすると、ワード間の間隔が大きくなります。

wordcloud2(wc_df,size=2.0,gridSize=8)

wc_gridsize_8.png

まとめ

Rでワードクラウドを作成するには、wordcloud2が素敵ですよ、という話でした。

参考にしたサイト

実行環境

> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Sierra 10.12.6