見出し画像

Google ColabでPatentfieldAPIを使用したAI分類予測

こんにちは、Patentfieldの公式noteです。
この記事では、PatentfieldのAI分類予測をAPIで利用する方法について、解説します。

1.AI分類予測とは

AI分類予測は、予めユーザーがセットした教師データに基づいて、任意の検索結果や母集合について、AIが分類を予測してくれます。例えば、任意の検索結果について、【自社事業に関連する/しない】といった分類や、SDIの新着公報について、【どの開発テーマに関連するか】等、今まで人が公報を読み込んで仕分けしていた作業を、数秒以内でAIが自動で分類し、大幅な作業効率を図ることができます。
教師データには、出願番号/公報番号またはテキストデータを、最大1万件まで入力することができます。入力した教師データに基づいて、約数秒~10秒以内に機械学習させた独自のモデルを生成し、最大10万件までの任意の検索結果について分類予測を実施し、予測スコアを算出します。
予測スコアによって、調査テーマと関係ないノイズとなりうる文献の順位を下げたり、興味のある文献を上位に表示させたりすることができ、効率的に調査することができます。


AI分類予測

2.事前準備

・PatentfieldのAPIトークン(APIトークンがなくても、実行環境の構築までは可能です)
※PatentfieldのAPIサービスは有料オプションですが、無料トライアルも随時受付しています。ご興味あれば、APIトークンを発行しますので、下記URLからぜひお問合せください。
https://patentfield.com/apply

3.プログラミング言語、開発環境

・プログラム言語:Python
・開発環境:Google Colab
Google Colab(名称:Google Colaboratory)は、ブラウザベースの無料の開発環境で、Googleアカウントがあればインストール不要で、Pythonプログラミングを簡単に始めることができます。

4.作成したもの

今回作成したものを実行すると、以下のような出力が得られます。
AIに分類を予測させたい公報番号を入力すると、予めセットした教師データに基づいてAI自動分類予測が実行され、右側に予測ラベルが表示される簡単なWEBアプリケーションです。

作成したもの(Gradio)

予測ラベルは、2値分類、多値分類、多ラベル分類に対応していますので、様々な分類仕様に対応する事ができます。また、スコアが最も高い予測ラベルだけでなく、次点や次々点の予測ラベルもスコアと共に取得できますので、上手く活用すれば、分類精度をさらに高める事ができます。

Google Colab環境でPythonを使用して、PatentfieldのAPIにアクセスし、Gradioを使ってWebアプリ化しています。
Gradioは、機械学習モデルのデモを行うWebアプリケーションを簡単に作ることができるPythonのライブラリです。

5.実装

Google Calabでの実行手順は、次の通りです。

(1)ライブラリのインストール

# ライブラリインストール
!pip install requests
!pip install gradio

(2)ライブラリインポート

# ライブラリインポート
import os
import requests
import gradio as gr
import pandas as pd
from datetime import datetime, timedelta, timezone
from pydantic import BaseModel, Field
from typing import Optional, List

(3)Googleドライブマウント
APIから取得したデータをCSVファイルとして取得するために、Googleドライブをマウントします。

# Googleドライブマウント
from google.colab import drive
drive.mount('/content/drive')

(4)CSVファイル保存関数

# CSVファイル保存関数
def save_csv_to_drive(df, prefix):
    # タイムゾーンの生成
    JST = timezone(timedelta(hours=+9), 'JST')
    timestamp = datetime.now(JST).strftime("%Y%m%d%H%M%S")
    # CSVファイル名を生成(クエリとタイムスタンプを含む)
    csv_filename = f"{prefix}_{timestamp}.csv"
    # Googleドライブの保存先パスを設定
    drive_path = "/content/drive/My Drive/"
    full_path = os.path.join(drive_path, csv_filename)
    # DataFrameをCSVファイルとして保存
    df.to_csv(full_path, index=False, encoding="cp932", errors="ignore")
    return full_path

(5)作業グループ一覧取得
予め設定した作業グループ(教師データ)一覧情報を取得します。

# 作業グループ一覧取得関数
def acquire_workgroup(access_token):
    # Patentfield APIエンドポイント
    req_url = f'https://api.patentfield.com/api/v1/work_groups'
    # Patentfield APIリクエストヘッダー
    req_headers = {'Authorization': 'Token ' + access_token, 'Content-Type': 'application/json'}
    # API呼出
    response = requests.get(url=req_url, headers=req_headers)
    # APIレスポンス処理
    id_array = []
    title_array = []
    if response.status_code == 200:
        data = response.json()
        for attr in data:
            id_array.append(str(attr.get('id')))
            title_array.append(str(attr.get('title')))
        return str(response.status_code), id_array, title_array
    else:
        return str(response.status_code), [], []

(6)AI分類予測取得
分類を予測させたい公報番号リストを送信して、AIに分類予測をさせます。

# AI分類予測取得
# AcquireAiClassPredictionクラス定義
class AcquireAiClassPrediction(BaseModel):
    numbers: List[str] = Field(..., example="特開2023-135631")
    id_type: str = Field(default="pub_id")
    work_group: str = Field(default="12345")
    columns: Optional[List[str]] = Field(default=["pub_id_o", "predict_label", "predict_score", "predict_candidates", "predict_candidates_score", "apm_applicants", "title", "abstract"])

# AI分類予測取得関数
def acquire_ai_class_predection(item: AcquireAiClassPrediction, access_token):
    # Patentfield APIエンドポイント
    req_url = "https://api.patentfield.com/api/v1/patents/search"
    # Patentfield APIリクエストヘッダー
    req_headers = {"Authorization": "Token " + access_token, "Content-Type": "application/json"}
    # APIリクエストパラメータ
    req_params = {
        "numbers": [{"n": n, "t": item.id_type} for n in item.numbers],
        "work_group": item.work_group,
        "columns": item.columns
    }
    # API呼出
    response = requests.post(url=req_url, headers=req_headers, json=req_params)
    # APIレスポンス処理
    if response.status_code == 200:
        data = response.json()
        records = data.get('records', {})
        # Pandas DataFrameに変換
        df = pd.DataFrame(records)
        return str(response.status_code), df
    else:
        return str(response.status_code), pd.DataFrame()

(7)Webアプリ(Gradio)定義

# Gradioからの入力を使ってAiClassPredictionオブジェクトを構築
def acquire_ai_class_prediction_wrapper(numbers, id_type, work_group, access_token):
    all_records = []
    numbers_list = [number.strip() for number in numbers.split("\n") if number.strip()]  # 入力された特許番号をリストに変換
    item = AcquireAiClassPrediction(
        numbers=numbers_list,
        id_type=id_type,
        work_group=work_group
    )
    status_code, df = acquire_ai_class_predection(item, access_token)
    if not df.empty:
        all_records.append(df)
    if all_records:
        df_final = pd.concat(all_records, ignore_index=True)
        prefix = "AiClassPrediction"
        csv_filename = save_csv_to_drive(df_final, prefix)
        return status_code, df_final, csv_filename
    else:
        return "No data", pd.DataFrame(), None

# 作業グループ情報を更新するボタンのアクション
def on_update_button_clicked(access_token):
    status_code, ids, titles = acquire_workgroup(access_token)
    # Pandas DataFrameに変換
    df = pd.DataFrame({'分類モデルID': ids, '分類モデル名': titles})
    return df

# Webアプリ(Gradio)定義
with gr.Blocks() as app:
    gr.Markdown("AI分類予測")
    with gr.Row():
        with gr.Column():
            access_token = gr.Textbox(label="APIアクセストークン", lines=1, placeholder="APIのアクセストークンを入力してください")
            update_button = gr.Button("作業グループ情報更新", variant="primary")
            work_group_info = gr.Dataframe()
            work_group_id = gr.Textbox(label="分類モデルID", placeholder="分類予測を取得したい分類モデルIDを入力してください")
            numbers = gr.Textbox(label="公報番号",lines=10, placeholder="AI分類予測を取得したい公報番号を入力してください (例:特開2023-135631\n特開2023-138346 各公報番号は改行区切り)")
            id_type = gr.Radio(label="公報番号種別", choices=["app_id", "pub_id", "exam_id"], value="pub_id")
            submit = gr.Button("APIリクエスト送信",variant="primary")
            reset = gr.Button("リセット")
        with gr.Column():
            status_code_output = gr.Textbox(label="APIステータスコード", lines=1, interactive=False)
            response_output = gr.Dataframe()
            download_fpath = gr.Text(label="ダウンロードファイルパス")
    update_button.click(
        fn=on_update_button_clicked,
        inputs=[access_token],
        outputs=work_group_info
    )
    submit.click(
        fn=acquire_ai_class_prediction_wrapper,
        inputs=[numbers, id_type, work_group_id, access_token],
        outputs=[status_code_output, response_output, download_fpath]
    )
    reset.click(
        fn=lambda: ["", pd.DataFrame(), ""],
        inputs=[],
        outputs=[status_code_output, response_output, download_fpath]
    )

(8)Webアプリ(Gradio)起動
ここでWebアプリ(Gradio)を起動します。

# Webアプリ(Gradio)起動
app.launch(debug=True, height=1000)

Gradioが起動したら、最初に「作業グループ情報更新」ボタンを押して、予めブラウザ版のPatentfieldで設定した作業グループ(教師データ)情報を取得し、分類モデルIDを設定した後に、分類を予測させたい公報番号リストをまとめて貼り付けて「APIリクエスト送信」ボタンを押すと、AIによって予測された予測ラベルがスコア情報と共に表示されます。

Webアプリ(Gradio)実行画面

AI分類予測が付与された特許リストはGoogleドライブのMy Driveに「AiClassPrediction_{YYYYMMDDhhmmss}.csv」というファイル名で保存されています。

6.おわりに

Patentfieldとは

Patentfieldは、4つの機能(プロフェッショナル検索・データ可視化・AI類似検索・AI分類予測)を組み合わせて、ワンストップで総合的な検索・分析ができる『AI特許総合検索・分析プラットフォーム』です。
無料で検索もできるので、ご興味あればぜひアクセスください。

PatentfieldのAPIについて

PatentfieldのAPI連携サービスは、情報参照だけではなく、特許検索機能をはじめPatentfieldの各機能をAPI経由で連携することで、社内で運用しているグループウェアへの組み込みや、特許検索・分析の独自アプリケーションの開発が可能になります。
AIセマンティック検索やAI分類予測などのAI機能や、PFスコアや類似キーワードの取得などPatentfieldの多彩な機能を利用して、特許に関わる社内のニーズに合わせて最適なワークフローやアプリケーションを構築できます。
 
次回以降も、特許検索や分析実務で役立つ開発実装例を紹介していきます。
実践的なケーススタディを通じて、みなさまの知財業務変革のヒントになればと思います。

#Python
#Google Colab
#AI
#Patentfield
#特許
#知財
#知的財産