This post is Private. Only a writer or those who know its URL can access this post.

#機械学習名古屋 勉強会#12 ハンズオン資料 (3)

More than 1 year has passed since last update.

目次

5. サービスアカウントの設定

Web アプリに組み込む場合などは、API キーを利用するより、サービスアカウント を設定してサービスキーからの OAuth 認証を利用した方がより安全です。
また Python 等の Google Cloud クライアントライブラリも、サービスアカウントを利用した認証に対応しているので、こちらを利用した方が便利です。
ということでサービスアカウントを設定します。

ダッシュボードから「IAM と管理」→「サービスアカウント」を選択。

GCP-0030.png

GCP-0031.png

「サービスアカウントを作成」をクリック

GCP-0032.png

適切な名前を入力し、適切な役割を選択します。
ここでは "ML Engine Viewer" のみ選択しました。

GCP-0033.png

「新しい秘密鍵の提供」に(チェックが入っていなかったら)チェックを入れ、キーのタイプとして「JSON」を選択(デフォルトで選択済のはず)、「作成ボタン」をクリック。

↓ (数秒〜数十秒待ちます)

しばらくすると、.json ファイルのダウンロードを求められるので、適切なファイル名でダウンロードします。
ここでは、"key.json" というファイル名でローカルに保存します。

key.json ファイルの中身は以下のようになっています:

key.json(sample)
{
  "type": "service_account",
  "project_id": "mlngy-201709",
  "private_key_id": "《ID文字列》",
  "private_key": "-----BEGIN PRIVATE KEY-----\n《中略》\n-----END PRIVATE KEY-----\n",
  "client_email": "handson-20170902@mlngy-201709.iam.gserviceaccount.com",
  "client_id": "《ID文字列》",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/handson-20170902%40mlngy-201709.iam.gserviceaccount.com"
}

【重要】 このファイルには、秘密鍵(エンコードしたもの)が含まれています(上記サンプルの《中略》の部分)。このファイルの扱いには十分注意してください。例えば GitHub 等公開リポジトリには絶対に上げないよう注意しましょう。

※一度サービスアカウントを作成すると、サービスキーは後で追加作成することも出来ます。例えばWebアプリの場合、「デプロイするサーバ毎にサービスキーを生成する」「一定期間(毎日とか)ごとにサービスキーを作成しなおし入れ替える」等の運用が可能です。

6. Python 用ライブラリのインストール

Python 用 Google Cloud クライアント ライブラリ をインストールして、Python コードの中から Google Natural Language API を呼び出せるようにします。

※必要に応じて、pyenv/virtualenv/anaconda 等で GCP 用の仮想環境を作成しても良いです。
 この記事では、少なくとも pip がインストール済で、pip コマンドでアクセスできるという前提で進めます。

お手元のシェル環境で、以下のコマンドを実行。

pip install -U pip # 念のため
pip install -U google-cloud-language google-api-python-client

※ Google Natural Language API を利用するだけなら、google-cloud-language だけインストールすればOK。google-api-python-client はその他のAPIも利用するときのためのものです。

7. Python から API リクエスト

6.節で導入した Google Cloud クライアントライブラリを利用して、Python コード上で API をリクエストしてみます。

まず事前に、環境変数 export GOOGLE_APPLICATION_CREDENTIALS に、5.節でダウンロードした key.json のパスを設定しておきます。
以下は bash(Mac/Linux/その他)の例です。

export GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json

もしくは、Python スクリプトを実行するディレクトリ(カレントワーキングディレクトリ)に配置して、先頭の方で以下のように指定する方法もあります。

import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = os.path.join(os.getcwd(), "key.json")

以下に、Natural Language API を一通り呼び出して結果を表示するサンプルコードを示します。

MLN_201709_sample.py
# coding: utf-8
# import os
# os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = os.path.join(os.getcwd(), "key.json")

from google.cloud import language

# Instantiates a client
client = language.Client()

# The text to analyze
text = u'日本人は「縁の下の力持ち」という言葉が大好きだが、日本ほど「縁の下の力持ち」的な職業の人たちの待遇が悪い先進国はない。'
document = client.document_from_text(text)

# call All APIs
annotate_response = document.annotate_text(
    include_sentiment=True,
    include_syntax=True,
    include_entities=True)

# Sentiment
sentiment = annotate_response.sentiment
print((sentiment.score, sentiment.magnitude))
# => (-0.9, 0.9)

# Entities
for entity in annotate_response.entities:
    print('=' * 20)
    print('         name: {0}'.format(entity.name))
    print('         type: {0}'.format(entity.entity_type))
    print('     metadata: {0}'.format(entity.metadata))
    print('     salience: {0}'.format(entity.salience))
# => ====================
#             name: 縁
#             type: OTHER
#         metadata: {}
#         salience: 0.17860587
#    ====================
#             name: 日本
#             type: LOCATION
#         metadata: {'wikipedia_url': 'https://en.wikipedia.org/wiki/Japan', 'mid': '/m/03_3d'}
#         salience: 0.1564701
#    ====================
#             name: 力持ち
#             type: OTHER
#         metadata: {}
#         salience: 0.1523732
#    :《以下略》

# Tokens
for token in annotate_response.tokens:
    print((token.edge_index, token.edge_label, token.lemma, token.text_begin, token.text_content))
# => (14, 'ADVPHMOD', '日本', 0, '日本')
#    (0, 'SUFF', '人', 2, '人')
#    (0, 'PRT', 'は', 3, 'は')
#    (8, 'P', '「', 4, '「')
#    (6, 'NN', '縁', 5, '縁')
#    (4, 'PRT', 'の', 6, 'の')
#    (8, 'NN', '下', 7, '下')
#    (6, 'PRT', 'の', 8, 'の')
#    (14, 'NSUBJ', '力持ち', 9, '力持ち')
#    (8, 'P', '」', 12, '」')
#    (8, 'PRT', 'という', 13, 'という')
#    (8, 'APPOS', '言葉', 16, '言葉')
#    (8, 'PRT', 'が', 18, 'が')
#    :《以下略》

Jupyter Notebook での実行結果(nbviewer)

簡単に解説:

  • client = language.Client() でクライアントオブジェクトを生成。
  • document = client.document_from_text(text) で、テキストドキュメントオブジェクトを生成。
    client.document_from_html(html) も用意されています(HTMLドキュメントオブジェクトを生成、引数はHTMLテキスト(URLではない))
  • annotate_response = document.annotate_text() で、GCP API をリクエストして結果を取得。
    どの API を利用するかを名前付き引数で指定できます(無指定か False 指定で無効)
    • エンティティ分析と感情分析は、個別にリクエストする document.analyze_entities()/document.analyze_sentiment() メソッドも用意されています。

この例では、感情分析、エンティティ分析、構文解析 のすべてを1つのメソッドでリクエスト・結果取得しています。
日本語でも当たり前のようにエンティティ分析も構文解析もできています。

テキストを色々変更して試してみましょう。

※発展:Twitter API 等と組み合わせ、ネット上から拾った文章を解析したりするのも面白いと思います。

参考リンク

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.