AIを使ってアンパンマンの正体を探る 2

AI

アンパンマンの感情

今回はAIを使ってアンパンマンの正体を探るのパート2です。

AIを使ってアンパンマンの正体を探る
アンパンマンは何者?日本国民であれば誰もが知っているであろうあの人気キャラクター。しかし、年齢などその素性はよくわかりませんね。今回はそんな彼の正体を暴いてみました。どうやって?今回の調査にあたって...

今回はアンパンマンの感情に焦点を当て、アンパンの発言がAIによってどのような感情に分類されるか調査します。

どうやって

今回も NTTグループが開発している自然言語処理技術である、 COTOHA API を利用し、その中の感情分析APIを利用しました。 このAPIは日本語で入力された文章を解析し、その文章の書き手の感情(ネガティブ・ポジティブ)を判定します。また、文章の中に含まれる「喜ぶ」「不安」「安心」などといった15種類の感情を分類・認識して出力します。

また、アンパンマンの名言を集めたこちらのサイトから、アンパンマンの発言をランダムに10件集め解析対象の文章としました。

名言リスト

  1. あきらめるもんか!最後まで頑張るんだ
  2. みんなが僕に勇気を、優しさをくれる
  3. 僕の強さは、僕だけのものじゃないんだよ
  4. みんなは僕が守る!守るために戦うんだ!!
  5. ドーリィちゃん、君は僕の中で生きているんだ。ずっとずーっと、一緒に
  6. 大丈夫だよ。みんなの胸に“こころの星”の光がある限り、この世界は輝き続ける
  7. 泣いている人、困っている人、お腹がすいた人、みんな僕の顔を食べると、ニコッと笑顔になるんだ。その笑顔を見るとね、嬉しくて僕も自然に笑顔になる。そしてね、ここ(胸)がとってもあたたかくなるんだ
  8. 高価な物でも心がこもっていないと貰った人は淋しいですもんね
  9. 困っている人を助けた時に、こころがあたたかくなって、そのときわかったんだ。僕が何のために生まれてきたのか、何をして生きていくか、何が僕の幸せかって
  10. 心で聴くんです。ジャムおじさんが言っていました。心で見て、心で聴けば、見えない本当のことがみえてくるんだって

やってみる

今回利用したクエリはこちらを参考にしています。


# reference https://qiita.com/aikawa4866/items/3bb21d24e9b06041c758

import os
import urllib.request
import json
import configparser
import codecs


# COTOHA API操作用クラス
class CotohaApi:
    # 初期化
    def __init__(self, client_id, client_secret, developer_api_base_url, access_token_publish_url):
        self.client_id = client_id
        self.client_secret = client_secret
        self.developer_api_base_url = developer_api_base_url
        self.access_token_publish_url = access_token_publish_url
        self.getAccessToken()

    # アクセストークン取得
    def getAccessToken(self):
        # アクセストークン取得URL指定
        url = self.access_token_publish_url

        # ヘッダ指定
        headers={
            "Content-Type": "application/json;charset=UTF-8"
        }

        # リクエストボディ指定
        data = {
            "grantType": "client_credentials",
            "clientId": self.client_id,
            "clientSecret": self.client_secret
        }
        # リクエストボディ指定をJSONにエンコード
        data = json.dumps(data).encode()

        # リクエスト生成
        req = urllib.request.Request(url, data, headers)

        # リクエストを送信し、レスポンスを受信
        res = urllib.request.urlopen(req)

        # レスポンスボディ取得
        res_body = res.read()

        # レスポンスボディをJSONからデコード
        res_body = json.loads(res_body)

        # レスポンスボディからアクセストークンを取得
        self.access_token = res_body["access_token"]


    # 感情分析API
    def sentiment(self, sentence):
        url = self.developer_api_base_url + "nlp/v1/sentiment"
        headers={
            "Authorization": "Bearer " + self.access_token,
            "Content-Type": "application/json;charset=UTF-8",
        }
        data = {
            "sentence": sentence
        }
        data = json.dumps(data).encode()
        req = urllib.request.Request(url, data, headers)
        try:
            res = urllib.request.urlopen(req)
        except urllib.request.HTTPError as e:
            print ("<Error> " + e.reason)

        res_body = res.read()
        res_body = json.loads(res_body)
        return res_body


if __name__ == '__main__':
    # ソースファイルの場所取得
    APP_ROOT = os.path.dirname(os.path.abspath( __file__)) + "/"

    # 設定値取得
    config = configparser.ConfigParser()
    config.read(APP_ROOT + "config.ini")
    CLIENT_ID = config.get("COTOHA API", "Developer Client id")
    CLIENT_SECRET = config.get("COTOHA API", "Developer Client secret")
    DEVELOPER_API_BASE_URL = config.get("COTOHA API", "Developer API Base URL")
    ACCESS_TOKEN_PUBLISH_URL = config.get("COTOHA API", "Access Token Publish URL")

    # COTOHA APIインスタンス生成
    cotoha_api = CotohaApi(CLIENT_ID, CLIENT_SECRET, DEVELOPER_API_BASE_URL, ACCESS_TOKEN_PUBLISH_URL)

    # 解析対象文
    sentence = "みんなが僕に勇気を、優しさをくれる"

    # API実行
    result = cotoha_api.sentiment(sentence)

    # 出力結果を見やすく整形
    result_formated = json.dumps(result, indent=4, separators=(',', ': '))
    print (codecs.decode(result_formated, 'unicode-escape'))

レスポンス

以下のようなレスポンスが返ってきます。

詳細は公式のAPIリファレンスをご参考ください。

{
    "result": {
        "sentiment": "Positive",
        "score": 0.5772809421419752,
        "emotional_phrase": [
            {
                "form": "優しさ",
                "emotion": "P"
            }
        ]
    },
    "status": 0,
    "message": "OK"
}

結果

文章ごとの結果

1. あきらめるもんか!最後まで頑張るんだ

{
    "result": {
        "sentiment": "Neutral",
        "score": 0.3780185090614437,
        "emotional_phrase": [
            {
                "form": "あきらめる",
                "emotion": "N"
            },
            {
                "form": "頑張る",
                "emotion": "P"
            }
        ]
    },
    "status": 0,
    "message": "OK"
}

2. みんなが僕に勇気を、優しさをくれる

{
    "result": {
        "sentiment": "Positive",
        "score": 0.5772809421419752,
        "emotional_phrase": [
            {
                "form": "優しさ",
                "emotion": "P"
            }
        ]
    },
    "status": 0,
    "message": "OK"
}

3. 僕の強さは、僕だけのものじゃないんだよ

{
    "result": {
        "sentiment": "Neutral",
        "score": 0.6419231393419158,
        "emotional_phrase": [
            {
                "form": "強さ",
                "emotion": "PN"
            }
        ]
    },
    "status": 0,
    "message": "OK"
}

4. みんなは僕が守る!守るために戦うんだ!!

{
    "result": {
        "sentiment": "Neutral",
        "score": 0.36170176557355166,
        "emotional_phrase": [
            {
                "form": "戦う",
                "emotion": "PN"
            }
        ]
    },
    "status": 0,
    "message": "OK"
}

5. ドーリィちゃん、君は僕の中で生きているんだ。ずっとずーっと、一緒に

{
    "result": {
        "sentiment": "Neutral",
        "score": 0.3926095704307067,
        "emotional_phrase": []
    },
    "status": 0,
    "message": "OK"
}

6. 大丈夫だよ。みんなの胸に“こころの星”の光がある限り、この世界は輝き続ける

{
    "result": {
        "sentiment": "Positive",
        "score": 0.4695782689477881,
        "emotional_phrase": [
            {
                "form": "大丈夫だよ",
                "emotion": "P"
            }
        ]
    },
    "status": 0,
    "message": "OK"
}

7. 泣いている人、困っている人、お腹がすいた人、みんな僕の顔を食べると、ニコッと笑顔になるんだ。その笑顔を見るとね、嬉しくて僕も自然に笑顔になる。そしてね、ここ(胸)がとってもあたたかくなるんだ

{
    "result": {
        "sentiment": "Positive",
        "score": 0.04812039845537604,
        "emotional_phrase": [
            {
                "form": "嬉しくて",
                "emotion": "P"
            },
            {
                "form": "笑顔",
                "emotion": "安心"
            },
            {
                "form": "困っている",
                "emotion": "N"
            },
            {
                "form": "泣いている",
                "emotion": "N"
            },
            {
                "form": "とってもあたたかくなる",
                "emotion": "P"
            }
        ]
    },
    "status": 0,
    "message": "OK"
}

8. 高価な物でも心がこもっていないと貰った人は淋しいですもんね

{
    "result": {
        "sentiment": "Negative",
        "score": 0.5991856441930126,
        "emotional_phrase": [
            {
                "form": "淋しいです",
                "emotion": "N"
            },
            {
                "form": "高価な",
                "emotion": "PN"
            },
            {
                "form": "心がこもっていない",
                "emotion": "N"
            }
        ]
    },
    "status": 0,
    "message": "OK"
}

9. 困っている人を助けた時に、こころがあたたかくなって、そのときわかったんだ。僕が何のために生まれてきたのか、何をして生きていくか、何が僕の幸せかって

{
    "result": {
        "sentiment": "Positive",
        "score": 0.003639888896649709,
        "emotional_phrase": [
            {
                "form": "困っている",
                "emotion": "N"
            },
            {
                "form": "助けた",
                "emotion": "P"
            },
            {
                "form": "あたたかくなって",
                "emotion": "P"
            },
            {
                "form": "わかった",
                "emotion": "P"
            }
        ]
    },
    "status": 0,
    "message": "OK"
}

10. 心で聴くんです。ジャムおじさんが言っていました。心で見て、心で聴けば、見えない本当のことがみえてくるんだって

{
    "result": {
        "sentiment": "Neutral",
        "score": 0.3720088284756403,
        "emotional_phrase": []
    },
    "status": 0,
    "message": "OK"
}

集計

sentiment回数
Positive 4
Neutral 5
Negative 1

まとめ

アンパンマンの発言はポジティブなものばかりですが、AIの結果は、Neutralが一番多く、その次にPositiveが多い結果となりました。Negativeが少ないという点でおおむねその通りの結果ですが、Neutralが多くなった要因として、アンパンマンの名言を単語単位で分解したとき「困っている」「泣いている」「寂しい」などNegativeと判断される単語があり、「優しい」「助ける」といったPositiveなワードと中和されることでNeutralと判断されているようでした。アンパンマンはNegativeなワードを出しつつ、Positiveな文章を作っているようです。また、AIとしては、このような単語単位ではなく文脈での Positive or Negative の判断精度がまだまだな印象を受けました。

広告

フリーランスエンジニアを目指すあなたに!

フリーランスエンジニアを目指すあなたに!

・これからフリーランスに転向したいと考えている方
・フリーランスとして働いているが報酬や仕事内容に満足していない方
・自分の実力をより発揮できる仕事がしたい方

一人では解決できないこともあるのではないでしょうか。
安定した仕事から将来のキャリアプランまで、
フリーランスの方の一生涯をサポートしていきます。

フリーランス同士のコミュニティの場、Freetoはこちら

アフェリエイトを始めたいあなたに!

A8.netなら!

◇スマートフォンやPCから簡単に広告が掲載可能

◇もちろん会員登録は無料。その後も費用はかかりません!

◇欲しい商品がお得に購入できるセルフバックの利用ができる

◇有名ブランドから高額報酬がもらえる広告を掲載
登録はこちら 

コメント

タイトルとURLをコピーしました