Np-Urのデータ分析教室

オーブンソースデータなどWeb上から入手できるデータを用いて、RとPython両方使って分析した結果を書いていきます

【Rでテキストマイニング】他人のタイムラインをWord Cloudで可視化してみる

前回は、PythonからTwitter APIを叩き、スピードワゴンの小沢さんのツイートをWord Cloudを使って可視化してみました。
www.randpy.tokyo

この辺りの処理はRでも簡単にできるぞー!
ということで、今回はRでTweet取得&可視化に挑戦してみましょう。

このようなテキストマイニングについて詳しく知りたいという方は、以下の2冊がとても分かりやすくおススメです。

Rによるテキストマイニング入門

Rによるテキストマイニング入門

Rによるやさしいテキストマイニング: 機械学習編

Rによるやさしいテキストマイニング: 機械学習編

また、今回は選挙が近く色々動きがあるので、
・民進党代表:前原誠司さん(@maehara2016)
・日本維新の会:松井一郎さん(@gogoichiro)
のTwitter情報をもとに可視化を行ってみます。

ただ前回と同じように、対象ユーザーの過去ツイートを取得して可視化しても、新しさが無くつまらないと思うので、
対象ユーザーがTwitterで見ている景色、つまりタイムラインの可視化をしてみます。

このお二人がTwitterを開くとどんな情報が流れているのか?ちょっと気になりませんか?

本当は与党と野党ということで、安倍晋三首相と前原誠司さんのタイムライン比較を行いたかったのですが、安倍首相がフォローしているのは英語圏の方が多いのと、フォロー人数自体が少ないので方向転換をしました。

本記事はあくまでテキストマイニングの面白さを手法を伝えるための記事であり、なんらかの政治的メッセージを伝えるような意図はありません。
(ちょっと怖いので一応書いておきます。)

結果を先に

どんなものが完成するのか、イメージが事前にできていた方が良いと思うので、前原誠司さんのタイムラインを可視化したものを先にお見せします。

f:id:Np-Ur:20170930150856p:plain

この図は、前回記事で書いた通り以下を意味しています。

Word Cloudでは、頻出する単語ほど、つまり特徴的な単語ほど大きな文字で表示されます。

ということで、「小池」や「政府」、「国難」という言葉に交じり、「ベイズ」とか「ラビュタ」など意外なワードも入っていますね!

必要なライブラリやAPIの承認あたり

RからTwitter APIをあれこれするには

  • twitteR
  • rtweet

という2つのライブラリが有名です。しかし前者は廃止予定があるので、これから始める方は後者を選択するのが良いでしょう。

APIの認証とtwitteRとrtweetの簡単な使い方については、こちらをご覧ください。
www.randpy.tokyo

ライブラリですが、

library(rtweet)
library(tm)
library(RMeCab)
library(dplyr)
library(purrr)
library(stringr)
library(wordcloud)

これらを使います。もしまだインストールしていない方は、いつも通り

install.packages("wordcloud", dependencies = TURE)

というようにそれぞれインストールしておきましょう。

今回、ツイート情報を形態素解析(ざっくり言うと、文章を名詞や動詞、助詞などに分ける処理)にかけるのですが、王道のMecabを使います。

RからMecabを使うためには、Mecabをパソコンにインストールし、RMecabというライブラリを呼び出す必要があるのですが、「まだやったことない」という方は以下のサイトを参考にしてみましょう。

Windowsユーザーであればすぐ完了します。
https://sites.google.com/site/rmecab/home/install

コードを紹介

いつも通り、これから紹介するRのコードは以下のGithubに上げてあります。
github.com


まずライブラリ読み込みと、Twitter APIの認証がうまくいくかやってみましょう。

#ライブラリを使えるようにする
library(rtweet)
library(tm)
library(RMeCab)
library(dplyr)
library(purrr)
library(stringr)
library(wordcloud)

# 認証情報
CONSUMERKEY = "XXXXXXXX"
CONSUMERSECRET = "XXXXXXXX"
APPNAME = "XXXXXXXX"

twitter_token = create_token(
  app = APPNAME,
  consumer_key = CONSUMERKEY,
  consumer_secret = CONSUMERSECRET
)

CONSUMERKEY、CONSUMERSECRET、APPNAMEには、それぞれ自身の情報を入力してください。この辺りも
RからTwitter APIを叩くための基礎講座 ~認証からツイート取得まで~ - これで無理なら諦めて!世界一やさしいデータ分析教室に詳しく書いてあります。

ここまで実行すると、ブラウザが立ち上がり、「承認しますか?」のようなことを聞かれるので承認してください。

無事Twiiter APIが使える準備が整ったら、早速前原誠司さん(@maehara2016)のタイムラインを取得してみましょう。

なお、タイムラインの取得には、rtweetライブラリの「get_timeline」という関数を使います。
引数に「home = TRUE」を渡してあげると、さもそのユーザーでログインしたようにタイムラインが表示され、「home = FALSE」とするとそのユーザーの過去ツイートを取得することができます。

# @maehara2016のタイムライン取得
mehara_home_timeline = get_timeline("maehara2016", n = 200, home = TRUE, token = twitter_token)

# テキスト情報を取得
mehara_home_timeline_texts = mehara_home_timeline$text

# 日本語のみ抽出
mehara_home_timeline_texts_onlyJa = str_replace_all(mehara_home_timeline_texts, "\\p{ASCII}", "")
mehara_home_timeline_texts_onlyJa_shiftJis = mehara_home_timeline_texts_onlyJa %>% iconv(from = "UTF-8", to = "CP932") %>% na.omit()

# 200件のツイートを1つのテキストとしてまとめる
mehara_home_tweets_all = ""
for (i in 1:length((mehara_home_timeline_texts_onlyJa_shiftJis))){
  mehara_home_tweets_all = paste(mehara_home_tweets_all, mehara_home_timeline_texts_onlyJa_shiftJis[i], seq = "")
}

# あとで使えるように保存
write.table(mehara_home_tweets_all, "mehara_home_tweets_all200.txt")

はい、ここまでで@maehara2016のタイムライン情報を取得から、テキスト情報の保存まで完了しました。

ちなみに以下の処理ですが、文字コードの関係でWindowsユーザーの場合は必要ですが、Macユーザーはいらないはずです。

mehara_home_timeline_texts_onlyJa_shiftJis = mehara_home_timeline_texts_onlyJa %>% iconv(from = "UTF-8", to = "CP932") %>% na.omit()

ツイート取得できたのでWord Cloud可視化

ではここからツイートを形態素解析にかけ、名詞情報を取り出し、Word Cloud可視化を行います。

# 先ほど保存したテキストファイルから形態素解析実行
docDF_mehara = docDF("mehara_home_tweets_all200.txt", type = 1)
# 名詞情報かつ非自立でないものを抽出
docDF_mehara2 = docDF_mehara %>% filter(POS1 %in% c("名詞"), POS2 != "非自立") 

# Word CLoud実行
wordcloud(docDF_mehara2$TERM,docDF_mehara2$mehara_home_tweets_all200.txt, min.freq= 3, scale=c(6,1), family ="JP1"
          , colors = brewer.pal(8,"Dark2"))

簡単に解説をしていきます。

まず、RMecabライブラリのdocDF関数を使って形態素解析にかけます。
中身を確認したい場合は、例えば以下のように実行してみましょう。

> docDF_mehara[100:120,]
        TERM     POS1         POS2 mehara_home_tweets_all300.txt
100     いも     名詞         一般                             1
101     いや     名詞 形容動詞語幹                             1
102 いよいよ     副詞         一般                             1
103     いる     動詞         自立                             9
104     いる     動詞       非自立                            47
105 いろいろ     副詞   助詞類接続                             3
106 いろいろ     名詞 形容動詞語幹                             1
107 いろんな   連体詞            *                             3
108       う   助動詞            *                            30

こんな感じで文章が各品詞(POS1)と更に細かく分類した品詞情報(POS2)に分解されているの分かります。一番右は列名がファイル名になっていますが、テキスト内に現れた頻度を意味しています。

「いろんな」という連体詞は3回登場した、ということが分かります。

この中のすべてを使ってWord Cloudにかけてもよいのですが、「う」とかはちょっと意味が分かりませんよね?
そこで、filterをかけて、POS1が「名詞」でかつPOS2が「非自立」でないものに限定しています。

POS2に出てくる「非自立」や「助詞類接続」などはあまり馴染みがないと思います。以下のサイトでよくまとまっているので、気になるものがあったら確認しておきましょう。形態素解析ツールの品詞体系

さて少し長くなりましたが、ついにWord Cloudを生成する段階まできました!wordcloud関数では、

wordcloud("何をプロットするか", "何の数字をもとに大きさを変えるか",...)

という形で、プロット対象(今回は"TERM"列)と大きさを決定するための数値(今回は"mehara_home_tweets_all300.txt"列)を指定します。

全単語を表示すると数が多すぎて見にくいので、「min.freq」で出現した頻度がある数以上の要素のみプロットするように設定できます。
また、scaleではc("文字の大きさ", "文字の間隔")を指定することができます。

colorsでは用いる色の設定をすることができるので、お好きな色合いを試してみてください。

実行結果を確認

冒頭にも貼り付けましたが、前原誠司さんのタイムライン情報をWord Cloudによって可視化してあげた結果がこちらになります。
f:id:Np-Ur:20170930150856p:plain

「それ」や「これ」などの代名詞や「ー」などはフィルターで除外したほうがもっと良い結果が見えてきそうですね。
個人的には「ラビュタ」がツボでした笑


次に、前述したような処理を松井一郎さんのタイムライン情報でも行いました。
f:id:Np-Ur:20170930154425p:plain
こちらは先ほどの反省を踏まえ、「それ」「これ」といった代名詞を除外して表示しています。

「民進党」や「日本経済新聞」、「小池」という言葉が目立ちますね。

そして細かいところまで見ていくと...
こちらにも「ベイズ」と「ラビュタ」の文字を見つけることができました。

雑な結論

前原誠司さんと松井一郎さんのタイムラインでも、普段わたくしのような一般人が見ているようなラビュタに関するツイートがあるんですね!

そして、やはり統計に関するブログをやっている身ととしては、「ベイズ」も見過ごせません。

雑に結論をまとめると、
「ラビュタは国民みな大好き!」
「これからはベイズの時代!」
こんな感じでしょうか…笑

まとめ

今回は前回のPythonでWord Cloudを使った記事に続き、Rでもテキスト情報の可視化をやってみました。
前回と異なるのは、あるユーザーの見ているタイムラインを可視化してみたという点です。

もう一度言いますが、本記事はあくまでWord Cloud等によるテキストマイニングの面白さと実践方法を伝えるのが目的です。
政治的な目的はございません。

Word Cloudは実際に使ってみると、とても楽しいです!そしてとても簡単です!
是非Twitter情報に限らず、色々なテキストで実践してみてください!!