見出し画像

よくわかるGoogleCloud#3_BigQuery remote functionsを使って分かち書きと感情分析する

皆様こんにちは。
本日もカホエンタープライズのnoteをご覧いただきありがとうございます!

4月からお届けしている、Google Cloudの活用方法をお伝えするシリーズ。本日は第3弾となります!

今回使用するツールは、Google BigQueryのremote frunctionsです。
こちらは、Cloud Functions、Cloud Runの関数をBigQueryから呼び出す機能となっております。
Natural Language APIを使用したCloud Functionsを作成し、分かち書きと感情分析を同時にBigQueryから実行してみます。



外部接続の作成

BigQueryとCloud Functionsとをつなぐために外部接続という機能を使います。以下に従って外部接続を作成します。

BigQueryのエクスプローラーのメニューから追加をクリックします。外部データソースへの接続を選択します。

接続タイプを「Vertex AI リモートモデル、リモート関数、BigLake(Cloud リソース)」にし、接続IDに任意の名前をつけて接続を作成します。

外部接続が作成されました。


サービスアカウントに権限付与

外部接続で作成されたサービスアカウントにCloud Run起動元の権限を付与します。(Cloud Functions第1世代を使用する場合はCloud Functions起動元の権限を付与します。)


Natural Language APIの有効化

Natural Language APIが有効化されていない場合は、以下リンクのAPIを有効にするボタンをクリックしAPIを有効化しておきます。
https://cloud.google.com/natural-language/docs/setup?hl=ja#api


Cloud Functionsの作成

Cloud Functionsを作成します。
任意の関数名をつけ、トリガータイプはHTTPSの認証が必要、ランタイムでメモリ1GB、CPU1に設定して「次へ」をクリックします。

今回はインラインエディタでコードを記載してデプロイします。
ランタイムはPythonで、エントリポイントはnatural_langage_apiにします。

コードの内容は以下です。

```requirements.txt
functions-framework==3.*
google-cloud-language==2.12.0
```

```python:main.py
import functions_framework
import json
from flask import Flask, request, jsonify
from google.cloud import language_v1

client = language_v1.LanguageServiceClient()

def sample_analyze_syntax(text_content):
    # Available types: PLAIN_TEXT, HTML
    type_ = language_v1.Document.Type.PLAIN_TEXT

    # Optional. If not specified, the language is automatically detected.
    # For list of supported languages:
    # https://cloud.google.com/natural-language/docs/languages
    language = "ja"
    document = {"content": text_content, "type_": type_, "language": language}

    # Available values: NONE, UTF8, UTF16, UTF32
    encoding_type = language_v1.EncodingType.UTF8

    response = client.analyze_syntax(
        request={"document": document, "encoding_type": encoding_type}
    )

    # Loop through tokens returned from the API
    tokens = [s.text.content for s in response.tokens]
    
    sentiment_response = client.analyze_sentiment(document=document)
    return [{
        "separated_text": tokens,
        "magnitude": sentiment_response.document_sentiment.magnitude,
        "score": sentiment_response.document_sentiment.score
    }]

@functions_framework.http
def natural_langage_api(request):
  try:
    return_value = []
    request_json = request.get_json()

    calls = request_json['calls']
    for call in calls:
      for text in call:
          return_value.append(sample_analyze_syntax(text))
    return_json = jsonify( { "replies":  return_value } )
    return return_json

  except Exception as e:
    return jsonify( { "errorMessage": str(e) } ), 400

```


BigQueryにremote funcionsを作成する

以下のSQLを実行します。
<dataset>.<function_name>は任意の値を設定してください。
<connection_name>は作成したロケーション.外部接続の名称を設定します。(例:us.conn_functions)
<cloud_functions_url>は作成したcloud functionsのエンドポイントのURLを設定します。

```sql:
CREATE OR REPLACE FUNCTION <dataset>.<function_name>(value STRING) RETURNS JSON
REMOTE WITH CONNECTION `<connection_name>`
    OPTIONS (
        endpoint = '<cloud_functions_url>'
    )
;

```


実行

claude 3 Opusに以下の小売店舗のレビューサンプルを作ってもらいました。

以下のSQLを実行します。
(<~>の部分は適切に変換してください。)

```sql:
SELECT 
  text, 
  res[0].score, -- cloud functionsのリターンに合わせる
  res[0].magnitude, -- cloud functionsのリターンに合わせる
  REPLACE(JSON_EXTRACT_SCALAR(text_element, '$'), '"', '') AS text_element
FROM (
    SELECT
      <テキスト列名>, 
      <dataset>.<remote_functions_name>(<テキスト列名>) AS res 
    FROM 
      <dataset>.<table_name>
)
,UNNEST(JSON_EXTRACT_ARRAY(res[0].separated_text)) AS text_element
```

以下のような結果が返ってきます。

感情分析の値については以下のようです。
 - score: -1.0(ネガティブ)~1.0(ポジティブ)のスコアで感情が表されます。これは、テキストの全体的な感情の傾向に相当します。
 - magnitude: 指定したテキストの全体的な感情の強度(ポジティブとネガティブの両方)が 0.0~+inf の値で示されます。score と違って、magnitude は documentSentiment に対して正規化されていないため、テキスト内で感情(ポジティブとネガティブの両方)が表現されるたびにテキストの magnitude の値が増加します。そのため、テキスト ブロックが長いほど、値が高くなる傾向があります。

| 感情 | サンプル値 |
|:--|:--|
| 明らかにポジティブ | "score":  0.8, "magnitude": 3.0 |
| 明らかにネガティブ | "score":   -0.6, "magnitude": 4.0 |
| ニュートラル | "score":   0.1, "magnitude": 0.0 |
| 混合 | "score":   0.0, "magnitude": 4.0 |

ここまで出来たら、TableauをはじめとするBIツールを使って、色々可視化してみてください!
ワードクラウドの形式が定番だと思いますが、その他にも様々な方法があると思います!


参考資料

[リモート関数を使用する](https://cloud.google.com/bigquery/docs/remote-functions?hl=ja#sample-functions-code)
[文字列の構文の分析](https://cloud.google.com/natural-language/docs/samples/language-syntax-text?hl=ja)
[感情分析のチュートリアル](https://cloud.google.com/natural-language/docs/sentiment-tutorial?hl=ja)


カホエンタープライズについて

当社はホームセンター「グッデイ」におけるDX化の経験をもとに、データ活用に関する実績及び様々な支援メニューを用意しております。
今回ご紹介したTableau関連の御支援はもちろんのこと、他にも様々な知見がございます。
データ活用・管理に関してお困り等ございましたら、是非お気軽にご相談ください!
⇩詳細はホームページをご覧ください!


事業内容:
① データ活用に関する御支援
・ Tableauライセンス提供
・ Tableau導入に関する支援/ダッシュボード画面構築支援
・ データ分析基盤(データウェアハウス)構築及び運用支援
・ Tableau操作トレーニング
・ Tableau内製化に向けた伴走支援
・ AI等最新クラウドサービスの活用支援
② クラウドサービス活用支援
・ Google Workspaceライセンス販売
・ Google Workspace導入支援
・ Google Workspace操作トレーニング
③ クラウド型分析サービス(KOX)導入支援
④ DX人材育成サービスの提供

<問い合わせ先>
株式会社カホエンタープライズ
担当者:湯野 礼之輔(ゆの れいのすけ)
Mail:sales@kaho-enterprise.co.jp
TEL:070-8814-5939


この記事が参加している募集

#オープン社内報

22,582件

#企業のnote

with note pro

12,529件

この記事が気に入ったらサポートをしてみませんか?