220
0
0

Pythonを使ったtwitter APIによるデータ取得と感情分析

Published at January 30, 2022 4:01 a.m.
Edited at January 30, 2022 4:05 a.m.

twitterの投稿を集めてトレンドを分析したい

twitterの投稿からプラス、マイナスのコメントを分離して分析したい

こういった状況で使える手法について、Pythonで実際に動作するプログラムを使って解説したいと思います。

目次

  1. 本ページのゴール
  2. Pythonによるtwitter APIを使ったtweet取得
  3. 感情分析
  4. tweetデータの感情分析
  5. まとめ

本ページのゴール

twitter投稿を集める方法、テキストマイニングの手法を使って簡単に感情分析を行う方法についてtwitter API、sentiment_jaを使って扱えることを目指します。


Pythonによるtwitter APIを使ったtweet取得

今回は、twitter 開発者ページ(Twitter Developer Portal)に登録して、API key等を取得し、その情報をtweepyに設定してtweetデータを取得します。なお、本ページで掲載する方法はTwitter API v2に対応したものとなります。

API key等の取得

2022年1月現在、tweepyを使ってtwitter APIにアクセスするには、以下の情報が必要になります。

  • API Key
  • API Key Secret
  • Access Token
  • Access Token Secret
  • Bearer Token

いずれもTwitter Developer Portalから取得できますのでアカウント登録して発行してください。API keyの取得は、Twitterデベロッパーアカウントの申請方法【Twitter API 申請】(https://irucabot.com/blog/twitterapi/developer_request/)参考にしてください。

tweepy実行によるtweetsデータの取得

今回はPythonからTweetデータを取得する方法の中で最もメジャーなtweepyを使った方法を紹介します。

まずは実行に向けた準備としてpip install tweepyを実行してライブラリをインストールしてください。その次に、以下のプログラムで事前に取得したAPI KeyやAccess Tokenをセットし、実行してみてください。

実行フォルダにTweetsdata.csvというファイルができ、メタバース関連のtweetを取得できていたら成功です。検索ワードを変える場合、q = "メタバース"という部分を変えます。このほか、countの数値を変えることで取得するtweet数を変更することもできます。

tweet取得コード
import tweepy
import csv

API_Key     = "(Your Consumer API Key)"
API_Sec     = "(Your Consumer API Key Secret)"
Token       = "(Your Authentication Token)"
Token_Sec   = "(Your Authentication Token Secret)"
BEARER = "(Your Bearer Token)"

client = tweepy.Client(bearer_token=BEARER, consumer_key=API_Key, consumer_secret=API_Sec, access_token=Token, access_token_secret=Token_Sec)

# 検索ワード
q = "メタバース"
count=10
 
results=[]
 
tweets = client.search_recent_tweets(query=q, max_results = count)
tweets_data = tweets.data

if tweets_data != None:
    for tweet in tweets_data:
        obj = {}
        obj["tweet_id"] = tweet.id
        obj["text"] = tweet.text
        results.append(obj)
else:
    results.append('')
 
with open("Tweetsdata.csv", "w", encoding="utf-8") as f:
    writer = csv.writer(f,  lineterminator="\n")
    writer.writerow(results)

tweepyのClientメソッド説明

tweepyは、予め認証情報をセットしたclientを作り、そのClientでメソッドを実行する形で処理を行います。上記の例では、search_recent_tweetsを使いQueryに検索ワードをセットして、tweetを取得しておりました。search_recent_tweets以外の使えそうなメソッドを以下に紹介します。

概要 Tweepy利用メソッド
tweet検索 client.search_recent_tweets()
特定のtweet取得 client.get_tweet()
特定のUser情報取得 client.get_user()
いいねしたUser情報取得 client.get_liking_users()
リツイートしたUser情報取得 client.get_retweeters()
Userのフォロー情報取得 client.get_users_following()
Userのフォロワー情報取得 client.get_users_followers()

tweetオブジェクトの属性情報

サンプルプログラムでは、tweet_idというtweetをユニークに特定するIDとtextという実際のつぶやき内容が入っているtextという属性の値を取得していましたが、この他にcreated_at、author_id、public_metrics、context_annotationsなどの情報も取得できます。

twitterオブジェクトのモデル詳細は、 https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/tweet を参照ください。

その他属性情報を追加する際には、expansionsやtweet_fieldsにリスト形式で追加する必要があるケースもあるので、各メソッドの引数に注意してください( https://developer.twitter.com/en/docs/twitter-api/tweets/search/api-reference/get-tweets-search-recent


感情分析

Pythonで日本語による感情分析をTransformersで行う方法を紹介します。

準備

まずは、以下のプログラムが動作する状態を目指します。

テストプログラム
from transformers import pipeline 
from transformers import AutoModelForSequenceClassification 
from transformers import BertJapaneseTokenizer 
 
TARGET_TEXT = "誰でもできる感情分析です。簡単であるので、気軽に試してみましょう。"
 
model = AutoModelForSequenceClassification.from_pretrained('daigo/bert-base-japanese-sentiment') 
tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking') 
nlp = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer) 
 
print(nlp(TARGET_TEXT))

ここでtransformersがインストールされていない場合は
ModuleNotFoundError: No module named 'transformers'と表示されます。

この場合は、コチラ(https://self-development.info/huggingfaceのtransformersをインストールする/)のページを参考にtranformersのセットアップ(Jax、tensorflow, PyTorch)を進め、pipでtransformersをinstallしてください。

transformersのModuleNotFoundErrorの後、
ModuleNotFoundError: You need to install fugashi to use MecabTokenizer. See https://pypi.org/project/fugashi/ for installation.
と表示される場合、FugashiとFugashiから利用する辞書(ipadic)のpipも行います。

こうしてエラーを解消すると以下の結果が表示されるようになります。

結果
[{'label': 'ポジティブ', 'score': 0.9750074148178101}]

感情分析プログラムについて

今回、サンプルで提示したプログラムはBERTと呼ばれる自然言語理技術を使っております。BERTは2018年にGoogleが作成した機械学習プログラムとなります。

このBERTの機械学習モデルを読み込んでいる箇所は以下の部分です。

mosel
model = AutoModelForSequenceClassification.from_pretrained('daigo/bert-base-japanese-sentiment') 

また、tokenizerとして、文章の分かちがきを定義しているのは以下の部分です。

tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking') 

この2つ、学習モデルと分かち書きを合わせて使い、感情分析しているのが以下の部分になります。

nlp = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer) 
nlp(TARGET_TEXT)

環境準備は大変ですが、分析実行プログラムはとてもシンプルです。


tweetデータの感情分析

ここまで紹介した2つの方法をあわせて、tweetを感情分析します。

サンプルプログラム

Twitterから鬱というワードで直近10件のデータ取得を行い、ネガポジ判定したデータを出力
import tweepy
from transformers import pipeline 
from transformers import AutoModelForSequenceClassification 
from transformers import BertJapaneseTokenizer 

API_Key     = "(Your Consumer API Key)"
API_Sec     = "(Your Consumer API Key Secret)"
Token       = "(Your Authentication Token)"
Token_Sec   = "(Your Authentication Token Secret)"
BEARER = "(Your Bearer Token)"

client = tweepy.Client(bearer_token=BEARER, consumer_key=API_Key, consumer_secret=API_Sec, access_token=Token, access_token_secret=Token_Sec)

# 検索ワード
q = "鬱"
count=10
tweet_list=[] 
 
tweets = client.search_recent_tweets(query=q, expansions=['author_id'],tweet_fields=['created_at'],max_results = count)
tweets_data = tweets.data

if tweets_data != None:
    for tweet in tweets_data:
        obj = {}
        obj["text"] = tweet.text
        obj["author_id"] = tweet.author_id
        obj["created_at"] = tweet.created_at
        tweet_list.append(obj)
else:
    tweet_list.append('')


results=[]

model = AutoModelForSequenceClassification.from_pretrained('daigo/bert-base-japanese-sentiment') 
tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking') 
nlp = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer) 

for tweet in tweet_list:
    
    # tweet_text = tweet['text']
    tweet_text = tweet['text'].replace("\n", "")
    tweet_user_id = str(tweet['author_id'])
    tweet_date = str(tweet['created_at'])
    emotion = nlp(tweet_text)
    print(emotion[0])
    negaposi = emotion[0]['label']
    score = str(emotion[0]['score'])
    
    results.append(tweet_text + "," + negaposi + "," + score + "," + tweet_user_id + "," + tweet_date)

with open("Tweet_emotional_data.csv", "w", encoding="utf-8") as f:
    for line in results:
        f.write(line + "\n")

実行結果

直近のTweetデータを取得するため、正解データという訳にはなりませんが、以下のようなデータを取得できます。

CSVファイルの中身(一部マスク済み)
みんなどうやって生きる目的作ってるの?~~,ネガティブ,0.8555195331573486,1464382118318999999,2022-MM-DD 18:47:18+00:00
大学3年の時マジでヤバくて水道代電気代とか督促~~,ネガティブ,0.7794909477233887,10348179746101999999,2022--MM-DD 18:47:18+00:00
鬱ヌメルゴン可愛すぎんか???しぬ,ネガティブ,0.5491436123847961,1202110233247999999,2022--MM-DD 18:47:08+00:00
あーなんか久しぶりにめっちゃ鬱辛すぎる消えたい,ネガティブ,0.9651561379432678,1533999999,2022--MM-DD 18:46:40+00:00
9時間勉強してやりすぎてからやる気がなくなって~~,ネガティブ,0.7196342349052429,1472748895390999999,2022--MM-DD 18:46:31+00:00
ガラージュがスマホで出たのでずっとやりたい~~,ネガティブ,0.7324625849723816,2258999999,2022--MM-DD 18:46:30+00:00
あれ?嫌われてる鬱,ポジティブ,0.5559543371200562,1463881216172999999,2022--MM-DD 18:46:28+00:00
av見られんのまじ~~,ネガティブ,0.9780002236366272,1470790115874999999,2022--MM-DD 18:46:01+00:00
ちょっと原神やってたらこんな時間で~~,ポジティブ,0.8945760726928711,1247010882132999999,2022--MM-DD 18:45:57+00:00
鬱だねぇ,ネガティブ,0.5631640553474426,904216692812999999,2022--MM-DD 18:45:40+00:00

使い方

”メタバース”や"NFT"といったバズワードの傾向を探ったり、自社の商品を検索ワードにしてカスタマーの意見を拾ったり、競合の商品・サービスを入れて差別化要素を見出したり、活用の仕方は無限大です。


まとめ

今回、twitter APIをtweepyを使って呼び出し、tweetを取得する方法、およびBERTを使って感情分析する手法を紹介いたしました。

twitter APIはv2が標準になり、ネットに溢れている方法で上手く実行できず悩まれている方にとっては体系的に理解できる内容になっていると思います。また、取得したデータの感情分析を行うことで、ポジティブ、ネガティブな情報を分類して傾向分析することも可能になったと思います。

BERT環境(transformersが実行できる環境)を用意するために、なかなか骨が折れるのですが、用意さえできてしまえば、シンプルに実行できますので、ぜひ皆さまお試しください。