Amazon Comprehend を使って Twitter の名前部分に感情(絵文字)を表示する

こんにちは、@ketancho です。今日は Amazon Comprehend という AWS の自然言語処理サービスを使って Twitter ボットを作ってみたという話です。

Twitter の名前の部分に天気予報を表示してる方いらっしゃいますよね。ああいう形で何か名前のところで遊びたいなーと思っていまして、もし自分のそのときの感情を絵文字として表示したら、まわりの皆さんから優しくしてもらえるのではないかと思い、作ってみた次第です。イメージはこんな感じです。

f:id:ketancho_jp:20191112074125p:plain

元々 Amazon Comprehend が日本語対応されていなかったので Amazon Translate という翻訳サービスを噛ませるつもりだったのですが、ちょうど最近日本語にも対応したのでより使いやすくなりました。

作ったもののざっくり説明

ざっくりとした処理の流れとしては、

  • 定期的に Twitter API で直近かつ RT や Reply ではないツイートを取得
  • そのツイート文言を Amazon Comprehend で分析
  • 返ってきた Sentiment によって名前を Twitter API で変更
    • NEUTRAL: 🙂
    • POSITIVE: 😆
    • NEGATIVE: 🙁
    • MIXED: 😇

という形になります。

Sentiment については、4つの項目を数値で取得することもできるので、例えば POSITIVE と NEGATIVE の差が非常に大きければこの顔文字!といったことも可能です。詳細については 公式ドキュメント を見ると他にも色々なシーンで活用できそうです。

この実装を AWS Lambda 上で30分に1回動かすことで、定期的に名前を変更するようにしました。ソースコードは最後に載せます。

個人的メモ

この開発をしたときに調べたことをいくつかメモしておきます。

絵文字を Twitter に投稿/表示する

幾つか方法はありそうでしたが、unicodedata モジュールを利用することにしました。下記のような実装イメージになります。

import unicodedata

emoji = chr(128518)
params = {
    "name": "ketancho " + emoji + "|Kei Kanazawa"
}

絵文字のユニコードは こちら のサイトを参考にさせていただいた。

Twitter で直近かつ RT や Reply ではない自身のツイートを取得

下記の記事でまとめたので、よければご覧ください。

www.ketancho.net

Twitter アカウントの名前を変更する

こちらの公式ドキュメント を参考にして実装しています。 基本的には、ツイートの取得と変わりません。試していませんが Location や bio も更新できそうですね。また、update_profile_image の方を利用することで、アイコンも変えられそうです。アイコンを笑わせたり怒らせたりしてもいいかもしれません。

emoji = chr(128518)

url = 'https://api.twitter.com/1.1/account/update_profile.json'
params = {
    "name": "ketancho " + emoji + "|Kei Kanazawa"
}
req = twitter.post(url, params = params)

return req.status_code == 200

参考: ソースコード全体

あくまで参考としてご覧くださいー。今回は東京リージョンで Lambda Function を定義しているのですが、Amazon Comprehend は東京リージョンでは対応していません。そのため、シンガポールリージョンを region_name="ap-southeast-1" という形で指定している点だけご注意ください。

import os
import json
from requests_oauthlib import OAuth1Session
import unicodedata
import boto3

CK = os.environ['CK'] # * enter your Consumer Key *
CS = os.environ['CS']  # * enter your Consumer Secret *
AT = os.environ['AT'] # * enter your Access Token *
AS = os.environ['AS'] # * enter your Accesss Token Secert *

twitter = OAuth1Session(CK, CS, AT, AS)
comprehend_client = boto3.client('comprehend', region_name="ap-southeast-1")

def lambda_handler(event, context):
    newest_tweet = _get_newest_tweet()
    sentiment = _detect_sentiment(newest_tweet)
    _update_twitter_profile(sentiment)
    
def _get_newest_tweet():
    url = 'https://api.twitter.com/1.1/statuses/user_timeline.json'
    params = {
        "count": 1,
        "exclude_replies": True,
        "include_rts": False
    }
    req = twitter.get(url, params = params)

    if req.status_code == 200:
        newest_tweet = json.loads(req.text)[0]['text']
        return newest_tweet
    else:
        return req.status_code

def _detect_sentiment(newest_tweet):
    response = comprehend_client.detect_sentiment(
        Text=newest_tweet,
        LanguageCode='ja'
    )
    
    sentiment = response.get('Sentiment')
    return sentiment

def _update_twitter_profile(sentiment):
    if sentiment == "POSITIVE":
        emoji = chr(128518)
    elif sentiment == "NEGATIVE":
        emoji = chr(128577)
    elif sentiment == "MIXED":
        emoji = chr(128519)
    else:
        emoji = chr(128578)    
    
    url = 'https://api.twitter.com/1.1/account/update_profile.json'
    params = {
        "name": "ketancho " + emoji + "|Kei Kanazawa"
    }
    req = twitter.post(url, params = params)
    
    return req.status_code == 200

その他の参考情報

プログラムから Twitter API を利用するには、Twitter 側でアプリの登録および各種キーの取得が必要になります。やや UI が古くなっていますが、事前準備の部分は下記の記事をご覧いただければと思います。

www.ketancho.net

まとめ

最新のツイートから感情を絵文字で表示するようにしました。Amazon Comprehend 楽しいですね。これで私が喜んでいるか悲しんでいるか分かるはずですので、悲しんでいるときは優しくしてください☺ ちなみに運用して数日しか経っていませんが、いまだに MIXED な感情が現れてないので、もし見つけたら教えて下さい:)

f:id:ketancho_jp:20191113230730p:plain