ご挨拶
新年、明けましておめでとうございます
本年もよろしくお願いいたします
データエンジニアのaranです
昨年の6月以来、2回目の登場になります
去年の1月に入社して、ちょうど1年経ち
月日の流れの早さを感じています
いきなりですが、皆様は年末年始をどのように過ごされましたでしょうか?
私は、家族の1人が、1月2日誕生日なこともあり
年始は、家族全員が本家に集まります
月日の経過と共に、甥っ子・姪っ子も増え、彼らも歳を重ねて行くので
年始の出費が、年々厳しくなっています
(財布から諭吉がいっぱい消えてゆく・・・涙)
年始の出費が気にならないぐらい稼ぎたいって心に誓い、新年を過ごしました
前書き
前回はコレスポンデンス分析についてお話しさせて頂きましたが
今回は、BERTを使った文章検索についてお話しさせて頂きます
何でまた?
弊社では、特許情報を取り扱っていて
ある特定の業界・分野の特許群を検索することがあります
目的の特許を検索するには
J-PlatPatと同じように単語マッチングで検索することが多いのですが
見つけたい特許を検索するには
どの単語を選択し、どのような組み合わせ条件にするかが重要で
これには、高度なスキルと経験を必要とします
このスキルに依存する状況を、少しでも改善させるベく
ある分野に関する1つ特許の要約・請求項・詳細説明等の文章から
その分野に関連する特許一覧を検索できれば
検索品質の平準化と作業工数の削減が期待できます
そこで、文章分類・質問応答・固有表現抽出等で
公開当時の最高性能(SOTA: State of the Art)を達成した
BERTに目をつけ、特許検索に使えるかどうか遊んで検証してみました
BERTを触っていると言えると、カッコつけられるとかでは・・
BERTとは
BERT(Bidirectional Encoder Representations from Transformers)は
2018年10月にGoogleの研究チームが公開した言語表現モデルです
論文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
今回、BERTを利用するに辺り、こちらのサイトで勉強させて頂きました www.ogis-ri.co.jp
BERTの特徴を1つあげるとすれば
事前学習(ラベルが不要)、ファインチューニング(ラベルが必要)と
2段階の学習ができる構成になります
事前学習は、大量データが必要のため、学習時間もリソース(お金)も必要としますが
事前学習済みモデルがGitにて公開されています
お試し段階では、これは非常に助かります!!
今回は、こちらの学習済みモデルを利用しました
何のデータを使うの?
弊社は国内特許のみならず、海外特許も取り扱います
検索対象にする特許情報は、EPO(欧州特許庁)のPATSTAT データベースを利用しました
PATSTATは、100ヶ国以上の特許庁において公開された特許が
収録されている特許データベースになります
どんな事をやるの?
PATSTATは英語の特許が多いので
特許の要約(英文)で検索できるようにして、類似した順に表示することを目的とし
複数の事前学習済みモデルで精度を比較してみました
やってみる
制約
まず、BERTのREADME を読みますと、検索する文章を512トークン以下にする制約がありました
(トークンについては、リンクを参照願います)前提条件
PATSATにある特許の要約(英文のみ)で
512トークン以下になるだろう割合は99.5%以上を占めるため
今回は、上記制約を考慮していません評価データを用意
1分野につき約20件、9分野で約180件データを用意してもらいました
(お忙しい中、他部署の方にご協力頂きました!ありがとうございます)評価データの妥当性チェック
評価データ約180件を、プログラム上で9つに分類できないと
特徴がない(同じような)文章になり、評価が難しくなります
今回用意した評価データだけ、正しく分類できるかどうかを確認しました非評価データの作成
評価データ20件とは違う分野の特許を1,000件を作成しました
非評価データの抽出方法は、 評価データに付与されている国際特許分類のクラスが違う特許を
ランダムサンプリングしました特許の要約をベクトル化
評価データ20件、非評価データ1,000件の要約を
BERTを使い、768次元のベクトルに変換しました変換したベクトルデータを近傍探索
評価データ20件+非評価データ1,000件を対象として
全評価データで検索しました検索結果を評価
検索結果TOP20に、評価データが何件含まれるかでモデルを評価しました
全評価データ20件を検索しているので、精度はアベレージになります
どうやって?
特許の要約をベクトル化するには bert-as-serviceを使いました
import os import csv from bert_serving.client import BertClient # CSVファイル(アブスト一覧)を読み込む with open('./abstracts.csv', encoding="utf_8") as f: abstracts = list(csv.reader(f, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)) # 要約をベクトル化する with BertClient() as bc: vectors = bc.encode(abstracts)
評価データの妥当性チェックには
K-Meansでクラスタ分析しました
import pandas as pd from sklearn.cluster import KMeans # TSVファイル(ベクトル化データ+正解ラベル付)を読み込む vec = pd.read_csv('./vec.tsv', sep='\t', header=None) # クラスタ分析 km = KMeans(n_clusters=9, init='k-means++', n_init=10, max_iter=10000, tol=1e-06, n_jobs=-1) pred = km.fit_predict(vec.iloc[:, :-1])
尚、評価データ(要約)に対してデータクレンジングすると
F1スコアが0.75から0.93まで上がりました
これにより、評価データを十分な精度でクラスタリングできるため
有効なデータと判断しました
文章の類似度判定には
単純に検索する文章ベクトルとのユーグリッド距離で
類似度をスコアリングしました
import pandas as pd # 評価データ20件+非評価データ1,000件のベクトルデータを読み込む vectors = pd.read_csv('./vectors.tsv', sep='\t', header=None) # 評価データ各20件を文章検索する # ※search_keyは、検索するINDEXを任意に設定しています search_abstracts = vectors.iloc[search_key, :768].values target_abstracts = vectors.iloc[:, :768].values # 類似度スコアはユーグリッド距離とする result ={i:np.linalg.norm(search_abstracts - target_abstracts[i]) for i in range(len(target_abstracts))}
まとめ
最終的に3つの学習済モデルで、精度検証しました
学習済みモデル別の各9分野の精度結果は、こちらになります
具体的な分野名を明示できず、申し訳ないのですが
各分野で精度にバラツキがあり、類似する特許を検索しやすい分野と
しにくい分野があることがわかりました
また、本来なら 要約だけではなく
タイトル、本文、請求項、出願者等の要素も考慮した上で
類似度スコアリングをしますが
要約だけでも、ある程度類似する特許を検索できたことで
BERTのポテンシャルの高さを感じました
(今回は評価データが少ないため、偏った結果になっているかもしれませんが)
最後に
今回のお話で
俺・私・ミーの方がもっとできるよって思う人はたくさんいると思います
そんな方は是非、弊社で一緒に働きませんか?
ここにジョインするまで、自然言語処理は未経験でしたが
手を挙げればチャレンジさせてもらえる弊社は
エンジニアライフを楽しめる会社だと、勝手に自負しています!!
アスタミューゼでは、エンジニア・デザイナーを募集中です
ご興味のある方は遠慮なく採用サイトからご応募ください。お待ちしています