概要

Rでワードクラウドを生成するための自分用のメモ。時期が時期なので「クリスマス」という単語を含んだツイートをTwitter APIを通して取得し、ワードクラウドを生成した。Twitter APIの使い方に関してはここでは説明を省く。

ライブラリ読み込み

rtweetでやる方法もあるが今回はtwitteRを使う。

library(tm)
library(twitteR)
library(RMeCab)
library(dplyr)
library(ggplot2)
library(wordcloud2)
library(webshot)

Twitter APIとの連携

アプリの名前、鍵等の情報は公開できないので伏せます。

appname <- #アプリ名
ak = #アプリ鍵
ask = #アプリ秘密鍵
at = #アプリトークン
ats = #アプリ秘密トークン

setup_twitter_oauth(ak, ask, at, ats)

ツイートのスクレイピング。

(日本語で)“クリスマス”という単語を含んだツイートを3000件持ってくる。通常、Twitter APIは15分につき18,000件のツイートしか取得できないので注意1。またツイートは7日前のものまでしかスクレイピングできない仕様になっている2。経験上、Twitter APIの仕様はよく変わるので使用制限についても最新情報を確認しておくといい。

tweets <- twListToDF(searchTwitter("クリスマス", lang="ja", n=3000))

このtweetsは各ツイートのツイート主、ファヴォ数、ツイート内容などといった情報を含んだDataFrame。今回はwordcloudを作るだけなのでツイート内容しか使わないが、やろうと思えばツイートの位置情報を利用して空間分析などを行うことも可能。

データの精製

ツイートをそのまま引っ張り出すと、@や#などの数が圧倒的に多くなってしまうのでこういった「単語ではないもの」を全て空白で置き換える。

tweets <- twListToDF(searchTwitter("クリスマス", lang="ja", n=3000))
tweets$text <- gsub("https://.*", "", tweets$text)
tweets$text <- gsub("@", "", tweets$text)
tweets$text <- gsub("RT", "", tweets$text)
tweets$text <- gsub("#", "", tweets$text)
tweets$text <- gsub("\\(", "", tweets$text)
tweets$text <- gsub("\\)", "", tweets$text)

リツイートを含めると、同じツイートが何個も含まれてしまうのでリツイートじゃないものだけを取り出す。

tweets <- filter(tweets,isRetweet==FALSE)

RMecabを使ってツイート文から名詞だけを抽出

コメントアウトされている物をコメントインすれば名詞と動詞両方が抽出できる。

words <- list()
for ( tweet in tk$text ) {
  res <- unlist(RMeCabC(tweet),1)
  words <- c(words, res[names(res) == "名詞"])
  #words <- c(words, res[names(res) == "名詞" | names(res) == "動詞"])
}

テキストデータの整理

今回使うwordcloud2()は特殊な形のDataFrameしか受けつけてくれないので指定された形式にデータを変換する。1. 各言葉の出現回数をtables()で出力し、結果をdataframe型にする。この際、“Var1”列に言葉が、“Freq”列に言葉の出現回数が入力される。 2. wordcloud2は与えられたdataframeの“word”列と“freq”列を探すので、既存の列名をそれに変える。 3. 全ての単語を表示するとかなりの数になってしまうので、出現回数が5回を超えている単語のみを残す。この単語数は完全に肌感覚なので色々試すと面白い。

corpus_df <- as.data.frame(table(unlist(words)))
corpus_df <- corpus_df %>% rename( word = Var1, freq = Freq)
corpus_df <- filter(corpus_df, freq >= 15)

ワードクラウドは文字の出現頻度により文字サイズが変わるので、文字の出現頻度に大きな偏りがあった場合、かなり見づらいワードクラウドができてしまうことがある。出現頻度の対数を取ると(線形的に出現頻度を伝えることは難しくなるが)ワードクラウドの文字サイズにバランスが取れるようになる。

corpus_df$freq <- log(corpus_df$freq)

ワードクラウドの描写

wordcloud2を使って描写。テーマ色や背景色などは引数で変えることができる。 詳しくはここら辺を見ると分かりやすい:R graph gallery3, Wordcloud2 introduction4

wordcloud2(data=corpus_df2, color="random-light", size=1,backgroundColor = "black")

結果

幸せそうな言葉がたくさんあって心が暖まります。 一部絵文字や記号が混じっているのが気になったが、ツイート内容の簡単な可視化としては欲しいものが作れたので満足。

良いお年を。

注意:あくまでも個人的なプロジェクトだったので、コードを書く際に参考にしていた文献は完璧にはメモっていませんでした。ここに書かれた物はあくまでもこのrmdを書く時点で思い出せた物に限ります。


  1. Beck, M., “How to Scrape Tweets From Twitter”, towards data science, Jan. 2020, https://towardsdatascience.com/how-to-scrape-tweets-from-twitter-59287e20f0f1

  2. 1に同じ

  3. “The Wordcloud2 library”, the R Graph Gallery, 2018,https://www.r-graph-gallery.com/196-the-wordcloud2-library.html

  4. “Wordcloud2 introduction”, cran r-project, Jan. 2018, https://cran.r-project.org/web/packages/wordcloud2/vignettes/wordcloud.html