Google Cloud Natural Language API 使ってみる


みんな同じ事やってるんだろうなぁ。と思いますが、とりあえず使ってみます。乗るしかない、このビッグウェーブに！

# APIの種類
- analyzeEntities
- analyzeSentiment
- annotateText

# analyzeEntities を使ってみる
[Quickstart](https://cloud.google.com/natural-language/docs/getting-started?hl=ja) の通りに進めてみます。

```
$ gcloud auth activate-service-account --key-file=service-account-key-file
$ gcloud auth print-access-token
$ curl -s -k -H "Content-Type: application/json" \
    -H "Authorization: Bearer access_token" \
    https://language.googleapis.com/v1beta1/documents:analyzeEntities \
    -d @test.json
```

test.jsonの中身は以下の通りです。 service-account-key-file と access_token の中身は当然実際の値に書き換えているものとします。とりあえず以下のテストを突っ込みましょう（日本語の文章が思いつかなかったので[会社のプレスリリース](https://zero-start.jp/2016/0719/event-announcement-softbankworld)から適当に引っ張ってきた）。

```test.json
{
  "document":{
    "type":"PLAIN_TEXT",
    "content":"EC商品検索・レコメンドを始めとしたパーソナライズドECソリューションを開発販売する株式会社ゼロスタート（本社：東京都目黒区、代表取締役社長：山崎徳之、以下ゼロスタート）は、2016年7月21日（木）～22日（金）にソフトバンクグループ株式会社（以下ソフトバンク）などが主催する法人向けイベント『Softbank World 2016』にて「IBM Watson日本語版による小売業界の顧客体験変革」のパネリストとして登壇、またWatsonブースのミニセッションに登壇致します。"
  },
  "encodingType":"UTF8"
}

```


```返却値.json
{
  "entities": [
    {
      "name": "株式会社ゼロスタート",
      "type": "EVENT",
      "metadata": {},
      "salience": 0,
      "mentions": [
        {
          "text": {
            "content": "株式会社ゼロスタート",
            "beginOffset": 118
          }
        }
      ]
    },
    {
      "name": "東京都",
      "type": "LOCATION",
      "metadata": {
        "wikipedia_url": "http://ja.wikipedia.org/wiki/%E6%9D%B1%E4%BA%AC%E9%83%BD"
      },
      "salience": 0,
      "mentions": [
        {
          "text": {
            "content": "東京都",
            "beginOffset": 160
          }
        }
      ]
    },
    {
      "name": "目黒区",
      "type": "LOCATION",
      "metadata": {
        "wikipedia_url": "http://ja.wikipedia.org/wiki/%E7%9B%AE%E9%BB%92%E5%8C%BA"
      },
      "salience": 0,
      "mentions": [
        {
          "text": {
            "content": "目黒区",
            "beginOffset": 169
          }
        }
      ]
    },
    {
      "name": "山崎徳之",
      "type": "PERSON",
      "metadata": {
        "wikipedia_url": "http://ja.wikipedia.org/wiki/%E5%B1%B1%E5%B4%8E%E5%BE%B3%E4%B9%8B"
      },
      "salience": 0,
      "mentions": [
        {
          "text": {
            "content": "山崎徳之",
            "beginOffset": 205
          }
        }
      ]
    },
    {
      "name": "ソフトバンクグループ株式会社",
      "type": "ORGANIZATION",
      "metadata": {},
      "salience": 0,
      "mentions": [
        {
          "text": {
            "content": "ソフトバンクグループ株式会社",
            "beginOffset": 298
          }
        }
      ]
    },
    {
      "name": "ソフトバンク",
      "type": "ORGANIZATION",
      "metadata": {
        "wikipedia_url": "http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%83%90%E3%83%B3%E3%82%AF%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97"
      },
      "salience": 0,
      "mentions": [
        {
          "text": {
            "content": "ソフトバンク",
            "beginOffset": 349
          }
        }
      ]
    },
    {
      "name": "Softbank World 2016",
      "type": "CONSUMER_GOOD",
      "metadata": {},
      "salience": 0,
      "mentions": [
        {
          "text": {
            "content": "Softbank World 2016",
            "beginOffset": 418
          }
        }
      ]
    },
    {
      "name": "IBM Watson",
      "type": "OTHER",
      "metadata": {},
      "salience": 0,
      "mentions": [
        {
          "text": {
            "content": "IBM Watson",
            "beginOffset": 449
          }
        }
      ]
    },
    {
      "name": "日本",
      "type": "LOCATION",
      "metadata": {
        "wikipedia_url": "http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC"
      },
      "salience": 0,
      "mentions": [
        {
          "text": {
            "content": "日本",
            "beginOffset": 459
          }
        }
      ]
    },
    {
      "name": "Watson",
      "type": "OTHER",
      "metadata": {},
      "salience": 0,
      "mentions": [
        {
          "text": {
            "content": "Watson",
            "beginOffset": 558
          }
        }
      ]
    }
  ],
  "language": "ja"
}
```

固有名詞しか帰ってきてないですが、そういうモノっぽい気もします。
>Finds named entities (currently finds proper names) in the text, entity types, salience, mentions for each entity, and other properties.

って書いてあるし。


# analyzeSentiment 使ってみる
感情分析っぽいので試してみます。

```sentiment-test.json
{
  "document":{
    "type":"PLAIN_TEXT",
    "content":"EC商品検索・レコメンドを始めとしたパーソナライズドECソリューションを開発販売する株式会社ゼロスタート（本社：東京都目黒区、代表取締役社長：山崎徳之、以下ゼロスタート）は、2016年7月21日（木）～22日（金）にソフトバンクグループ株式会社（以下ソフトバンク）などが主催する法人向けイベント『Softbank World 2016』にて「IBM Watson日本語版による小売業界の顧客体験変革」のパネリストとして登壇、ま>たWatsonブースのミニセッションに登壇致します。"
  }
}
```
```
$ curl -s -k -H "Content-Type: application/json" -H "Authorization: Bearer access-token" "https://language.googleapis.com/v1beta1/documents:analyzeSentiment" -d @sentiment-test.json
```

```返却値.json
{
  "error": {
    "code": 400,
    "message": "The language ja is not supported for document sentiment analysis.",
    "status": "INVALID_ARGUMENT"
  }
}
```

確かに英語しかダメっぽいことが[ドキュメント](https://cloud.google.com/natural-language/reference/rest/v1beta1/documents/analyzeSentiment?hl=ja)に書いてある。そもそもこの文章に感情分析もへったくれもない気がしますが、まぁ、それはいいとしましょう。どっかのレビューとかを持ってきたらいいんでしょうか。

tripadvisor から高評価なレビューを拝借して突っ込みます。

"The most amazing resort! Everywhere you turn looks like a postcard! I have never stayed in a nicer resort!"

```返却値.json
{
  "documentSentiment": {
    "polarity": 1,
    "magnitude": 1.2
  },
  "language": "en"
}
```

低評価な方も。
"Appalling service. Could not find to Assist with room issues. Old furniture. Not helpful receptionist."

```
{
  "documentSentiment": {
    "polarity": -1,
    "magnitude": 2.9
  },
  "language": "en"
}
```
polarity は感情のネガポジで、-1~1 の範囲で数値が変動します。高評価なレビューに対してはポジティブ、定評かなレビューに対してはネガティブな判定が普通に帰ってきています。magnitude は感情の大きさを表していると考えればだいたい良さそうな気がする。

# annotateText を使ってみる
文章構造の解析かな。とりあえず突っ込んでみましょう。


```annotate-test.json
{
  "document": {
    "type":"PLAIN_TEXT",
    "content":"EC商品検索・レコメンドを始めとしたパーソナライズドECソリューションを開発販売する株式会社ゼロスタート（本社：東京都目黒区、代表取締役社長：山崎徳之、以下ゼロスタート）は、2016年7月21日（木）～22日（金）にソフトバンクグループ株式会社（以下ソフトバンク）などが主催する法人向けイベント『Softbank World 2016』にて「IBM Watson日本語版による小売業界の顧客体験変革」のパネリストとして登壇、またWatsonブースのミニセッションに登壇致します。"
  },
  "features": {
    "extractSyntax": true,
    "extractEntities": false,
    "extractDocumentSentiment": false
  },
  "encodingType": "UTF8"
}
```
entitie 分析と sentiment 分析はさっきやったので、features.extractSyntax のみ trueに設定。

```
curl -s -k -H "Content-Type: application/json"     -H "Authorization: Bearer access_token" "https://language.googleapis.com/v1beta1/documents:annotateText" -d @annotate-test.json
```

分析されているようです。果てしなくデカいのでGistで。
https://gist.github.com/debari/01963778d394575b7335eb125ce673b6

もうちょっと小さい文章でやれっていう話ですね。

```
[{
  "text": {
    "content": "最大",
    "beginOffset": 32
  },
  "partOfSpeech": {
    "tag": "NOUN"
  },
  "dependencyEdge": {
    "headTokenIndex": 2,
    "label": "CONJ"
  },
  "lemma": "最大"
},
{
  "text": {
    "content": "手",
    "beginOffset": 38
  },
  "partOfSpeech": {
    "tag": "NOUN"
  },
  "dependencyEdge": {
    "headTokenIndex": 9,
    "label": "NN"
  },
  "lemma": "手"
}]
```
依存関係が
最大手が「最大」「手」に分解されたりしているので、まだ精度には向上の余地アリでしょうか。