【感情分析】PythonでIBM Tone Analyzerを使ってTwitter Streamingを感情分析してみた

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

PythonでIBM Language Translatorを使ってTwitter Streamingを翻訳してみた の続き。

今回の目的

今回の目的は、IBM Tone Analyzerを使って、Twitter Streaming APIを使って取得したつぶやきを感情分析してみる。

問題点

残念ながら、IBM Tone Analyzerは日本語対応していない。そのため、IBM Language Translatorで英訳したものを分析してもらう。

APIキー取得

1. カタログから、Tone Analyzerを選択。

2. サービスを作成

3. ユーザー名・パスワードを表示して控えておく。

環境構築とか

前回と同じ。

ソースコード

lib/tone_analyze.pyを作成する。

# -*- coding: utf-8-*-
from watson_developer_cloud import ToneAnalyzerV3 as ToneAnalyzer


class ToneAnalyze(object):

    def __init__(self):

        self.tone_analize = ToneAnalyzer(
            version="2017-09-21",
            username="**ユーザー名**",
            password="**パスワード**"
        )

    def analyze_text(self, text, content_type="text/plain;charset=utf-8"):

        tone = self.tone_analize.tone(
            tone_input=text,
            content_type=content_type
        )

        return tone


if __name__ == '__main__':

    tone_analyze = ToneAnalyze()

    print(tone_analyze.analyze_text(
        "Yay! I bought an Iphone! https://iphone.com"))

実行してみる。

{'document_tone': {'tones': [{'score': 0.896776, 'tone_id': 'joy', 'tone_name': 'Joy'}]}, 'sentences_tone': [{'sentence_id': 0, 'text': 'Yay! I bought an Iphone!', 'tones': [{'score': 0.896776, 'tone_id': 'joy', 'tone_name': 'Joy'}]}, {'sentence_id': 1, 'text': 'https://iphone.com', 'tones': []}]}

Joyと判定された!

Twitter Streamingで取得したツイートを翻訳する

main.pyを書き換える。

# -*-  coding: utf-8 -*-
import re
from datetime import timedelta

from lib.translate import Translate
from lib.tone_analyze import ToneAnalyze
import tweepy

customer_key = "CONSUMER KEY"
customer_secret = "CONSUMER SECRET"
access_token = "ACCESS TOKEN"
access_token_secret = "ACCESS TOKEN SECRET"


class Listener(tweepy.StreamListener):

    def on_status(self, status):

        translate = Translate()
        tone_analyze = ToneAnalyze()

        text = status.text

        if(re.search("[\u3041-\u3093]", text)):
            screen_name = status.author.screen_name
            created_at = status.created_at + timedelta(hours=9)

            translated_text = translate.translate_text(text)
            tone = tone_analyze.analyze_text(translated_text)

            print("------------------------------------")
            print("@{0} {1}".format(screen_name, created_at))
            print("ツイート: {0}".format(text))
            print("翻訳ツイート: {0}".format(translated_text))

            if not tone["document_tone"]["tones"]:
                print("トーンを判定できませんでした。")
            else:
                print("トーン: {0}".format(tone["document_tone"]["tones"][0]["tone_id"]))

        return True

    def on_error(self, status_code):
        print('Error: ' + str(status_code))
        return True

    def on_timeout(self):
        print('Timeout...')
        return True    


def main():

    # Twitterオブジェクトの生成
    auth = tweepy.OAuthHandler(customer_key, customer_secret)
    auth.set_access_token(access_token, access_token_secret)

    # Listenerクラスのインスタンス
    listener = Listener()

    # 受信開始
    stream = tweepy.Stream(auth, listener)
    stream.filter(track=["python"])  # 指定の検索ワードでフィルタ


if __name__ == '__main__':
    main()

以下、実行結果。

------------------------------------
@chocco110 2018-06-24 23:51:36
ツイート: 2時間弱~。レベルアップが楽しい~
Python 学習コース Ⅰを修了しました! https://t.co/HWZMzwXgBj #Progate
翻訳ツイート: It's just under two hours.I've completed the 'Python Learning Course I' ~ level-up! https://t.co/HWZMzwXgBj #Progate
トーン: tentative
------------------------------------
@wqv5mbs2 2018-06-24 23:52:36
ツイート: Pythonを使ってRospeexで音声合成してみた https://t.co/fz4SzW8r4x
翻訳ツイート: I tried to use Python to synthesized it on Rospeex, https://t.co/fz4SzW8r4x.
トーンを判定できませんでした。
------------------------------------
@okaimonoweb 2018-06-24 23:53:47
ツイート: 【PC・システム開発部門】現在売れ筋ランキング1位 [楽天市場の部]: Pythonデータサイエンスハンドブック Jupyter、NumPy、pandas、Matplotlib、scikit-learnを使ったデータ分析、機械学習… https://t.co/UFEumCSrpK
翻訳ツイート: [PC System Development Department] Current top-selling selling muscle ranking [Rakuten Market Division]: PythonData Science Handbook: Data Analysis using NumPy, NumPy, pandas, Matplotlib, scikit-learn to analyze data, machine learning ... https://t.co/UFEumCSrpK
トーン: analytical
------------------------------------
@umekichinano 2018-06-24 23:53:55
ツイート: Pythonで感情分析してみている。楽しい〜。
翻訳ツイート: I have an emotional analysis in Python.It's fun.
トーン: joy
------------------------------------
@san5w 2018-06-24 23:57:25
ツイート: Pythonの本、読書。
CSS書き書き。

#100DaysOfCode 8日目
翻訳ツイート: Python books, reading.
A CSS write.

#100DaysOfCode 8 days
トーン: joy
------------------------------------
@uowuow 2018-06-24 23:57:35
ツイート: 結構マイナーなファイル形式だと思うんだけど、BlenderファイルからPythonのバイトコンパイルファイルまでRenee Undeleterが対応しててすごいぞ
Rene.E LaboratoryにBlendererがいるのかな… https://t.co/pXznsghtzp
翻訳ツイート: I think it's a pretty mynament file format, but the Renee Undeleter can handle the Renee Undeleter, from the Blender file to the Python bytcompile file, and the Rene.E Laboratory has a Blenderer in the Rene.E Laboratory ... https://t.co/pXznsghtzp
トーン: joy