LoginSignup
6
3

More than 3 years have passed since last update.

Rubyでワードクラウドを用いたTwitterトレンドの可視化

Last updated at Posted at 2019-06-21

はじめに

Twitterのトレンド一覧では、単語しか出てこず、一体何に関する話題なのか分からない。
ということで、トレンドからツイートを取得してワードクラウドを作成することで、一目でどんな話題で盛り上がっているのか可視化しようと思います。

せっかちな方のために、先に結果を載せときます。
トレンド"#きのう何食べた" に対する実行結果
#きのう何食べた

使用技術

Ruby: 2.4.1
Mecab: 0.996

Twitterからデータを取得

アクセストークンの設定

まず、Twitterにアクセスするためのトークンなどを設定します。

require 'twitter'
client = Twitter::REST::Client.new do |config|
    config.consumer_key        = "Consumer Key (API Key)"
    config.consumer_secret     = "Consumer Secret (API Secret)"
    config.access_token        = "Access Token"
    config.access_token_secret = "Access Token Secret"
end

参考
https://qiita.com/shimisunet/items/c3a0b93fb13fa82ed8be

トレンドの取得

次にトレンドを取得します。

client.trends_place(23424856).take(3).each do |trend| # 23424856:日本のtrend
    p trend.name
end

ツイートの取得

トレンドのツイートを取得します。

client.search(word, exclude: "retweets").take(count).each do |tweet|
    p tweet.text
end

前処理

取得したツイートに対し、

  • URLの除去
  • 分かち書き (Mecab)

を行います。

URLの除去

Rubyのuriパッケージを利用します。

require 'uri'
URI.extract(text).uniq.each {|url| text.gsub!(url, '')}

参考
http://thr3a.hatenablog.com/entry/20180315/1521079183

分かち書き

Mecabを利用して分かち書きをします。
副詞など、どのツイートにも出てきそうな単語は除去します。

require 'mecab'
tagger = MeCab::Tagger.new
wakati = tagger.parse(text)
wakati.delete!("EOS")  # 分かち書きの結果に"EOS"が出てくるため除去
wakati = wakati.split("\n")  # 単語ごとに分割
words = []
wakati.each do |w|
    word = w.split("\t")  # タブ文字前に単語、後に単語の情報があるため分割
    if word[1].include?("形容詞") || word[1].include?("名詞")
        unless word[0] == "#"  # "#"は名詞に分類されるため除去
            words.push word[0]
        end
    end
end

ワードクラウド作成

解析に入ります。
分かち書きの結果、トレンド内のツイートに出てくる単語を格納した配列を作成します。
それを元にワードクラウドを作成します。

magic_cloudの裏側ではImage Magickが動作しており、:font_familyに'Arial Unicode'を指定することで日本語に対応できます。(重要)

require 'magic_cloud'
font = 'Arial Unicode'
words =  words.group_by(&:itself).map{ |key, value| [key, value.count] }.to_h
cloud = MagicCloud::Cloud.new(words, rotate: :none, scale: :linear, :font_family=>font)
cloud.draw(500, 250).write("#{word}.png")

参考
Rubyで配列内の重複する要素を数える方法
https://github.com/zverok/magic_cloud

考察

2019年6月22日の夜ごろのトレンド"#きのう何食べた"に対して、以下の結果が得られました。
#きのう何食べた.png

とりあえず、どんな話題なのか読み取れそうです。
私の考察としては、

  • ドラマらしい
  • 来週最終回らしい
  • 個人的にはyajuが気になる。

といったところです。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3