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に見解 「人類はこの数ヶ月でルビコン川を渡ってしまったかもしれない」】
と言うのがありましたので、反映できているのかと。


もっと上手にまとめることもできるかと思いますが、とりあえず、ここまで。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

17 − ten =