特許分類の定義情報をAPIで取得


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つ

引数 説明 デフォルト
ft Fターム '5K030GA02
is_tree 最上位の定義から取得するか y y or n
version Fタームのバージョン 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 jsonify
from google.cloud import bigquery
import 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.1
pandas==1.2.3
pandas-gbq==0.14.1
pyarrow==3.0.0
XlsxWriter==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化 など。。