RubyでGoogle Natural Language APIを使う

#概要
RubyでGoogle Natural Language APIを使うための準備をメモりました。このAPIは普段PythonやPHPで用いられることが多く、Rubyで使おうとするとなかなか参考にできるものが少ないと思ったので。最後にテストで感情分析を行っています。

#Google Natural Language APIとは？
Googleが提供する自然言語処理用のAPIです。自然言語処理を行うAPIはいくつか存在しますが、日本語テキストに対応しているのが強みです。基本無料で使用できますが、本人確認のためにクレジットカードが必須です。自然言語処理を行うクラウドサービスを比較している記事があったので、こちらを参考にどうぞ。

[テキストの感情分析をするためのクラウドサービス比較](https://qiita.com/kazu20/items/42fbfe6dfa81b716b4bc)

#Google Natural Language APIを使う準備
本題です。まずは[Google Cloud Platform](https://cloud.google.com/?hl=ja)（このAPIを含むプラットホーム）で登録を済ませましょう。


##1. 新しいプロジェクトの作成（任意）
ホーム画面の左上に「My First Project」という欄があるはずです。

![スクリーンショット 2019-05-22 18.44.25.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240765/8ec1d309-7e98-52d1-0aca-084da5eec0ac.jpeg)


これをクリックし、出てきた画面の右上にある「新しいプロジェクト」を選択、好きなプロジェクト名を付けて「作成」をクリックしてください。
![スクリーンショット 2019-05-22 18.47.31.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240765/072f88a7-0c48-a081-43c5-1f8631643b0f.jpeg)

元からあるMy First Projectのままでも作業はできますので、この設定は任意です。何個かプロジェクトを作るつもりの人や、好きな名前でプロジェクトを始めたい人は以上の設定をするといいと思います。

##2. gcloudコマンドラインでの設定（多分必須）
Google Cloud Platformには備え付けのコマンドラインがあります。次はそれを使ってRubyでこのAPIを使えるように設定しましょう。
まず、ホーム画面で右上の赤枠のアイコンをクリックし、「Start Cloud Shell」をクリック。

<img width="2048" alt="スクリーンショット 2019-05-22 18.44.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240765/b20b2ce4-6749-71ab-b442-944ba00fd4a4.png">

そうすると、画面下にコマンドラインが生成されたと思います。ここで、諸々の設定をしていきます。
まず、作業するプロジェクトが、目的（自分が作ったプロジェクト）のものになっているか確認します。コマンドライン上で、

```
gcloud config list
```

と打ちます。これは、現在作業しているプロジェクトを参照するコマンドです。返ってきた文章の中に

```
[core]
account = [自分のgmailアドレス]
project =[現在作業中のプロジェクトのID]
```
とあると思います。このプロジェクトIDが、作業したいプロジェクトのIDと一致しているか確認してください。もし違うようなら、

```
gcloud config set project [作業したいプロジェクトのID]
```
を実行しましょう。

```
Updated property [core/project].
```
と返ってくれば、作業するプロジェクトが変更できたことになります。

##3. APIを有効にする（必須）
gcloudコマンドラインで次のコマンドを打ちます。

```
gcloud services enable language.googleapis.com
```
ここでエラーが起きる人は、作業2が正常にできていない場合があります。

##4. サービスアカウントの作成（必須）
APIのリクエストを認証するためには、サービスアカウントというものを作る必要があります。詳しくは以下のリンクをご覧ください。

[サービスアカウントの作成と管理](https://cloud.google.com/iam/docs/creating-managing-service-accounts?hl=ja#iam-service-accounts-create-console)

ここではプラットフォームからサービスアカウントを作成する方法を書きます。
まず、ホーム画面左の「IAMと管理」→「サービスアカウント」→「+ CREATE SERVICE ACCOUNT」をクリックします。

<img width="2048" alt="スクリーンショット 2019-05-22 18.44.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240765/399deef4-bd6d-91e6-ef0b-8b44d7103cfe.png">

<img width="2048" alt="スクリーンショット 2019-05-22 20.33.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240765/c04034ff-e6d8-b03e-e22e-c26b9b4e8bc0.png">

作成画面で、好きなサービスアカウント名を入力します。この後、

- ②このサービスアカウントにプロジェクトへのアクセスを許可する

は省略してOKです。複数人が関わるプロジェクトにおいて、特定の人に何らかの権限を与える必要があるときは記入してください。次に、③ユーザーにこのサービスアカウントへのアクセスを許可　のところで、「キーの作成（オプション）」という欄があります。これは、プログラムを動かす際に必要な秘密鍵を含むファイルをダウンロードするものです。「+ キーを作成」を押し、キーのタイプを**JSON**にし、作成をクリックしましょう。これで秘密鍵ができました。なお、ページにも書いてある通り、このファイルは**復元できない**ので注意してください。秘密鍵なので扱いも慎重に。

##5. 環境変数を設定（必須）
環境変数`GOOGLE_APPLICATION_CREDENTIALS`を設定します。**OSのコマンドライン**で次のようなコマンドを打ちます。

- Mac or Linux

```
export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"

例）
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/[FILE_NAME].json"
```

- Windows（コマンドプロンプト）

```
set GOOGLE_APPLICATION_CREDENTIALS=[PATH]
```

##6. gemをインストール（必須）

OSのコマンドラインで

```
gem install google-cloud-language
```

これでRubyでGoogle Natural Language APIを使う準備ができました。

#いざ使ってみるぞ
こんなファイルを用意します。今回はAPIの中の一つの機能である「感情分析」を使ってみました。ソースコードはこんな感じです。

```ruby:test.rb
require 'google/cloud/language' #APIを使う

language = Google::Cloud::Language.new
response = language.analyze_sentiment content: "今日も1日楽しかった。", #ここに分析したい文章
                                      type: :PLAIN_TEXT

sentiment = response.document_sentiment

score = sentiment.score.to_f.round(1) #float型に変換,少数第2位を四捨五入
magnitude = sentiment.magnitude.to_f.round(1)
puts "Score: #{score}"
puts "Magnitude: #{magnitude}"
```

出力結果

```
Score: 0.4
Magnitude: 0.4
```

- score: -1.0~1.0の中で大きいほど正の感情（ポジティブ）、小さいほど負の感情（ネガティブ）を抱いていることを示す。
- magnitude: 感情の強さ。0~infで、大きいほど感情的であることを示す。scoreが0.0であったとき、magnitudeが大きいなら「感情的であり、ポジティブとネガティブが打ち消しあっている」ことを示し、小さいなら「ニュートラルな文章である」ことを示す。

#感想
意外と大変だな〜という印象でした。ただ、どの機能を使うにしてもほぼ同じような作業でできそうなので、一気にいろんなことを覚えなくてもいいのかもしれません。もう少し勉強していきたいなあと思います。

#最後に
不明な点やおかしな点などございましたら気軽にコメントしていただけると嬉しいです。（もしかしたら間違っていることもあるかもしれませんが、暖かい目で見てから指摘くださると助かります！）

それでは！