PythonでTwitterから好きなトピックのトレンドを可視化してみた

2022.06.17

2022.06.20

Fabeee社員ブログ

PythonでTwitterから好きなトピックのトレンドを可視化してみた

はじめに

みなさん、はじめまして!
今年の4月よりFabeeeにジョインしたKyonsです。
前職ではテクニカルサポートとして活動していましたが、
Fabeeeではデータサイエンティストとして活動しています。
(ハイ、ミケイケンデス!!)
そんな駆け出しデータサイエンティストですが、外部データの分析をする機会がありました。
具体的には、Twitterから指定したトピックのトレンドを把握しよう!みたいな感じです。
そこで、今回はPythonを使ったTwitterの取得からトレンドの可視化までを紹介してみたいと思います。

トレンドの定義

まず、トレンドを可視化するためには「トレンド」とは何かを定義するところから始まります。
一般的には世の中で話題になっている事、つまり流行ですが、これを数値的にどのような状況になるとトレンドと言えるのかを具体的に定義する必要があります。
 
そこで今回は、下記のような状態をトレンドと定義しました。

  1. 集計期間のツイートに含まれる単語の出現回数が多い
  2. 他の期間では出現回数が低い
  3. 単語が複数のアカウントのツイートに含まれている

 
具体的な設定手順は以下です。(*期間やアカウント数は前提条件に記載)

  1. アカウント毎に一定期間のツイートを取得する
  2. それぞれ取得したツイートを特定の期間で分割する
  3. それぞれの分割期間毎にツイートに含まれる単語を抽出する
  4. 最新の期間で出現した単語と他の期間で出現した単語を比較し、最新の期間のみ出現した単語を抽出する
  5. 取得した単語を含んだツイートをしたアカウント数を算出する

前提条件と環境

【前提条件】
・ツイートの取得期間:1ヶ月
・分割期間:1週間
・アカウント数:10個
・トピック:コスメ

【環境】
・python : 3.10.4
・tweepy : 4.8.0
・mecab-python3 : 1.0.5
・wordcloud : 1.8.1

データの取得

まず今回トピックに設定した「コスメ」に関するツイートをメインに行なっているアカウントを「10個」選定します。
次にそれらアカウント毎に1ヶ月分のツイートを取得していきます。
ツイートの取得にはTwitterのAPIを利用します。
今回はPythonを使ってTwitter APIを利用するため、tweepyというSDKを用意します。
まず、API使うためにOAuth認証を行います。

API_KEY = ""
API_SECRET_KEY = ""
ACCESS_TOKEN = ""
ACCESS_TOKEN_SECRET = ""
auth = tweepy.OAuthHandler(API_KEY, API_SECRET_KEY)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)

次にツイートの取得を行います。

アカウント毎のタイムラインから取得するため、user_timeline()を使用します。

account = "取得したいアカウント名"
tweets = api.user_timeline(account)

これでアカウントの生データを取得できました!

前処理

先ほどの生データを解析しやすいように以下の手順で加工していきます。

  1. 各アカウントを1週間毎に分割する
  2. 1週間単位でアカウントを集計する

これで前処理の完了です。

形態素解析

前処理したデータを解析していきましょう。

単語の出現回数を算出するためにMeCabを利用します。
辞書は新語・固有表現に強いmecab-ipadic-NEologdを使います。

mecab = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')

今回は単純に単語を抜き出すということで、品詞が名詞のものを抽出して辞書を作成します。

word_dict = {}
text = "ツイートの本文"
node = mecab.parseToNode(text)
while node:
   word = node.surface
   hinshi = node.feature.split(",")[0]
   if hinshi == '名詞':
      if word in word_dict:
         word_dict[word] +=1
      else:
         word_dict.setdefault(word, 1)

   node = node.next

次に、最新の週とそれ以降の週を比較して最新の週のみに含まれている単語のみ抽出します。
単語のみの一致を確認すれば良いのでdict.keys()の差分で抽出します。

diff_dict = dict1.keys() - dict2.keys() - dict3.keys() - dict4.keys()

最後に1週目のみに出現した単語を含むツイートをしたアカウント数を算出します。
word_dictと同様にアカウント毎に単語単位の辞書(account_word_dict)を作成します。
account_word_dictdiff_dictを比較し各単語に対するアカウント数をカウントします。

これで可視化の準備がととのいました。

トレンドの可視化

抽出した単語に対してツイートしたアカウント数の大小が分かるように可視化してみます。
今回はWord Cloud(ワードクラウド)を利用します。
Pythonにもライブラリが用意されているのでそれを使います。
早速可視化してみましょう!

 

 

コスメには疎いのですが、ぽさはありますね。(豚バラ肉!?)

まとめ

いかがでしたでしょうか?
シンプルなロジックであっても見えてくるものはありそうですね!
ただ今回のロジックでは、アカウント選定が非常に大事ですが(アカウントの選び方で結果が大きく変わる)、手動で実施していたため、このフェーズも自動化していい感じのアカウント選定ができるようなロジックを組めればもっといい感じになりそうだなーと感じました。
もっと精進します!!

この記事の監修者:杉森由政

この記事の監修者:杉森由政

2018年2月Fabeee株式会社CTOに就任。現在は、新規事業開発部門の責任者を務めるともに、AIやブロックチェーンなどの先端技術を用いた研究開発も担当。また広島大学との連携研究においては、生体データを解析する人工知能および解析アルゴリズムの研究開発にも携わるなど、多岐に渡り活躍をしている。
>>プロフィール情報