![見出し画像](https://assets.st-note.com/production/uploads/images/143131265/rectangle_large_type_2_a2ba0f8bd3001b8dd4225f6e5436753f.png?width=800)
よくわかる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とをつなぐために外部接続という機能を使います。以下に従って外部接続を作成します。
![](https://assets.st-note.com/img/1717632170778-f4NWYlhNIo.png?width=800)
BigQueryのエクスプローラーのメニューから追加をクリックします。外部データソースへの接続を選択します。
![](https://assets.st-note.com/img/1717633526908-XqYGxyB5jD.png?width=800)
接続タイプを「Vertex AI リモートモデル、リモート関数、BigLake(Cloud リソース)」にし、接続IDに任意の名前をつけて接続を作成します。
![](https://assets.st-note.com/img/1717633552279-BUsg7vncdU.png)
外部接続が作成されました。
![](https://assets.st-note.com/img/1717633568866-JMhAKcpE8d.png?width=800)
サービスアカウントに権限付与
外部接続で作成されたサービスアカウントにCloud Run起動元の権限を付与します。(Cloud Functions第1世代を使用する場合はCloud Functions起動元の権限を付与します。)
![](https://assets.st-note.com/img/1717633589950-24qjkgHJdG.png)
Natural Language APIの有効化
Natural Language APIが有効化されていない場合は、以下リンクのAPIを有効にするボタンをクリックしAPIを有効化しておきます。
https://cloud.google.com/natural-language/docs/setup?hl=ja#api
![](https://assets.st-note.com/img/1717633607192-ah2IefU4dp.png?width=800)
Cloud Functionsの作成
Cloud Functionsを作成します。
任意の関数名をつけ、トリガータイプはHTTPSの認証が必要、ランタイムでメモリ1GB、CPU1に設定して「次へ」をクリックします。
![](https://assets.st-note.com/img/1717633638647-yW8kYchY3u.png)
今回はインラインエディタでコードを記載してデプロイします。
ランタイムはPythonで、エントリポイントはnatural_langage_apiにします。
![](https://assets.st-note.com/img/1717633659512-g9FeneRje6.png?width=800)
コードの内容は以下です。
```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に以下の小売店舗のレビューサンプルを作ってもらいました。
![](https://assets.st-note.com/img/1717633685690-AFST0U2qZM.png?width=800)
以下の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
```
以下のような結果が返ってきます。
![](https://assets.st-note.com/img/1717633704247-jYHjXIXogj.png?width=800)
感情分析の値については以下のようです。
- 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://assets.st-note.com/img/1717633721959-3Vty8DFs4I.png?width=800)
参考資料
[リモート関数を使用する](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
この記事が気に入ったらサポートをしてみませんか?