ユニファ開発者ブログ

ユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。

WordCloudによるツイートの可視化

こんにちは、データエンジニアリングチームの宮崎です。 最近、趣味で言語処理について取り組みたくて、Twitter APIの利用に必要なTwitterの開発者アカウントを取得しました。 APIから取得した情報はブラウザで見るのとはまた見え方が違ってきて、分析すると色々面白そうな感じがします。

そこで、今回はWordCloudという、単語を出現頻度にしたがって大きく表示する手法を用いて、ツイートを可視化してみたいと思います。

Twitter開発者アカウントの取得

Twitter APIを利用するためには開発者アカウントの取得が必要となります。 開発者アカウントはhttps://developer.twitter.com/から取得できます。 検索すると、取得方法について解説されているページも多々ありますので参考になさってください。

ツイートの収集

無事にTwitter開発者アカウントを取得できると、Twitter APIを利用するためのAPI KeyやAccess Tokenなどを発行できます。 発行したAPI Keyを使って早速使ってみましょう。 今回は保育園というキーワードで検索してみたいと思います。

import requests_oauthlib

SEARCH_URL = 'https://api.twitter.com/1.1/search/tweets.json'
QUERY = '保育園'

API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxx'
API_SECRET_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
ACCESS_TOKEN = 'xxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
ACCESS_TOKEN_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

session = requests_oauthlib.OAuth1Session(
    client_key=API_KEY, client_secret=API_SECRET_KEY,
    resource_owner_key=ACCESS_TOKEN,
    resource_owner_secret=ACCESS_TOKEN_SECRET)

params = {'q': QUERY, 'count': 100, 'tweet_mode': 'extended'}
res = session.get(SEARCH_URL, params=params)
content = res.json()

content内に以下のような検索結果が取得できます。

{
    "statuses": [
        {
            "created_at": "Mon Mar 08 00:00:00 +0000 2021",
            "id": 1234567890123456789,
            "id_str": "1234567890123456789",
            "full_text": "保育園に送ってきました",
            ...
        },
        ...
    ],
    ...
}

WordCloudの作成において、ハッシュタグや、スクリーンネーム(ユーザ名)、絵文字などは対象外としたいため、得られたツイートから取り除きます。

import re

texts = []
for status in content['statuses']:
    text = status['full_text']
    if text.startswith('RT '):
        continue
        
    # ハッシュタグの除去
    text = re.sub(r'#[^ ]+ *', '', text)
    
    # スクリーンネームの除去
    text = re.sub(r'@[\w_]+ *', '', text)
    
    # URLの除去
    text = re.sub(r'https?://[\w/:%#\$&\?\(\)~\.=\+\-]+ *', '', text)
    
    # 絵文字などの除去
    text = re.sub(r'[^、。!?ー〜1-9a-zA-Zぁ-んァ-ヶ亜-腕纊-黑一-鿕]', '', text)
    
    texts.append(text)

あとはこれを何回か繰り返して、ツイートを収集します。 なお、Twitter APIには時間あたりの実行回数制限があるため、制限に引っかからないよう、間にsleepを挟んで実行してください。

ツイートから単語の抽出

集めたツイートの形態素解析を行い、単語を抽出します。形態素解析にはJanomeを使用しました。

from janome.tokenizer import Tokenizer
t = Tokenizer()
words = []
for text in texts:
    tokens = t.tokenize(text)
    for token in tokens:
        pos = token.part_of_speech.split(',')[0]
        if pos in ['形容詞', '動詞', '名詞']:
            words.append(token.base_form)

WordCloudの作成

いよいよ抽出した単語を元に、WordCloudを作成します。 その際、あるいるなど、情報量が少ない単語をストップワードとして、処理対象外に指定します。

from wordcloud import WordCloud

FONT_PATH = '/System/Library/Fonts/ヒラギノ角ゴシック W2.ttc'
STOPWORDS = ['ある', 'いい', 'いる', '思う', 'くる', 'くれる', 'こと', 'これ',
             'さん', 'する', 'せる', 'そう', 'てる', 'ない', 'なる', 'の',
             'みたい', 'やる', 'よい', 'よう', 'られる', 'れる', 'ん']

wordcloud = WordCloud(background_color='white', font_path=FONT_PATH,
                      stopwords=STOPWORDS)
wordcloud.generate(' '.join(words))
wordcloud.to_file('wordcloud.png')

こちらが作成されたWordCloudです。朝と夕方にツイートを収集したため、仕事, 行く, 時間など保育園の送り迎えに関連した単語の頻度が高いことがわかります。

f:id:unifa_tech:20210308110454p:plain
WordCloud作成結果

ソースコード

実行時のソースコードについては下記に格納しました。

github.com

まとめ

今回はTwitter APIを利用して収集したツイートをWordCloudで可視化しました。 言語処理の分野はTransformerによってここ数年でかなり進んだので、色々キャッチアップしていきたいと思います。


ユニファで一緒に働く仲間を募集しています!

unifa-e.com