top of page

特許データベースを日本語で検索する

1.はじめに

  • 特許データべースは通常SQLで検索します。

ex:キヤノン株式会社の特許件数を調べる。

SELECT COUNT(*) FROM {データベース} WHERE applicant_name = "キヤノン株式会社"
  • LangChain+LLMでこれを言葉で検索できるようなので、試してみました。


2.スクリプト

  • まずはおきまりのもの。


!pip install openai --upgrade
!pip install langchain --upgrade
import os
os.environ["OPENAI_API_KEY"] = "****"


from langchain.agents import create_sql_agent
from langchain.agents.agent_toolkits import SQLDatabaseToolkit
from langchain.sql_database import SQLDatabase
from langchain.llms.openai import OpenAI
from langchain.agents import AgentExecutor


  • LangChainのサイトを参照しつつ、BigQueryから取り出した特許データを、sqliteに投入します。

import sys
import pandas as pd
import  sqlite3

BigQueryからデータ取得
from google.cloud import bigquery
project_id="*****"
client = bigquery.Client(project=project_id)

# 実行するクエリ
query2 =  """
SELECT app_num as application_number
    ,acai_app_dt as application_date
    , H_APPLICANT as applicant_name
    ,FTdef,wipo_clas
FROM {projectid}.{dataset}.{table}
"""

query_job = client.query(query2)
rows = query_job.result()

df = rows.to_dataframe()

  • こんな感じで出せます。2000年以降の出願で約700万行


  • これをsqliteに変換。pandasではとても簡単に変換できます。


file_sqlite3 = "./patentdata.db"
conn = sqlite3.connect(file_sqlite3)

df.to_sql('patentdata',conn,if_exists='append',index=None)

conn.close()

  • 最後にAgentを作成。これに言葉で問い合わせできます。



#@title Agent作成
db = SQLDatabase.from_uri("sqlite:///patentdata.db")
toolkit = SQLDatabaseToolkit(db=db)

agent_executor = create_sql_agent(
    llm=OpenAI(temperature=0),
    toolkit=toolkit,
    verbose=True
)


3.試し


例1:

agent_executor.run("""
キヤノン株式会社の2020年の出願件数を教えてください。
出願日情報はapplication_dateに入っています。
データは日本語がはいっています。
半角と全角で出願人名を調べてください。
""")



Agentoが考え出したクエリです。

SELECT COUNT(*) FROM patentdata WHERE applicant_name LIKE '%キヤノン%' AND application_date LIKE '2020%' The query looks correct, I should execute it


例2:

agent_executor.run("""
出願人がキヤノン株式会社であって、かつ生物材料分析に関する出願を検索してレコード件数を教えてください。
技術情報はwipo_clasに入っています。
データは日本語がはいっています。
半角と全角で出願人名を調べてください。
""")




Agentoが考え出したクエリです。



SELECT COUNT(*) FROM patentdata WHERE applicant_name LIKE '%キヤノン株式会社%' AND wipo_clas = '生物材料分析' 

・・・
Final Answer: 181件



例3:


agent_executor.run("""
出願件数上位10位の出願人とその出願件数を教えてください。

""")


> Finished chain.
キヤノン株式会社は171176件、パナソニックホールディングス株式会社は155199件、トヨタ自動車株式会社は121813件、株式会社東芝は111129件、セイコーエプソン株式会社は109875件、三菱電機株式会社は104369件、株式会社リコーは97926件、ソニーグループ株式会社は79518件、シャープ株式会社は79224件、株式会社デンソーは68798件の出願件数で上位10位の出願人です



Agentが考えたクエリです。


SELECT applicant_name, COUNT(application_number) AS application_count FROM patentdata GROUP BY applicant_name ORDER BY application_count DESC LIMIT 10;


結構いけますね!テキストデータもAgent経由で検索できるようにすれば、いい感じの応答システムにできそうです。


チャットボットにもしてみました。サイト右下をご覧ください(作成中)。

閲覧数:356回0件のコメント

最新記事

すべて表示

Comments


bottom of page