しおしお おしお

びぼーろくなど

R言語:wordcloud2でワードクラウド

ツイッターでこんな記事が流れてきた

ので、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)

やること

  1. RMeCab(MeCab)で適当なテキストを形態素解析して、単語ごとに出現頻度を集計
  2. 集計結果をwordcloud2にぶっこむ
  3. かっちょいいワードクラウドが描ける
  4. めっちゃうれしい

準備

  • 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

何も指定しないと色は勝手に振られます。
何も指定してないので、色と配置は実行ごとに変わります。
f:id:mildshio:20180624203201p:plain

キャラ設定.txt

こっちのほうが妖々夢っぽい単語が出てきてる感。みっちり出てきました。
f:id:mildshio:20180624203217p:plain

何か忘れてない?

wordcloud2の実行結果を任意のpngファイルの形に切り抜くやつ

まだできていないですorz
原因もわからなくて現状ではお手上げ状態。*5
ちなみに、以下は試したけどだめでした

  • demoFreq(wordcloud2パッケージに入っているTermとFreqのデータセット)の利用
  • demoFreqを利用してのlettercloud(公式ドキュメントのまんまを入力)

雑多な感想

  • 形態素解析のけの字も知らない人間が、下手の物好きでやってみた割にはそれっぽいのが描けて満足
  • データフレームに対する抽出・削除処理がうまくいかなくてハマりました。しつこいくらいに行名ソートして解決しました。
  • 魔理沙が魔と理沙で分かち書きされてるのウケる
  • アルティメットトゥルースとかネクロファンタジアが名詞として認識されててしゅごい(カタカナひとつづきは1つの名詞とみなすっぽい?)
  • 助詞と記号を指定して一括削除するのは気が引けた*6
  • でも助詞は除外してもよかったかもしれない*7
  • wordcloud2の実行結果を任意のpngファイルの形に切り抜くやつはちゃんとやりたい

とりあえずこうやってアウトプットまでこぎつけられたので、ひとまずは満足満足

*1:twitterでわさわさやってたやつのまとめ

*2:詳細は割愛します。私にはここですらかなりの重労働だった…

*3:そしてここでも行番号振り直し

*4:とりあえず出ればいいやの精神のため、行番号指定で除外してます。

*5:できたら書きます。たぶん。

*6:例:?まで除外するのはなんだかなあ

*7:明らかに文章の要約にかんけいない「か」がでかでかと出てるのはなんだかなあ