R言語:wordcloud2でワードクラウド
ツイッターでこんな記事が流れてきた
💬 fun code-through feat. rtweet and #tidytext!
— Mara Averick (@dataandme) 2018年6月22日
"Awesome Twitter Word Clouds in R" 👩🎨 @LittleMissData https://t.co/uWUGu6HSdj #rstats #dataviz #SoDS18 pic.twitter.com/DGznFOzA1W
ので、Rのwordcloud2はいいぞ、な個人的備忘録*1
この記事読むの面倒くさい
公式のドキュメントの説明が図までついてかなり充実してるのでそれを読めばいいと思うよ!!
Wordcloud2 introduction
環境
> sessionInfo() R version 3.4.2 (2017-09-28) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows >= 8 x64 (build 9200)
準備
- Rをインストール
- Rstudioをインストール
- RでパッケージRMeCab、wordcloud2をインストール
wordcloud2はCRANにあります。RMeCabは以下を参考にhttp://rmecab.jp/Rからインストール。
参考 qiita.com
- ワードクラウドのもとになるテキストを準備
今回は東方妖々夢のおまけ.txtとキャラ設定.txtを使いました。
(そのうち自分のtwitterからぶっこ抜いたテキストに差し替えたい…)
ほんだい
ソースコード
汚ソースコードですが自身の後学のため記録しておきます。
library("wordcloud2") library("RMeCab") #resultMcb <- RMeCabFreq("//hogehoge//hugahuga//東方妖々夢//キャラ設定.txt") resultMcb <- RMeCabFreq("//hogehoge//hugahuga//東方妖々夢//おまけ.txt") WC2 <- resultMcb[order(resultMcb$Freq, decreasing=T),] WC2 <- subset(WC2, Freq > 2) rownames(WC2) <- c(1:nrow(WC2)) WC2$rmWords = {(WC2$Term == " ")|(WC2$Term == "=")|(WC2$Term == "は")| (WC2$Term == "が")|(WC2$Term == "いる")|(WC2$Term == "の")| (WC2$Term == "を")|(WC2$Info1 == "記号")|(WC2$Term == "に")| (WC2$Term == "で")|(WC2$Term == "て")|(WC2$Term == "、")| (WC2$Term == "。")|(WC2$Term == "する")|(WC2$Term == "も")| (WC2$Term == "と")| (WC2$Info1 == "助動詞")|(WC2$Info1 == "*")} WC2 <- subset(WC2,rmWords == FALSE) rownames(WC2) <- c(1:nrow(WC2)) #WC2 <- WC2[c(1:16,18:196),] #WC2 <- WC2[c(1:15,17:193),] rownames(WC2) <- c(1:nrow(WC2)) wordcloud2(WC2[,c("Term","Freq")])
ソースコードについて
使うパッケージの読み込み
library("wordcloud2") library("RMeCab")
テキストを読み込んでMeCabに入れてます
#resultMcb <- RMeCabFreq("//hogehoge//hugahuga//東方妖々夢//キャラ設定.txt") resultMcb <- RMeCabFreq("//hogehoge//hugahuga//東方妖々夢//おまけ.txt")
resultMcbのなかみはこんな感じ
Term | Info1 | Info2 | Freq | |
---|---|---|---|---|
1 | なんか | フィラー | * | 1 |
2 | あら | 感動詞 | * | 1 |
3 | いやぁ | 感動詞 | * | 1 |
4 | まぁ | 感動詞 | * | 3 |
5 | ・ | 記号 | 一般 | 39 |
6 | ? | 記号 | 一般 | 20 |
7 | ! | 記号 | 一般 | 2 |
8 | 々 | 記号 | 一般 | 25 |
9 | ―― | 記号 | 一般 | 4 |
10 | ~ | 記号 | 一般 | 32 |
(後略)
出現頻度順(列:Freqが大きい順)にソートし、出現頻度が2以上の行を抽出
その後、行番号を振り直しています。
行番号を振り直さなかった際、このあとのワードクラウドが描けないことが頻発したので念の為振り直し
WC2 <- resultMcb[order(resultMcb$Freq, decreasing=T),] WC2 <- subset(WC2, Freq > 2) rownames(WC2) <- c(1:nrow(WC2))
いろいろと思うところあって単語等を除外
ORでつないでいるのでめっちゃ汚いですが、1条件を1行で処理すると、行番号のせいだかで除外できていないことがままありました。
1条件処理→行番号振り直し→1条件処理→…とやるのもアレなので、ORでつないでsubsetで当てはまらないものを抽出しました。*3
WC2$rmWords = {(WC2$Term == " ")|(WC2$Term == "=")|(WC2$Term == "は")| (WC2$Term == "が")|(WC2$Term == "いる")|(WC2$Term == "の")| (WC2$Term == "を")|(WC2$Info1 == "記号")|(WC2$Term == "に")| (WC2$Term == "で")|(WC2$Term == "て")|(WC2$Term == "、")| (WC2$Term == "。")|(WC2$Term == "する")|(WC2$Term == "も")| (WC2$Term == "と")| (WC2$Info1 == "助動詞")|(WC2$Info1 == "*")} WC2 <- subset(WC2,rmWords == FALSE) rownames(WC2) <- c(1:nrow(WC2))
ワードクラウドが描けない場合、原因になっている単語を(トライアンドエラーで)除外*4
#WC2 <- WC2[c(1:16,18:196),] #WC2 <- WC2[c(1:15,17:193),] rownames(WC2) <- c(1:nrow(WC2))
WC2の列TermとFreqを引数に、wordcloud2を描く
ここまで長かった…
wordcloud2(WC2[,c("Term","Freq")])
実行結果
おまけ.txt
何も指定しないと色は勝手に振られます。
何も指定してないので、色と配置は実行ごとに変わります。
キャラ設定.txt
こっちのほうが妖々夢っぽい単語が出てきてる感。みっちり出てきました。
何か忘れてない?
雑多な感想
- 形態素解析のけの字も知らない人間が、下手の物好きでやってみた割にはそれっぽいのが描けて満足
- データフレームに対する抽出・削除処理がうまくいかなくてハマりました。しつこいくらいに行名ソートして解決しました。
- 魔理沙が魔と理沙で分かち書きされてるのウケる
- アルティメットトゥルースとかネクロファンタジアが名詞として認識されててしゅごい(カタカナひとつづきは1つの名詞とみなすっぽい?)
- 助詞と記号を指定して一括削除するのは気が引けた*6
- でも助詞は除外してもよかったかもしれない*7
- wordcloud2の実行結果を任意のpngファイルの形に切り抜くやつはちゃんとやりたい
とりあえずこうやってアウトプットまでこぎつけられたので、ひとまずは満足満足