Google Cloud APIを使ってお手軽に感情分析入門

##この記事を読むと
・順番通り進めていくと、GoogleCloudAPI NaturalLanguageの「エンティティ分析」「感情分析」「公文・品詞解析」が実行できます。

・GoogleCloudAPI NaturalLanguage公式チュートリアルへの抵抗感が減ります

##この記事を書いた理由

「Google Cloud APIを使って感情分析したい」と思い立ったものの、APIを使うだけなので簡単そうに見えて意外と詰まりました。GoogleCloudPlatform公式日本語ドキュメントで、詳細な入門やチュートリアルが用意されているものの、独自の用語が多すぎて何を言っているのかさっぱりでした。
また、ストレスだったのが環境構築。後述しますが、別にローカルに環境構築をしなくてもブラウザから実行できるので、まずはそちらで試してみると良いかと思います。

さて、苦戦した折りに素晴らしい入門資料と出会いました。
本記事は基本的にこちらの資料の通りに書いています。実はこれもGoogle公式資料なんですよね。
（Google様・・・尊い・・・）
[Codelab/Next17-Tokyo/「Natural Language API でエンティティと感情を分析する」](https://codelabs.developers.google.com/codelabs/cloud-nl-intro-ja/index.html?index=..%2F..next17-tok#0)
ただ、こちらの資料が2017年のものなので古い部分は適宜修正したり、省略されている部分を補ったりしています。
マークダウンで引用になっている箇所はそのままコピペです（手抜き）。そのうち自分の言葉で噛み砕いて置き換えます。


##環境
・Google Chrome
・Google Cloud Shell
（要はブラウザが開けるPCがあればOKです）


##準備
####Google Cloud Platform Consoleアカウントを作成(orログイン）
[Google Cloud Platform Console](https://console.cloud.google.com/)を開き、自身のGoogleアカウントでログインします。


####プロジェクトを作成
```Create project```もしくは```新しいプロジェクトを作成```をクリックしてプロジェクトを作成します。```project-name```は任意の名前を入力してください。
ここで```プロジェクトID```が発行されるので、メモしておいてください（後から確認することも可能です）。
プロジェクトができたら、```Strat Cloud Shell```でGoogleCloudConsoleを開いておきましょう。

####APIを有効化
画面右の```メニュー```⇨```APIとサービス```と開き、画面中央上の```+ APIとサービスを有効化```　をクリック。
languageなりnlpなりで検索して、```Google Cloud Natural Language API```を```enable```にしてください。
ここで、```Billing```(支払い情報）の追加を求められることがありますが、画面の指示通りクレジットカードやデビットカードを追加してください。Cloud APIを使用するために必要なアカウント情報ですが、基本的に料金請求はされないので安心してください。

####APIキーを作成
```APIとサービス``` ⇨ ```認証情報```と開き、```認証情報を作成```をクリック。
すると現れるメニューから```APIキー```を選択します。生成されたAPIキーをコピー。
リクエストするたびにAPIキーの値を挿入しなくてすむように、生成したAPIキーを環境変数に保存しましょう。キーの保存はCloud Shellで行えます。
先ほどコピーしたAPIキーを```API_KEY=?????```に入れて、下記のコードを実行してください。

```
export API_KEY=?????
```

##実行
####エンティティ分析リクエストを作成
1 つ目の Natural Language API メソッドは 、analyzeEntities です。API はこのメソッドを使ってテキストからエンティティ（人物、場所、イベントなど）を抽出します。API のエンティティ分析を試すために、最近のニュース記事にあった以下のような文章を使用してみましょう。

>LONDON — J. K. Rowling always said that the seventh Harry Potter book, "Harry Potter and the Deathly Hallows," would be the last in the series, and so far she has kept to her word.

Natural Language API へのリクエストは request.json ファイル内で作れます。
最初にこのファイルをCloud Shellで作成します。
おなじみのtouchコマンドを使って作成しましょう。

```
touch request.json
```

一応、ファイルが作成されているか確認しましょう。おなじみのlsコマンドを使ってディレクトリやファイルを表示してみます。

```
ls
```

```request.json``` が作成されていますね。他に色々あるのはデフォルトなのでスルーでOKです。


次に、作成したファイルをコマンドラインエディターで開きます。vimでも何でも良いですが、下記が一番簡単かと思います。

```py
edit request.json
```

自分の request.jsonファイルに以下を追加して、変更を保存します。
Macならcommand+Sですね。あるいはブラウザから操作するなら画面右上の```File```⇨```Save```とクリック。

```request.json
{
  "document":{
    "type":"PLAIN_TEXT",
    "content":"LONDON — J. K. Rowling always said that the seventh Harry Potter book, ‘Harry Potter and the Deathly Hallows,' would be the last in the series, and so far she has kept to her word."
  }
}
```
このリクエストの中で、これから送信しようとしているテキストを Natural Language API に伝えます。サポートされている type の値は PLAIN_TEXT または HTML です。コンテンツ内で、分析するために Natural Language API へ送信するテキストを渡します。Natural Language API は、テキスト処理用として Goolge Cloud Storage に保存されているファイルの送信もサポートしています。Google Cloud Storage からファイルを送信する場合は、content を gcsContentUri に置き換えて、Google Cloud Storage 内のテキスト ファイルの uri の値を設定します。


####Natural Language API を呼び出す
ここからは、以下の curl コマンドを使用して、前の手順で保存しておいた API キー環境変数と一緒に、リクエスト本文を Natural Language API に渡します（すべてを 1 つのコマンドラインにします）。

curlはAPIを呼び出すときによく使われますね。

```key=????``` に自分のAPIキーを入れて、下記コードを実行します。

```py
curl "https://language.googleapis.com/v1beta1/documents:analyzeEntities?key=????" \
  -s -X POST -H "Content-Type: application/json" --data-binary @request.json
```

レスポンスの開始は、以下のようになります。

```py

{
  "entities": [
    {
      "name": "Rowling",
      "type": "PERSON",
      "metadata": {
        "wikipedia_url": "http://en.wikipedia.org/wiki/J._K._Rowling"
      },
      "salience": 0.56932539,
      "mentions": [
        {
          "text": {
            "content": "J. K.",
            "beginOffset": -1
          }
        },
        {
          "text": {
            "content": "Rowling",
            "beginOffset": -1
          }
        }
      ]
    },
    ...
  ]
}
```
>レスポンスの中で、API が文章から 4 つのエンティティを検出したことがわかります。各エンティティについて、エンティティの type（タイプ）、関連する Wikipedia の URL（存在する場合）、salience（セイリエンス）、およびテキスト内でそのエンティティが出現した場所のインデックスが得られます。セイリエンスとは 0～1 の数値で、テキスト全体に対するそのエンティティの突出性を指しています。前述の文章では、「Rowling」が最も高い値を返しています。これは、彼女がこの文章の主語だからです。Natural Language API は別の方法で、言及された同じエンティティを認識することもできます。たとえば、「Rowling」と「J.K.Rowling」、そして「Joanne Kathleen Rowling」さえも、すべて Wikipedia の同じエントリーを指しています。


####Natural Language API で感情を分析する
>エンティティの抽出以外にも、Natural Language API を使うとテキスト ブロックの感情分析を行えます。JSON リクエストには前述のリクエストと同じパラメーターが含まれますが、今回はテキストを変更して、より強い感情を持った内容にしてみましょう。ご自分の request.json ファイルを以下のものに置き換えてください。そして content をお好きなテキストに自由に置き換えてみてください。

```request.json
{
  "document":{
    "type":"PLAIN_TEXT",
    "content":"I love everything about Harry Potter. It's the greatest book ever written."
  }
}
```

次に、リクエストを API の analyzeSentiment エンドポイントに送信します。command lineで下記を実行します。key=????にはAPIキーを入れてください。

```py

curl "https://language.googleapis.com/v1beta1/documents:analyzeSentiment?key=????" \
  -s -X POST -H "Content-Type: application/json" --data-binary @request.json
```
以下のようなレスポンスが返されます。

```request.json
{
  "documentSentiment": {
    "polarity": 1,
    "magnitude": 1.8
  },
  "language": "en"
}
```

>感情のメソッドは、polarity（極性）と magnitude（強度）という 2 つの値を返します。polarity は -1.0～1.0 の数値で、文がどれだけポジティブまたはネガティブかを示します。magnitude は 0～∞ の数値で、polarity とは無関係に、文中で表現されている感情の重みを表します。文の重みが大きいテキスト ブロックの長さが増せば、それだけ magnitude の値も高くなります。上記の文の polarity は 100 % ポジティブで、「love」や「greatest」、「ever」という単語が magnitude の値に関係しています。


##構文と品詞を解析する
ここからは、Natural Language API の 3 つ目のメソッドであるテキスト アノテーションを見てみましょう。テキストの言語的な詳細について踏み込んで調べます。annotateText は、テキストの感情的要素と構文的要素について、完全な詳細がわかる高度なメソッドです。API を使えば、テキストに含まれる各単語について、その単語の品詞（名詞、動詞、形容詞など）と、その単語が文内の他の単語とどのように関係しているのか（動詞の原形なのか、修飾語句なのか）がわかります。

シンプルな文章を使って試してみましょう。JSON リクエストは前述のものと似ていますが、ここでは features キーを加えます。このキーで、構文アノテーションを実行したいことを API に伝えます。ご自分の request.json を以下の内容に置き換えてください。

```request.json
 {
  "document":{
    "type":"PLAIN_TEXT",
    "content":"Joanne Rowling is a British novelist, screenwriter and film producer."
  },
  "features":{
    "extractSyntax":true
  }
}
````

次に、API の annotateText メソッドを呼び出します。command lineで下記を実行します。key=????にはAPIキーを入れてください。

```
curl "https://language.googleapis.com/v1beta1/documents:annotateText?key=????" \
  -s -X POST -H "Content-Type: application/json" --data-binary @request.json
```
レスポンスには、文章内の各トークンについて、以下のようなオブジェクトが返されます。

```
{
      "text": {
        "content": "Joanne",
        "beginOffset": -1
      },
      "partOfSpeech": {
        "tag": "NOUN"
      },
      "dependencyEdge": {
        "headTokenIndex": 1,
        "label": "NN"
      },
      "lemma": "Joanne"
}
```

レスポンスを詳しく見てみましょう。partOfSpeech からは、「Joanne」が名詞であることがわかります。dependencyEdge には、テキストの依存構文木の作成に使用できるデータが含まれています。本来この構文木は、文章中の単語が互いにどのような関係なのかを示す図です。上記の文章の依存構文木は以下のようになります。

注記：以下の Natural Language デモを使用すると、ブラウザでご自分の依存構文木を作成できます。https://cloud.google.com/natural-language/

上記のレスポンスの headTokenIndex は、「Joanne」を指す弧を持つトークンのインデックスです。この場合、文章内の各トークンを配列内の 1 単語と捉えることができ、「Joanne」に対する headTokenIndex の値 1 は、構文木でつながっている「Rowling」という単語を参照しています。NN（修飾語句 noun compound（名詞複合語）の略式表記）のラベルは、文章内でのその単語の役割を表しています。「Joanne」は、この文章の主語である「Rowling」を修飾しています。lemma（見出語）はこの単語の正規化形式です。たとえば、run、runs、ran、running という単語の lemma はすべて run になります。lemma の値は、ある単語が大きなテキスト全体をとおしてどれだけ出現するかを調べるのに役立ちます。


####終わりに
お疲れ様です！これで貴方もエンティティ分析や感情分析を使えるようになりました（実はかなりすごいことです）。

## 参考

[人工知能特化型プログラミング学習サービスAidemy Premium Plan](//af.moshimo.com/af/c/click?a_id=2279296&p_id=1386&pc_id=2364&pl_id=20670&guid=ON)【Aidemy】

[自走できるAI人材になるための6ヶ月長期コース]https://px.a8.net/svt/ejp?a8mat=3NL3I3+2MNXYQ+4J9I+BWVTE)【キカガク】

[現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル](https://px.a8.net/svt/ejp?a8mat=3BK8OP+16V8C2+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fpython-beginner%2F)【Udemy】

[Pythonによるビジネスに役立つWebスクレイピング（BeautifulSoup、Selenium、Requests）
](https://px.a8.net/svt/ejp?a8mat=3BK8OP+16V8C2+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fpython-web-scraping-with-beautifulsoup-selenium-requests%2F)【Udemy】

[【世界で18万人が受講】実践 Python データサイエンス](https://px.a8.net/svt/ejp?a8mat=3BK8OP+16V8C2+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fpython-jp%2F)【Udemy】

[【画像判定AIアプリ開発・パート1】TensorFlow・Python・Flaskで作る画像判定AIアプリ開発入門](https://px.a8.net/svt/ejp?a8mat=3BK8OP+16V8C2+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Ftensorflow-advanced%2F)【Udemy】

[【キカガク流】プログラミング力向上のためのPythonで学ぶアルゴリズム論（前編）
](https://px.a8.net/svt/ejp?a8mat=3BK8OP+16V8C2+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Falgorithm1%2F)【Udemy】

[Python 1年生 体験してわかる！会話でまなべる！プログラミングのしくみ ](https://amzn.to/3rVIkb6)
[Python2年生 スクレイピングのしくみ 体験してわかる！会話でまなべる！](https://amzn.to/3hFkSKs)

[入門 Python 3](https://amzn.to/2XbQeiw)
[独学プログラマー Python言語の基本から仕事のやり方まで](https://amzn.to/2XhElY1)

[人工知能プログラミングのための数学がわかる本](https://amzn.to/38damqt)
[[第2版]Python 機械学習プログラミング 達人データサイエンティストによる理論と実践](https://amzn.to/3rX83Qc)

[Kaggleで勝つデータ分析の技術 ](https://amzn.to/3pPKvLr)
[スクレイピング・ハッキング・ラボ　Pythonで自動化する未来型生活](https://amzn.to/2LjkdlJ)

<a href="https://www.amazon.co.jp/dp/4798153192/ref=as_li_ss_il?&linkCode=li2&tag=fden02-22&linkId=d0b06254c024b8a7229ef25ef2fe6d9f&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4798153192&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4798153192" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><a href="https://www.amazon.co.jp/Python2%E5%B9%B4%E7%94%9F-%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF-%E4%BD%93%E9%A8%93%E3%81%97%E3%81%A6%E3%82%8F%E3%81%8B%E3%82%8B%EF%BC%81%E4%BC%9A%E8%A9%B1%E3%81%A7%E3%81%BE%E3%81%AA%E3%81%B9%E3%82%8B%EF%BC%81-%E6%A3%AE-%E5%B7%A7%E5%B0%9A/dp/4798161918/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0&qid=1609820034&sr=8-2&linkCode=li2&tag=fden02-22&linkId=5f402765bd7550a2b08eaf1cbb51d5e4&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4798161918&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4798161918" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<a href="https://www.amazon.co.jp/dp/4873117380/ref=as_li_ss_il?&linkCode=li2&tag=fden02-22&linkId=a48091637d5aca399e2a19ec7b646234&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873117380&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4873117380" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><a href="https://www.amazon.co.jp/dp/4822292274/ref=as_li_ss_il?&linkCode=li2&tag=fden02-22&linkId=e1b20b2dccfab4db40563da5472a095f&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4822292274&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4822292274" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />


<a href="https://www.amazon.co.jp/dp/4046021969/ref=as_li_ss_il?&linkCode=li2&tag=fden02-22&linkId=cc5ecdf0f8645221e4946f94bb6fc5f8&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4046021969&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4046021969" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><a href="https://www.amazon.co.jp/dp/4295003379/ref=as_li_ss_il?&linkCode=li2&tag=fden02-22&linkId=fac9bf3045de0d26a413aa1715019af1&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4295003379&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4295003379" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

<a href="https://www.amazon.co.jp/dp/4297108437/ref=as_li_ss_il?&linkCode=li2&tag=fden02-22&linkId=353e70ac935e4ca56bb565645832f3d2&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4297108437&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4297108437" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><a href="https://www.amazon.co.jp/%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%8F%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%A9%E3%83%9C-Python%E3%81%A7%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E6%9C%AA%E6%9D%A5%E5%9E%8B%E7%94%9F%E6%B4%BB-%E6%8A%80%E8%A1%93%E3%81%AE%E6%B3%89%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88NextPublishing%EF%BC%89-%E9%BD%8A%E8%97%A4-%E8%B2%B4%E7%BE%A9-ebook/dp/B08H1KBYG2/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0&qid=1609820034&sr=8-1&linkCode=li2&tag=fden02-22&linkId=61c57e05decd0916bf22ee9841dbfe1f&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B08H1KBYG2&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=B08H1KBYG2" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />