Python stweet+WordCloud Twitterのトレンドを可視化してみた
Twitterの投稿内容をサードAPIで取得するライブラリstweetと、文中の出現頻度の高い単語を抽出して可視化するツールWordCloudを用いて、Twitterのトレンドを可視化してみました。
検索キーワードを変更することで、自分の取得したい情報を可視化して捉えることができるので、有用かと思います。
stweetを用いて投稿の情報を集める
最初にstweetをインストールする必要があります。
合わせて、stweetでは日付情報をarrowライブラリを用いて指定しますので、インストールしておきます。
!pip install stweet
!pip install arrow
ここでは、最近話題の「chatGPT」の情報を取得してみます。
時間単位でも指定したのですがうまく動かなかったので、日付指定は1日単位でしかできないようです。
後日、追加。stweetのサイト情報によると、2023年以降の投稿は時間指定が弾かれるようです。
Twitter in 2023 block in API putting time range in timestamp – only format YYYY-MM-DD is acceptable. In arrow you can only put time without hours.
取得した情報はjson形式で出力されるのですが、上書きでなく追記されていきますので、
最初に過去ファイルの削除を実施しておきます。
# Outputが追記方式のため、古いデータを削除
# windows
!del output_raw_*
# linux
#!rm output_raw_*
実際の取得するコードは以下の通り。設定などは、コメントで記載しておきます。
詳しくは、stweetの情報を参考にしてください。
import stweet as st
import arrow
# 検索ワード
key_words="chatGPT ニュース"
# and検索の場合
all_words=key_words
# or検索の場合
#any_words=key_words
# 検索範囲の時間
since = arrow.get("2023-04-04")
until = since.shift(days=+1)
# 検索範囲の言語
language=st.Language.JAPANESE
# オリジナルツイートのみ
replies_filter="ONLY_ORIGINAL"
# リプライのみ
#replies_filter="ONLY_REPLIES"
# stweetの実行
search_tweets_task = st.SearchTweetsTask(all_words=all_words, since=since, until=until, language=language, replies_filter=replies_filter)
output_jl_tweets = st.JsonLineFileRawOutput('output_raw_search_tweets.jl')
output_jl_users = st.JsonLineFileRawOutput('output_raw_search_users.jl')
# 処理中の出力
# すべて出力
#output_print = st.PrintRawOutput()
# 100処理ごとに出力
#output_print = st.PrintEveryNRawOutput(100)
# メモリに流す
output_print = st.CollectorRawOutput()
# 収集処理の実行
st.TweetSearchRunner(search_tweets_task=search_tweets_task,
tweet_raw_data_outputs=[output_print, output_jl_tweets],
user_raw_data_outputs=[output_print, output_jl_users]).run()
実行結果で、何件の投稿データが取得できたか表示されます。
実行して出力されたjsonファイルを読み込んで、結果を見てみます。
import pandas as pd
# 結果のツイートファイルの読み込み
json_open = pd.read_json("output_raw_search_tweets.jl", orient='records', lines=True)
for json_tmp in json_open["raw_value"]:
print(json_tmp["full_text"])
# WordCloud用にstr形式で出力結果を代入しておく
text = text + json_tmp["full_text"] + "\n"
参考までに、特定のユーザー名、特定のツイートIDの投稿を取得する方法もあります。
日付指定ができませんので、ユーザー名によっては大量のデータを取得することになるので、注意が必要です。
import stweet as st
import arrow
# 特定のユーザー名の投稿を取得する場合
user_task = st.GetUsersTask(['iga_swiatek'])
output_json = st.JsonLineFileRawOutput('output_raw_user.jl')
output_print = st.CollectorRawOutput()
st.GetUsersRunner(get_user_task=user_task, raw_data_outputs=[output_print, output_json]).run()
import stweet as st
import arrow
# 特定のツイートIDの投稿を取得する場合
id_task = st.TweetsByIdTask('1447348840164564994')
output_json = st.JsonLineFileRawOutput('output_raw_id.jl')
output_print = st.CollectorRawOutput()
st.TweetsByIdRunner(tweets_by_id_task=id_task, raw_data_outputs=[output_print, output_json]).run()
どちらも、一度実行しただけで深く試していません。あくまで、参考データとして載せておきます。
WordCloudで可視化する
以前のWordCloudの記事を参考に、下記のようにコードを記載します。
import requests
from bs4 import BeautifulSoup
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
from janome.tokenizer import Tokenizer
import re
#----Janomeによる形態素解析----
# Janomeの起動
t = Tokenizer()
# 1行ごとにJanomeの結果が入る
token = t.tokenize(text)
word_list = []
for line in token:
# スペース、カンマでデータを区切る
tmp = re.split('\t|,',str(line))
# tmpの長さが1未満の場合はスキップする
if len(tmp) < 2:
continue
# 名詞のみ、ワードを取り出す
if tmp[1] == '名詞':
word_list.append(tmp[0])
# word_listを文字列に変換する
word_chain = ' '.join(word_list)
#----WordCloudによる可視化----
# フォントの指定
font_path = "meiryo.ttc"
# 除外キーワード
stop_words_ja = ['もの', 'こと', 'とき', 'そう', 'たち', 'これ', 'よう', 'これら', 'それ', 'すべて','の','ん']
# 検索ワード、URLの情報が無駄に追加されているので、除外キーワードに追加
stop_words_ja_add_1 = key_words.split()
stop_words_ja_add_2 = ['t','https','co']
stop_words_ja.extend(stop_words_ja_add_1)
stop_words_ja.extend(stop_words_ja_add_2)
# 画像作成
wordcloud = WordCloud(width=800, height=600, font_path=font_path, background_color='white', stopwords=stop_words_ja, regexp="[\w']+").generate(word_chain)
# Wordcloudを表示
plt.figure(figsize=(8, 6))
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
# 画像保存
#wordcloud.to_file("result_wordcrowd.png")
この日のニュースで、
【東大、ChatGPTなど生成系AIに見解 「人類はこの数ヶ月でルビコン川を渡ってしまったかもしれない」】
と言うのがありましたので、反映できているのかと。
もっと上手にまとめることもできるかと思いますが、とりあえず、ここまで。