top of page

Graph Embeddingを使った出願人名寄せ(後半)

更新日:3月29日

1.はじめに

  • 間が空きましたが、出願人の名寄せの続きです。

  • 前回はPyTorchBigGraphで名寄をやりたいと宣言してたのですが、実際にモデルを作ってみようと思います。


2.トレーニング

  • Google patents public datasetからデータ取得⇒polars⇒(データ加工)⇒モデル作成⇒試しという流れです。

  • 久々にpolars使いましたが、explodeなどすごくいいですね。速度もpandasに比べてすごく速いです。


(1)データ取得

  • さくっとBigQueryで。出願番号をキーに、出願人、IPC、優先権主張番号、発明者名を取得しました。ちなみに出願人が、生のデータっぽい列(assignee)とdatasetに入れる際に成形した列(assignee_harmonized)があったので、成形したデータを利用します。

from google.cloud import bigquery 
client = bigquery.Client(project="***") 
import polars as pl  
QUERY = """ 
SELECT main.application_number, ARRAY_AGG(DISTINCT ipcs.code) as IPC, ARRAY_AGG(DISTINCT appl1) AS applicants1, 
ARRAY_AGG(DISTINCT appl2.name) AS applicants2,
ARRAY_AGG(DISTINCT pri_claim.application_number) as priority,
ARRAY_AGG(DISTINCT inventors.name) as inventors
FROM `patents-public-data.patents.publications` as main
,UNNEST(ipc) as ipcs
,UNNEST(assignee) as appl1
,UNNEST(assignee_harmonized) as appl2
,UNNEST(priority_claim) as pri_claim
,UNNEST(inventor_harmonized) as inventors
WHERE SUBSTR(main.application_number,0,2) = "JP" 
AND main.filing_date >= 20000101 
GROUP BY main.application_number 
"""  
job_config = bigquery.QueryJobConfig() 
query_job = client.query(QUERY)
rows = query_job.result()
df = pl.from_arrow(rows.to_arrow())

2000年以降のJP出願を取得しました。



(2)データ加工

  • これを、1行で出願人ー属性ー関係性を表すファイルに加工します。polars様様です。


df_net = pl.concat([
df.select("applicants2","IPC").explode("applicants2").explode("IPC").with_columns(relation = pl.lit('ipc')).rename({"applicants2": "lhs-col","IPC":"rhs-col"}),
df.select("applicants2","priority").explode("applicants2").explode("priority").with_columns(relation = pl.lit('priority')).rename({"applicants2": "lhs-col","priority":"rhs-col"}),
df.select("applicants2","inventors").explode("applicants2").explode("inventors").with_columns(relation = pl.lit('inventor')).rename({"applicants2": "lhs-col","inventors":"rhs-col"})
])

df_net = (df_net
    .with_columns(pl.col("lhs-col").str.replace_all(" ", "_"))
    .with_columns(pl.col("rhs-col").str.replace_all(" ", "_"))

)

df_net.write_csv("data/edgelist.tsv",separator="\t")

  • このような形式



  • BigGraph用のフォルダを作り、

#Biggraph用のディレクトリづくり
!rm -rf data
!rm -rf model
!mkdir data
!mkdir data/edg
!rm -rf data/*.tsv

  • train,test,validに分けます。

from sklearn.model_selection import train_test_split
X_train, X_test = train_test_split(df_net, test_size=0.8, random_state=1)
X_train, X_val = train_test_split(X_train,test_size=0.2, random_state=1)


X_train[0:len(X_train)].write_csv("data/edg/train.tsv",separator="\t")
X_test[0:len(X_test)].write_csv("data/edg/test.tsv",separator="\t")
X_val[0:len(X_val)].write_csv("data/edg/valid.tsv",separator="\t")

  • トレーニング用のデータを準備して、

#@title データ準備
#relationが無い場合は、m--rel-col=1,configの dynamic_relations=Trueとする。
!torchbiggraph_import_from_tsv \
  --lhs-col=0 --rel-col=2 --rhs-col=1 \
  config.py \
  data/edg/train.tsv \
  data/edg/valid.tsv \
  data/edg/test.tsv
  • こんな感じです。



(3)モデル作成

  • トレーニング開始します。

#@title TRAINING
!torchbiggraph_train \
  config.py \
  -p edge_paths=data/train.tsv

  • GPU(T4)を使いたかったのですが、configの設定を色々変えてもMemoryが足らずにクラッシュするので、CPUで実行します。



!nvidia-smi -q -d MEMORY #GPU確認
#@title TRAINING
!torchbiggraph_train \
  config.py \
  -p edge_paths=data/train.tsv

  • 20-30時間ほどかかりそうです。



3.実験

作成中です。


  • colab proで24時間の制限に引っかかり、データがすべて消えました(泣)

  • しょうがないので、colabo enterpriseに切り替え、メモリを沢山積んで再実行します。

  • 課金が怖いですが予定では3〜4時間で終わるはず。



  • 3時間後、無事にトレーニング完了。

  • embeddingデータを読み込んでみます。configで設定したように400次元で埋め込み表現が作成されています。

#@title embデータ取り出し
import polars as pl
import h5py
with h5py.File("./model/embeddings_all_0.v50.h5", "r") as hf:
    embedding = hf["embeddings"][:, :]


embdf = pl.from_numpy(embedding)

print(embdf.shape)
#(8717820, 400)

類似関数は適当に作成して、早速出願人名で出力してみます。

nodedf = pl.read_csv("./data/entity_names_all_0.json",skip_rows=1,has_header=False)
nodedf
nodedf = nodedf.select(
    [pl.col("column_1").alias("uuid")]
)

strt = nodedf[0:len(nodedf)-1].to_pandas()



import pandas as pd
topN =20
query = "CANON_KK"
simdf = get_recommend(query,embedding,strt,topN=topN)
#recom_df = pd.DataFrame(get_recommend(query,embedding,strt,topN))



query = "SSST_CO_LTD"



query = "KIRIN_KK"

query = "JANOME_CORP"



・・・類似企業が入ってしまっている!

  • 考えたら、IPCのつながりが類似するのも入ってしまっているので、IPC情報を使うと類似企業も入ってきてだめですね・

  • ということで、優先権と発明者名のみを使う形に修正してやりなおします。(課金のことは考えず)


再挑戦:優先権と発明者名のみ使った場合のもの(発明者名と優先権番号を除きました)

query = "CANON_KK"

query = "SSST_CO_LTD"



query = "KIRIN_KK"


query = "JANOME_CORP"

query="NESTLE_SA"


・・・なんかイメージしたものと違いました。発明者名が悪いのかもですが、PANASONIC⇔MATSUSHITA ELEC~のように発明者が被っている企業が抽出できて、名寄できるといいと思ってたのですが。他に名寄せに使えそうな情報をとりこめないか検討していこうと思います。

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

最新記事

すべて表示

JPOの固定リンク作成機能

1.固定URL化 特許庁からのお知らせで、特許庁の文献への固定URLが簡素化されると記載されています。 さっそくアジア特許情報研究会の方がエクセルで固定URLを生成できるものを作っていたので、スプレッドシートでも生成できるようにしてみました。 2.結果 =generatePatentDocumentUrl(documentNumber, language)という感じで入れればかえって来ます。sou

Comments


bottom of page