1.はじめに
・特許分類(コード)の定義を参照する際には、いつもJ-platpatの特許分類情報からコードを指定して対応する定義を見ている。 が、すごく面倒くさい時がある。(沢山のコードの定義を参照しなければいけない時など)。 コードを指定すると、さっと特許分類の定義を返してくれるAPIがあると嬉しいので、作ってみた。↓
・ 例:5K030GA02の上位階層含めた定義がほしい場合:
https://us-central1-friendly-be550.cloudfunctions.net/get_fterm_def?ft=5K030GA02&is_tree=y
2.構成
こんな感じ↓
Client<-->CloudFunctions<--->BigQuery
ClientはAPIの引数にコード情報を入れればいい。 引数は3つ
引数説明デフォルト例ftFターム'5K030GA02is_tree最上位の定義から取得するかyy or nversionFタームのバージョン2021002←202102の間違え
(※)なお特許分類は階層構造(住所みたいな感じ)で定義されているので、ピンポイントで定義情報をとっても意味不明なことがある(ex:「断熱性」という文字が帰ってきてもよくわからない)。そのため、定義そのものに加えて、階層の最上位の定義から定義を取得できるようにした。
ex:5K030GA02を取得したいとして
https://us-central1-friendly-be550.cloudfunctions.net/get_fterm_def?ft=5K030GA02&is_tree=y
戻り値(階層あり定義)はこんな感じに。
目的効果(観点00はフリーワード付与)⇒高速化⇒伝送遅延時間の短縮
https://us-central1-friendly-be550.cloudfunctions.net/get_fterm_def?ft=5K030GA02&is_tree=n
だと、戻り値(階層なし定義)はこんな感じに。
伝送遅延時間の短縮
最初にもくろんでいた感じにできた。 スプレッドシート関数で、=IMPORTDATA([url])を使えば、ほしいコードを指定すると、対応する定義が表示できた!
以下、各作成段階の説明
2.1 特許分類の定義ファイル取得
特許庁のバルクデータに申し込んで取得した特許分類の定義情報から、Fタームの定義ファイルを取得して、下記のような感じのcsvファイルを作成。 def_treeは、特許分類が階層構造を持っていることを考慮して、最上位の階層からの定義を取得できるようにしている。 一番細かい階層だと40万行ほどあった。
2.2 Bigqueryに投入
そんなに複雑な構造でないので、csvファイルをGCSにアップロードしてからUI経由で投入。↓投入後
2.3Cloudfunctions作成
python3.8で作成。
#main.py
from flask import jsonifyfrom google.cloud
import bigqueryimport google.auth#import os #os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "./cred.json"
def get_fterm_def(request):
request_args = request.args
if request_args and 'ft' in request_args:
ft = request_args['ft']
else:
ft = '5K030GA02'
if request_args and 'is_tree' in request_args:
is_tree = request_args['is_tree']
else:
is_tree = 'y'
if request_args and 'version' in request_args:
version = request_args['version']
else:
version = '2021002'
if is_tree == 'y':
QUERY = (' SELECT tree_def '' FROM `[project-id.dataset].fterm` '' WHERE ipc = "' + ft + '"'' AND CAST(version AS STRING) = "' + version + '"')
col = "tree_def";
else:
QUERY = (' SELECT def '' FROM `[project-id.dataset].fterm` '' WHERE ipc = "' + ft + '"'' AND CAST(version AS STRING) = "' + version + '"')
col = "def"
bq_client = bigquery.Client.from_service_account_json('./cred.json')
query_job = bq_client.query(QUERY)
defdf = query_job.result().to_dataframe()
deftext = "".join(defdf[col].tolist())
return deftext
#requirements.txt
google-cloud-bigquery==2.13.1pandas==1.2.3pandas-gbq==0.14.1pyarrow==3.0.0XlsxWriter==1.3.7
ちょっと迷ったのがBigqueryをCloudFunctionsから呼び出すところ。 GCP > APIs & Services > Credentials でサービスアカウントキーを作成する&権限周りで少し躓く。 ↓ サービスアカウントキーをCloud Functionsのアップロード先にアップロード。 ※cred.jsonというやつ。
なお、サービスアカウントキーを作る画面で、セキュリティリスクがあるので、Workload Identity Federationを使えと 言ってくれている。Workload Identity Federationがまだよくわからないので、今後の課題。
Service account keys could pose a security risk if compromised. We recommend you avoid downloading service account keys and instead use the Workload Identity Federation . You can learn more about the best way to authenticate service accounts on Google Cloud here .
3.今後
バージョンがちょこちょこ変わる(一部のコードの改廃や追加など)に対応してデータ追加
BigQueryへのデータ追加の自動化
BigQueryの列名などがおかしいので要修正
CPC,FI,IPCも同様にAPI化 など。。
Comentarios