GCPのニューラルネットワークでテキスト化された文章のエンティティ感情分析をやってみた | そう備忘録

GCPのニューラルネットワークでテキスト化された文章のエンティティ感情分析をやってみた

文章の単語単位の感情分析

以前にGCP(Google Cloud Platform)のニューラルネットワークモデルのSpeech-to-Text APIを使って音声をテキスト化した時の事を記事とそのテキスト文章をanalyzeSentiment APIを使って感情分析をした時の記事を書いた。

今回は同じ感情分析なのだが単語単位で感情分析をするAPI(analyzeEntitySentiment)を使ってみた時の事を備忘録として記録しておく。

概要図

単語単位での感情分析

analyzeEntitySentiment概要図

事前準備

GCP上でAPIを使用できる環境を整える必要があるのだが大まかな手順は以下の通り。

  1. GCP(Google Clond Platform)でプロジェクトを作成する
  2. API認証情報を作成する(控えておく)
  3. VMインスタンスを作成する

上記については以前の記事の「GCP(Google Clond Platform)でプロジェクトを作成する」から「VMインスタンスを作成する」までを参照して欲しい。

単語単位の感情分析を行う

前述の手順でAPI実行用のVMインスタンスが出来ている前提として以下の手順で感情分析を行う。

自然言語処理APIを有効にする

Google Cloud Platformにログインしてメニューから”APIとサービス”ー>”ライブラリ”をクリックする。

APIとサービス、ライブラリ

“APIとサービスを検索”欄でCloud Natural Language APIを検索する。

Cloud Natural Language APIを検索する

「有効にする」ボタンをクリックする。

有効にする

有効になった。

APIが有効になった

sshの起動

Compute EngineのVMインスタンスの画面にて該当インスタンスのSSH横の三角をクリックして”ブラウザウィンドウで開く”をクリックする。

sshをブラウザウィンドウで開く

APIキーの設定

しばらく待つと新しいsshウィンドウが開く。

API認証情報を作成する”で控えておいたAPIキーを使うのだがAPIを呼び出すたびに何回も入力するのは面倒なので下記のコマンドで環境変数に保存しておく。

export API_KEY=控えておいたAPI KEY

APIキーをexport

requestdoc.jsonの作成

単語分析用のJSONファイルを作成する。

尚、文章は以前の記事でレゴに関するブログを読み上げて文章の感情分析を行ったのと同じモノを今回の入力にしている。

{
  "document":{
    "type":"PLAIN_TEXT",
    "content": "レゴマインドストームに7年ぶりの新ロボットキットが発売されるとの記事を見た。自分は教育用レゴマインドストーム EV 3の基本セットと拡張セットを持っているのだけれども、マインドストームで新作はもう出ないのかと諦めていたので新作が出ると聞いてとても嬉しい。以下気になったと言うか興味深い点。プログラミング環境。Pythonやスクラッチベースのドラッグ&ドロップでのコーディングが可能で Windows や Mac Android タブレットスマートフォンにも対応するとのことだが、今までのレゴマインドストームソフトウェアは使えないのかもしれない。"
  },
  "encodingType": "UTF8"
}

analyzeEntitySentiment APIを呼び出す

単語単位で感情を分析するAPIを呼び出す。

curl "https://language.googleapis.com/v1/documents:analyzeEntitySentiment?key=${API_KEY}" \
  -s -X POST -H "Content-Type: application/json" --data-binary @requestdoc.json

実行結果

{
  "entities": [
    {
      "name": "レゴマインドストーム",
      "type": "CONSUMER_GOOD",
      "metadata": {},
      "salience": 0.1949289,
      "mentions": [
        {
          "text": {
            "content": "レゴマインドストーム",
            "beginOffset": 0
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "新作",
      "type": "OTHER",
      "metadata": {},
      "salience": 0.14263977,
      "mentions": [
        {
          "text": {
            "content": "新作",
            "beginOffset": 267
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        },
        {
          "text": {
            "content": "新作",
            "beginOffset": 321
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0.1,
        "score": 0
      }
    },
    {
      "name": "ロボットキット",
      "type": "CONSUMER_GOOD",
      "metadata": {},
      "salience": 0.09454739,
      "mentions": [
        {
          "text": {
            "content": "ロボットキット",
            "beginOffset": 49
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "記事",
      "type": "WORK_OF_ART",
      "metadata": {},
      "salience": 0.078607306,
      "mentions": [
        {
          "text": {
            "content": "記事",
            "beginOffset": 94
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "マインドストーム",
      "type": "OTHER",
      "metadata": {},
      "salience": 0.07356047,
      "mentions": [
        {
          "text": {
            "content": "マインドストーム",
            "beginOffset": 240
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "レゴマインドストーム EV 3",
      "type": "CONSUMER_GOOD",
      "metadata": {},
      "salience": 0.048725344,
      "mentions": [
        {
          "text": {
            "content": "レゴマインドストーム EV 3",
            "beginOffset": 130
          },
          "type": "PROPER",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "教育",
      "type": "OTHER",
      "metadata": {},
      "salience": 0.04257684,
      "mentions": [
        {
          "text": {
            "content": "教育",
            "beginOffset": 121
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "拡張セット",
      "type": "OTHER",
      "metadata": {},
      "salience": 0.042139493,
      "mentions": [
        {
          "text": {
            "content": "拡張セット",
            "beginOffset": 186
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "基本セット",
      "type": "OTHER",
      "metadata": {},
      "salience": 0.042139493,
      "mentions": [
        {
          "text": {
            "content": "基本セット",
            "beginOffset": 168
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "タブレットスマートフォン",
      "type": "CONSUMER_GOOD",
      "metadata": {},
      "salience": 0.041337542,
      "mentions": [
        {
          "text": {
            "content": "タブレットスマートフォン",
            "beginOffset": 572
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "ドラッグ&ドロップ",
      "type": "CONSUMER_GOOD",
      "metadata": {},
      "salience": 0.020248594,
      "mentions": [
        {
          "text": {
            "content": "ドラッグ&ドロップ",
            "beginOffset": 486
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "プログラミング環境",
      "type": "OTHER",
      "metadata": {},
      "salience": 0.01811589,
      "mentions": [
        {
          "text": {
            "content": "プログラミング環境",
            "beginOffset": 420
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "レゴマインドストームソフトウェア",
      "type": "CONSUMER_GOOD",
      "metadata": {},
      "salience": 0.017748956,
      "mentions": [
        {
          "text": {
            "content": "レゴマインドストームソフトウェア",
            "beginOffset": 659
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0.2,
            "score": -0.2
          }
        }
      ],
      "sentiment": {
        "magnitude": 0.2,
        "score": -0.2
      }
    },
    {
      "name": "Mac",
      "type": "CONSUMER_GOOD",
      "metadata": {
        "wikipedia_url": "https://en.wikipedia.org/wiki/Macintosh",
        "mid": "/m/0zd6"
      },
      "salience": 0.01757631,
      "mentions": [
        {
          "text": {
            "content": "Mac",
            "beginOffset": 560
          },
          "type": "PROPER",
          "sentiment": {
            "magnitude": 0.1,
            "score": -0.1
          }
        }
      ],
      "sentiment": {
        "magnitude": 0.1,
        "score": -0.1
      }
    },
    {
      "name": "Android",
      "type": "CONSUMER_GOOD",
      "metadata": {
        "mid": "/m/02wxtgw",
        "wikipedia_url": "https://en.wikipedia.org/wiki/Android_(operating_system)"
      },
      "salience": 0.01757631,
      "mentions": [
        {
          "text": {
            "content": "Android",
            "beginOffset": 564
          },
          "type": "PROPER",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "Windows",
      "type": "CONSUMER_GOOD",
      "metadata": {
        "mid": "/m/04r_8",
        "wikipedia_url": "https://en.wikipedia.org/wiki/Microsoft_Windows"
      },
      "salience": 0.01757631,
      "mentions": [
        {
          "text": {
            "content": "Windows",
            "beginOffset": 548
          },
          "type": "PROPER",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "Python",
      "type": "OTHER",
      "metadata": {
        "mid": "/m/05z1_",
        "wikipedia_url": "https://en.wikipedia.org/wiki/Python_(programming_language)"
      },
      "salience": 0.016818251,
      "mentions": [
        {
          "text": {
            "content": "Python",
            "beginOffset": 450
          },
          "type": "PROPER",
          "sentiment": {
            "magnitude": 0.1,
            "score": -0.1
          }
        }
      ],
      "sentiment": {
        "magnitude": 0.1,
        "score": -0.1
      }
    },
    {
      "name": "点",
      "type": "OTHER",
      "metadata": {},
      "salience": 0.015455283,
      "mentions": [
        {
          "text": {
            "content": "点",
            "beginOffset": 414
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "こと",
      "type": "OTHER",
      "metadata": {},
      "salience": 0.0152069125,
      "mentions": [
        {
          "text": {
            "content": "こと",
            "beginOffset": 632
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "スクラッチベース",
      "type": "OTHER",
      "metadata": {},
      "salience": 0.014547552,
      "mentions": [
        {
          "text": {
            "content": "スクラッチベース",
            "beginOffset": 459
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "コーディング",
      "type": "EVENT",
      "metadata": {},
      "salience": 0.014547552,
      "mentions": [
        {
          "text": {
            "content": "コーディング",
            "beginOffset": 517
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    },
    {
      "name": "以下気",
      "type": "OTHER",
      "metadata": {},
      "salience": 0.013379518,
      "mentions": [
        {
          "text": {
            "content": "以下気",
            "beginOffset": 369
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0,
            "score": 0
          }
        }
      ],
      "sentiment": {
        "magnitude": 0,
        "score": 0
      }
    }
  ],
  "language": "ja"
}
  • name:単語
  • type:単語のタイプ
  • salience:そのエンティティがテキスト全体でどの程度重要かを表す(重要な単語順に出力される)
  • magnitude:その主張の中で表現されている感情の重みを表す
  • score:プラスはポジティブ、マイナスはネガティブな感情を表す
  • wikipedia_url:ウィキペディアのURL

”レゴマインドストーム”という単語がsalienceがトップで最も重要とのAIの判断。

これは全く正解でその通り!

続いて”新作”、”ロボットキット”、”記事”、”マインドストーム”、”レゴマインドストーム EV3”と続く。

salienceの順番はまぁ良いとしても、

  • レゴマインドストーム
  • マインドストーム
  • レゴマインドストーム EV3

がそれぞれ別の単語として判断されてしまっている。

言葉のゆらぎについてはもう1段階別の加工が必要になるのかも知れない。

注目すべきは”レゴマインドストームソフトウェア”がmagnitudeが0.2でscoreが-0.2とネガティブに分析された事。

文章を読んで貰えば分かるが「ScratchやPythonに対応してレゴマインドストームソフトウェアは使えないのかも知れない」と若干だが確かにネガティブに捉えている。

この文章の意味を読み取ってネガティブ判断をしたのだと思うのだが、中々興味深い結果だった。

今回の記事はこれで終了。

最後に

この記事が何処かで誰かの役に立つことを願っている。

尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。