Google Apps ScriptのPrediction Serviceを使ってみた

## 前置き
この記事はGoogle Apps Script Advent Calendarの24日目の記事です。
一番最初にクリスマスイヴを予約したのですが、一番面倒なテーマを設定してしまって、
失敗したかも…。と思う反面、苦戦したのでおもしろくもなんとも無い1日が雑音もなく
過ぎていくと思うと、良かったかなと思っています。

## Google Prediction API？
### 公式ドキュメント
[https://developers.google.com/prediction/?hl=ja](https://developers.google.com/prediction/?hl=ja)

### 少し説明
Google Prediction APIはGoogleが作っている機械学習アルゴリズムを使って、入力データがどんなデータなのかを解析するためのAPIです。
実際にどういうことに使えるかというと、

* 言語解析（入力データが何語なのか？）
* 顧客の心理分析
* Spam検知
* メールの自動分類

って感じに使えるようです。ただし、**元になるデータを集めないとダメですけどね！**

でも、未来を感じられるAPIではないかと思いますので、これを読んだ方は使ってみて下さい。

## 事前準備
1. Google Cloud Storageを使わないといけないので、APIs Consoleで有効にして下さい。（課金情報の登録が必要ですが、いきなり課金はされないと思います。高くてもうまい棒1本程度…？）
2. Google Prediction APIも有効にしてください。
3. APIキーも取得しておいて下さい。（以前のGoogle Analytics APIの記事に書いた…かな？）
4. Google Apps Script側で、Google APIでPredictionを追加する。**Versionは1.5**を選択する。

## 今日のコード.gs

```コード.gs
function train() {
  // トレーニングデータを追加する。
  var training = Prediction.newTraining();
  training.setId("languageidentifier");
  training.setStorageDataLocation("bucketName/language_id.txt");
  
  // いきなりトレーニングデータをinsertしようとすると、Prediction APIの
  // アクセスの承認が表示されなくて承認できないので適当にgetする感じで。
  // これのせいで、「サーバエラー」に悩まされてしまった…。
//  var ret = Prediction.Trainedmodels.get("languageidentifier");
//  Logger.log(ret);
  
  var training_reply = Prediction.Trainedmodels.insert(training);
  Logger.log(training_reply);
}

function get() {
  var data = Prediction.Trainedmodels.get("languageidentifier");
  Logger.log(data);
}

function predict() {
  // 予測させる
  var predict_input = Prediction.Trainedmodels.newPredictInput().setCsvInstance(["This", "is", "a", "tokenized", "sentence"]);
  var predict_output = Prediction.Trainedmodels.predict("languageidentifier", {"input" : predict_input});
  
  Logger.log(predict_output);
}

function predict_japanese() {
  // 日本語を予測させる
  var predict_input = Prediction.Trainedmodels.newPredictInput().setCsvInstance(["こんにちは"]);
  var predict_output = Prediction.Trainedmodels.predict("languageidentifier", {"input" : predict_input});
  
  Logger.log(predict_output);
}

function update() {
  // トレーニングデータを更新する。
  var update_training = Prediction.Trainedmodels.update("languageidentifier", {"label" : "日本語", "csvInstance" : ["こんにちは"]});
  Logger.log(update_training);
}

function analyze() {
  // 解析する。
  var result = Prediction.Trainedmodels.analyze("languageidentifier");
  Logger.log(result);
}

function HostedModelSample() {
  var input = Prediction.Hostedmodels.newPredictInput();
  input.setCsvInstance(["How about meeting up later?"]);
  
  // サンプルデータから感情を解析する。（例：「あとで会える？」というのは感情的にどうなのか？）
  var ret = Prediction.Hostedmodels.predict("sample.sentiment", {"input" : input});
  Logger.log(ret);
}
```

## 使い方
サンプルデータは公式ドキュメントのサイトにリンクがありますが、
ここにもつけておきます。[https://developers.google.com/prediction/docs/language_id.txt?hl=ja](https://developers.google.com/prediction/docs/language_id.txt?hl=ja)

1. まず、Google Cloud Storageにトレーニングデータをアップロードする。
2. train()を実行してトレーニングデータを追加する。
3. predict()を実行すると、何語かという結果が出力される。
4. predict_japanese()を実行すると、日本語の認識結果が出力される。
5. analyze()を実行すると、登録されているトレーニングデータの情報が取得される。
6. get()を実行すると状態が取得される
7. update()を実行すると新たなデータを追加できる
8. HostedModelSample()を実行すると感情解析ができる。（**※デモでしか使わないように！**）

## 実行結果
基本的にAPIの戻り値がそのままっぽいので、今回は省略します。

## お助けツール
APIs Explorer（うまく動かない時はこれでお試し下さい）
[https://developers.google.com/apis-explorer/#p/prediction/v1.5/](https://developers.google.com/apis-explorer/#p/prediction/v1.5/)

## 結論
ハマってしまったけど、動き始めたら結構おもしろかった。
データをどうやって集めるかが重要かも。