Rでワードクラウドを作成してみる

使用したコードとテキストファイルを[GitHub](https://github.com/SotaNakazawa/WordCloud_by_R)にあげました。
#目標
RとTwitterAPIを使って以下のようなワードクラウドを描画することです。
![Zimin_Wordcloud.png](https://qiita-image-store.s3.amazonaws.com/0/127251/930c9959-d26e-93c3-3524-21759d33be98.png)
*Fig1.フォロワー数上位5人の自民党議員のツイートから作成したワードクラウド*

**自民党の話題の中心は未だに小池都知事なのか。**
**アメブロ好きだなこいつら。**

みたいな~~どうでもいいこと~~テキストデータの大まかな傾向や、分析対象の属性を見ることができます。

#準備
##TwitterAPIの登録
Twitterからツイートを取得するのに必要です。
登録方法などは下記のサイトを参考にしてください。
[Syncer - Twitter REST APIの使い方](https://syncer.jp/Web/API/Twitter/REST_API/)
##形態素解析機「MeCab」のインストール
日本語のテキストデータを形態素に分解するのに使用します。
今回はパッケージのRMeCab（後述）で使用するので、事前にインストールが必要です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/127251/49e0efac-7dcf-3614-f1b0-c8c120874967.png)
*Fig2.MeCabを使用した形態素解析（画像はRMeCabを使用）*

インストール方法は下記のページを参考にしてください。
Mac:[MeCabをMacにインストールする手順](http://qiita.com/ichiroex/items/c330413d5bc286df4801)
Win:[MeCabのWindows版をインストールしてみる](http://handsrecs2nd.seesaa.net/article/140090025.html)
##必要なRのパッケージ
インストール方法は割愛します。
・twitteR（R上でツイートの取得やデータの整形に使用）
・RMeCab（形態素解析をして頻度の抽出に使用）
・dplyr（Rでの作業を効率化するパワフルなパッケージ）
・wordcloud（ワードクラウドを作成するのに使用）
#実装
##ツイートの取得
###1.TwitterAPIのKeyとTokenを読み込ませる
まずtwitteRパッケージを呼び出します。
TwitterAPIの**Consumer Key**、**Consumer Secret**、**Access Token**、**Access Token Secret**をhogeの部分に入れて、適当な変数に代入しておきます。
次に、**setup_twitter_oauth()関数**の引数に先程のKeyとToken（の変数）を渡して、適当な変数に代入しておきます。

```R
library(twitteR)

consumerKey <- "hoge"
consumerSecret <- "hoge"
accessToken <- "hoge"
accessTokenSecret <- "hoge"
cred <- setup_twitter_oauth(
  consumer_key = consumerKey,
  consumer_secret = consumerSecret,
  access_token = accessToken,
  access_secret = accessTokenSecret
)
```
###2.ツイートを取得する
**userTimeline()関数**を用いて任意のアカウント(第1引数)からツイートをn個(第2引数)取得します。
アカウント名は**＠は不要**で、クォーテーションで囲みます（ここではダブルクォーテーション）。
取得ツイート数は3200が上限で、当然ですが増えるほど処理に時間がかかります。

```R
tweets_Abe <- userTimeline("AbeShinzo",500)
tweets_Koike <- userTimeline("ecoyuri",500)
tweets_Kono <- userTimeline("konotarogomame",500)
tweets_Katayama <- userTimeline("katayama_s",500)
tweets_Yamamoto <- userTimeline("ichita_y",500)
```

##データの結合
###1.データフレーム型に変換する
先程取得したツイートはリストですが、形態素解析を行うにはデータフレーム型（のテキストファイル）にする必要があります。
そこで、**twListToDF()関数**を用いてリストをデータフレームに変換します。

```R
TwGetDF_Abe <- twListToDF(tweets_Abe)
TwGetDF_Koike <- twListToDF(tweets_Koike)
TwGetDF_Kono <- twListToDF(tweets_Kono)
TwGetDF_Katayama <- twListToDF(tweets_Katayama)
TwGetDF_Yamamoto <- twListToDF(tweets_Yamamoto)
```

###2.結合して書き出す
**rbind()関数**を用いて、データフレームに変換したものを1つにまとめます。
そうしたら、**write.table()関数**を用いて一旦テキストデータとして書き出します。
第1引数がデータフレーム（変数名）、第2引数が書き出すファイル名になります。

```R
tweets_Zimin <- rbind(TwGetDF_Abe,TwGetDF_Koike,TwGetDF_Kono,
                      TwGetDF_Katayama,TwGetDF_Yamamoto)

write.table(tweets_Zimin,"Zimin.txt")
```
##情報の抽出
###1.形態素解析を行う
RMeCabパッケージを呼びだします。
次に**RMeCabFreq()関数**の引数に先程のテキストファイルを指定して、変数に代入しておきます。
これだけで単語への分かち書き、品詞情報、頻度が得られます。

```R
library(RMeCab)

frq_Zimin <- RMeCabFreq("Zimin.txt")
```

###2.情報を抽出する
dplyrパッケージを呼び出します。
私自身使いこなせてはいませんが、このパッケージは本当に便利です。
下記のページでわかりやすく解説されています。
[Qiita - dplyrを使いこなす！基礎編](http://qiita.com/matsuou1/items/e995da273e3108e2338e)

dplyrの**パイプ演算子 %>%** を用いることで左側の値を、右の関数の第1引数に直感的に渡すことができます。
ここでは `frq_Zimin` を**filter()関数**の引数として渡しています。
そして、 `frq_Zimin` 内のFreq列から頻度が30より大きく400未満のもの、Info1列から品詞が名詞、形容詞、動詞のもの、Info2列から数以外のものを抽出して、`frq2_Zimin` に代入しています。


```R
library(dplyr)

frq2_Zimin <- frq_Zimin %>% filter(Freq>30&Freq<400, Info1 %in% c("名詞","形容詞","動詞"), Info2 != "数")
```

##ワードクラウドの描画
###ワードクラウドを描画する
wordcloudパッケージを呼び出します。
そして**wordcloud()関数**を用いてワードクラウドを描画します。
引数で色々と細かく指定することが可能です。
以下[RDocumantation - wordcloud](https://www.rdocumentation.org/packages/wordcloud/versions/2.5/topics/wordcloud)より引用したものになります。

>```R
wordcloud(words,freq,scale=c(4,.5),min.freq=3,max.words=Inf,
	random.order=TRUE, random.color=FALSE, rot.per=.1,
	colors="black",ordered.colors=FALSE,use.r.layout=FALSE,
	fixed.asp=TRUE, ...)```

今回指定しているもののみ説明します
・`random.order＝FALSE`：FALSEで頻度順に中心から描画
・`color=rainbow(5)`:色を指定せずに5色使用
・`random.color=FALSE`:FALSEで色を頻度順に割当
・`scale=c(3,1)`:c(文字の大きさ,文字間隔）を指定
・`min.freq=90`:描画する単語の最低頻度の指定

```R
library(wordcloud)
wordcloud(frq2_Zimin$Term,frq2_Zimin$Freq,random.order=FALSE,
          color=rainbow(5),random.color=FALSE,scale=c(3,1),min.freq=90)
```
なお、ワードクラウドは実行するたびに結果が異なるので、何度も実行してみると違う傾向や気づきを得ることができるかもしれません。
また、`scale`の値と`min.freq`の値をいじることでも結果がかなり変わりますので、色々と試してみてください。

###wordcloudパッケージが読み込めない場合
`library(wordcloud)`を実行した際に、人によっては以下のようなエラーが出るかもしれません。
（私がそうでした）

>there is no package called ‘slam’
Error: package or namespace load failed for...

文言としては「slamパッケージなんてないよ」ということだと思うのですが、このslamパッケージが厄介。
`install.packages("slam")`では解決しなかったので、私の解決手順を書いておきます。
####1.Rのアップデート
slamパッケージが新しいバージョンにしか対応していないため。
参考：[R のアップデートメモ](https://ameblo.jp/mojio914/entry-12030044452.html)
####2.devtoolsパッケージによるslamのインストール
devtoolsパッケージをインストールした上で以下のコードを実行。

```R
library(devtools)

slam_url <- "https://cran.r-project.org/src/contrib/slam_0.1-40.tar.gz"
install_url(slam_url)
```

これでslamパッケージのインストールが完了して、wordcloudパッケージが呼び出せるはずです。
（Rアップデートした時点で`install.packages(slam)`ができる気がしなくもない)

##終わりに
今回は自分自身がRとTwitterAPIを用いてワードクラウドを描画したプロセスをそのまま記事にしました。
パッケージをふんだんに使うことで比較的かんたんにテキストマイニングを行うことできたかと思います。
私はそのことに感動したので、ぜひ多くの方に共有したいと思いました。
（実装よりもAPIやMeCabの準備、Rのアップデートなどの準備のほうが時間がかかるかもしれません）

ただ、間違っている部分や説明が十分でない部分、合理的でない部分もあるかと思います。
もしそういった部分や、他にも誤字脱字のある箇所にお気づきの方がいましたらご指摘いただけると幸いです。