Python(BERT)でX(旧Twitter)の感情分析|手順やAPI v2の使用例、サンプルコードも

Python (BERT) でTwitterの感情分析|手順やTwitter API v2の使用例、サンプルコードも!

テキストマイニングをおこなう人にとって感情分析(センチメント分析)は興味関心度が高い領域でしょう。感情をデータ化して可視化できれば、以下のようなことが直感的にわかるようになります。

  • 特定のトピックスに対する世論がわかる
  • 自社の商品・サービスの評判やブランドイメージがわかる
  • 競合他社が高評価を博している施策を読み解ける
  • ユーザーの不満をいち早くキャッチして改善活動に生かせる

単純に分析・可視化するだけでも多くの情報が得られますが、感情データを機械学習することで多様なサービス展開に応用することも可能です。今回は、テキストデータから感情分析をおこなう部分に焦点を当てて解説します。

 

テキストデータの中でも、Twitterのツイートは「感情」の宝庫です。

 

X(旧Twitter)の投稿を集めてトレンドを分析したい

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

 

こういったニーズに応えるべく、Twitter API v2 と Pythonを掛け合わせたツイート取得&感情分析方法をわかりやすく解説してます。実際に動作するコードも掲載していますので、実際に試してみてください!

あわせて読みたい
https://minamolab.com/correspondence-analysis
あわせて読みたい

本記事のゴール

  • PythonとTwitter API v2を使ってTwitter投稿を集められるようになる
  • sentiment_jaを使って、感情分析を実行できるようになる
  • 実行結果をcsvファイルとしてエクスポートができるようになる


PythonとX(旧Twitter) APIでPost(Tweet)を取得する方法を解説

今回は、Twitter 開発者ページ(Twitter Developer Portal)に登録して、API key等を取得し、その情報をTweepyに設定してTweetデータを取得します。

なお、本記事で掲載する方法はTwitter API v2に対応したものとなります。

Twitter API keyを取得する

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

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

API keyの取得について、従来はTwitterデベロッパーアカウントを取得する必要がありましたが、現在は複雑な申請をすることなく利用できるようになりました。

Twitter Developerのサイトにアクセスし、下図記載の必要事項を入力するだけでOKです。

  • What's your name? → 任意の名前を入力(この項目は変更不可なので注意しましょう)
  • What country are you based in? → Japan
  • What's your use case? → Exploring the API
  • Will you ~~ entity? → No

この手順では以下のような制限があります。

  • 作成できるアプリケーションは1つだけ
  • Twitter API v2 エンドポイントのみ使用可能

機能をすべて使いたい人はTwitter Developper Portalのサイトから申請しましょう。本記事では手順を割愛します。

PythonでTweepyを使ってTweetデータを取得する

今回は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オブジェクトのモデル詳細は、Developerサイトを参照してください。

その他属性情報を追加する際には、expansionsやTweet_fieldsにリスト形式で追加する必要があるケースもあるので、各メソッドの引数に注意してください(参考)。

感情分析の事前準備

Pythonによる日本語の感情分析をTransformersで行う方法を紹介します。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'

と表示されます。

この場合は、こちらの記事を参考に Tranformers のセットアップ(Jax、tensorflow, PyTorch)を進め、pipでtransformersをinstallしてください。

Ttransformers の 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と呼ばれる自然言語理技術を使っております。

BERTは2018年にGoogleが作成した機械学習プログラムとなります。

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

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)

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

取得したツイートをPythonで感情分析する方法を解説

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

Twitter感情分析(センチメント分析)のサンプルコード

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

使い方

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



まとめ

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

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

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

単純なTwitter分析であれば公式のTwitterアナリティクスやSocialDogなどのサードパーティーツールを活用するのも一手です。

>>SocialDogの機能や評判、活用方法を解説|Twitter運用ツールはソーシャルドッグだけでOKです 

  • この記事を書いた人

みなも

データ分析に強くなるためのポイントを解説します。Excelを用いた統計分析や、テキストマイニングツール、BIツールの情報を中心にお届けします。

-テキストマイニング
-