GCPのテキストの感情分析をPython SDKでやってみる

前回の記事ではAPIを直接叩きましたが、現実的にはSDKを使った方が手軽なのでその方法を紹介します。

準備として、 クイックスタート: クライアント ライブラリの使用 をみながら以下の内容を行っておきます。
1. サービスアカウントの作成。
2. jsonファイルのローカル保存。
3. jsonファイルのパスを環境変数 GOOGLE_APPLICATION_CREDENTIALS に設定。
4. SDK google-cloud-language のインストール

サービスアカウントを使わずに既存のAPIキーを使ってどうにかできないか方法を探してたのですがそれは無理そうですね。
諦めてサービスアカウントを作りましょう。

準備ができたら実行してみます。 ハローワールド的なコード例があるのでほとんどそのまま動かしました。


# ライブラリのインポート
from google.cloud import language
from google.cloud.language import enums
from google.cloud.language import types

# クライアントのインスタン作成
client = language.LanguageServiceClient()

# 分析対象のテキスト
text = u'Hello, world!'

document = types.Document(
    content=text,
    type=enums.Document.Type.PLAIN_TEXT
)

# テキストの感情分析
sentiment = client.analyze_sentiment(document=document).document_sentiment

print(f"Text: {text}")
print(f"Sentiment: {sentiment.score}, {sentiment.magnitude}")

"""
Text: Hello, world!
Sentiment: 0.6000000238418579, 0.6000000238418579
"""

お作法に慣れるまで少しだけかかりそうなのですが、それでも簡単に動かせましたね。
Hello, world! はポジティブな言葉のようです。

GCPのCloud Natural Language API でセンチメント分析

せっかくアカウントを作ったのでGCPでテキストのセンチメント分析(ポジネガ)を試してみます。
Python ライブラリも用意されている様なのですが、最初なのでAPIを直接叩いてみました。

こちらに、 curl コマンドを使う例があり、これを参考に、pythonで書きなおしてみます。


curl -X POST \
     -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
     -H "Content-Type: application/json; charset=utf-8" \
     --data "{
  'encodingType': 'UTF8',
  'document': {
    'type': 'PLAIN_TEXT',
    'content': 'Enjoy your vacation!'
  }
}" "https://language.googleapis.com/v1/documents:analyzeSentiment"

今回は認証はAPIキーで行うので、URLにクエリパラメーター(key={APIキー})で流けることに注意しながら、pythonでやってみました。


# サンプルテキスト
text = (
    "メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。"
    "メロスには政治がわからぬ。メロスは、村の牧人である。笛を吹き、羊と遊んで暮して来た。"
    "けれども邪悪に対しては、人一倍に敏感であった。"
    "きょう未明メロスは村を出発し、野を越え山越え、十里はなれた此のシラクスの市にやって来た。"
)

# 自分のAPIキーに置き換える
apl_key = "{自分のAPIキー}"

# APIのurl情報
url = 'https://language.googleapis.com/v1/documents:analyzeSentiment?key=' + apl_key

# ヘッダーとデータの設定
header = {'Content-Type': 'application/json'}
data = {
    "document": {
        "type": "PLAIN_TEXT",
        "content": text
    },
    "encodingType": "UTF8"
}

response = requests.post(url, headers=header, json=data).json()

# 結果表示
response
"""
{'documentSentiment': {'magnitude': 1.2, 'score': 0},
 'language': 'ja',
 'sentences': [{'text': {'content': 'メロスは激怒した。', 'beginOffset': 0},
   'sentiment': {'magnitude': 0.1, 'score': -0.1}},
  {'text': {'content': '必ず、かの邪智暴虐の王を除かなければならぬと決意した。', 'beginOffset': 27},
   'sentiment': {'magnitude': 0.3, 'score': 0.3}},
  {'text': {'content': 'メロスには政治がわからぬ。', 'beginOffset': 108},
   'sentiment': {'magnitude': 0.5, 'score': -0.5}},
  {'text': {'content': 'メロスは、村の牧人である。', 'beginOffset': 147},
   'sentiment': {'magnitude': 0, 'score': 0}},
  {'text': {'content': '笛を吹き、羊と遊んで暮して来た。', 'beginOffset': 186},
   'sentiment': {'magnitude': 0, 'score': 0}},
  {'text': {'content': 'けれども邪悪に対しては、人一倍に敏感であった。', 'beginOffset': 234},
   'sentiment': {'magnitude': 0, 'score': 0}},
  {'text': {'content': 'きょう未明メロスは村を出発し、野を越え山越え、十里はなれた此のシラクスの市にやって来た。',
    'beginOffset': 303},
   'sentiment': {'magnitude': 0, 'score': 0}}]}
"""

ドキュメント全体としての、magnitudeとscoreに加えて、文ごとにもそれぞれ表示してくれているのがありがたいですね。
(わかりにくいですが、textは全部連結されて一つの文字列になっているので、GCPが自動的に分けてくれたものになります。)

‘メロスは激怒した。’ の score -0.1 より、
‘メロスには政治がわからぬ。’ の score -0.5 の方がネガティブと判定されているのですね。

結果の解釈については、
感情分析の値の解釈
という文書があるのでこちらを読んでおきましょう。
スコアが0.0付近のものの解釈などかなり重要な情報も含まれます。

GCPの無料トライアル開始

AWSだけでなくGCPのMLサービスも自宅環境で試したくなったので、アカウント作成することにしました。

1. GCPのページにアクセス。
2. 「無料で開始」ボタンをクリック。
3. 国を選び、利用規約を読んで「続行」をクリック。 (Google アカウントはログイン済みで作業しました。)
4. お支払いプロファイルの選択。
AdSene用のプロファイルがあったのでそれを選びました。ない場合はおそらく新規に作るのだと思います。
5. アカウントの種類は個人。名前と住所は入力されていたので確認のみ。
6. 支払い方法でクレジットカード番号を入力

これで無料トライアル開始になったようです。

メッセージには次の様に出てきました。

ご登録いただきありがとうございます。無料トライアルには、12 か月間有効の $300 分のクレジットが含まれています。クレジットを使い切ってもご心配はいりません。自動請求を有効にするまで課金されることはありません。

(個人利用はAWSをメインに使ってるので、)試す分には$300を使い切ることはなさそうです。
ただ、12ヶ月経ったら有効にしないと有料のAPIは使えなくなるのかもしれませんね。
しっかり覚えておく必要がありそうです。

GCPでは利用の際に最初にプロジェクトを作ると本で読んだのですが、
「My First Project」 というプロジェクトが自動的に作成されていました。
特にプロジェクト名にこだわりはないのでしばらくこれを使っていこうと思います。

ついでに 「Cloud Natural Language API」 を有効にしたのでこれの使い方は今後の記事で書いていきます。

認証情報を取得しないとAPIを使えないので次にそれを行います。

1. 「APIの概要」に移動。
2. 左ペインの「認証情報」をクリック。
3. 「認証情報を作成」を選択。
4. APIキーを作成。

おそらくこれで使えるはず。