10
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-02-05

目的

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
10
14
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?