目的
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のアウトプット
こんな感じでできます。
4. wordcloud2の注意点
ワード毎の頻度で、以下のように頻度に上位数個のワードとそれ以外とで著しい差がある場合、上位のワードはデフォルトのオプション指定だとワードクラウドに描画されません。
以下の例で検証します。
ワード毎の頻度分布
term | Freq |
---|---|
ベビーカー | 249 |
バス | 93 |
抱っこ | 64 |
子供 | 62 |
マナー | 50 |
ママ | 43 |
迷惑 | 41 |
(省略) | (省略) |
4.1. size=1の場合
「ベビーカー」がワードクラウドから漏れてしまっています。
wordcloud2(wc_df,size=1,minSize=0)
4.2. size=0.7の場合
頻度が1位の「ベビーカー」が表示されます。これでは、2位以下のワードとのフォントサイズの差が激しいです。
wordcloud2(wc_df,size=0.7,minSize=0)
4.3. size=2の場合
フォントが大きくなります。上位の「ベビーカー」は描画に含まれません。
wordcloud2(wc_df,size=2,minSize=0)
4.4. size=3にした場合
最低の頻度のワードのフォントサイズが大きくなっています。「ベビーカー」は表示されません。
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)
4.6 オプションgridSize
gridsizeを大きくすると、ワード間の間隔が大きくなります。
wordcloud2(wc_df,size=2.0,gridSize=8)
まとめ
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