AI系基盤技術と、オープンソースを用いた機械学習による特許文書解析(補足4・終)

2020年10月25日
アジア特許情報研究会 西尾 潤

本稿は特技懇誌 No.298, pp.25-37 (2020) に収録できなかった内容を追記するものです。

本稿(補足4・終)では、これまで紹介しなかった可視化、クラスタリング、類似度ランキングの例をソースコードを交えて紹介します。

オープンソースを用いた機械学習による特許文書解析(補足3)を読む

可視化

これまで 形態素解析 → ベクトル化 で数百~数万次元の文書ベクトルを作成してきました。

文書ベクトルを2次元空間または3次元空間に変換(投影)できれば、各文書を散布図として認識することができます。

上記の変換は多変量解析の手法として知られているもので、たとえば主成分分析(PCA)、多次元尺度構成法(MDS)などがあり、また、可視化のための手法、たとえばt分布型確率的近傍埋め込み法(t-SNE)、UMAPも開発されています。

これらの変換を次元圧縮や次元削減と呼びます。

from sklearn import decomposition
# ラベルの読み込み
df = pd.read_excel('data/sample_data.xlsx')
# 文書ベクトルの読み込み
docvec = np.load('data/docvec.npy')
pca = decomposition.TruncatedSVD(n_components=2)
embedd = pca.fit_transform(docvec)
# matplotlibによるプロット
plt.subplot(2, 5, i+1)
plt.title(method+'\n所要時間 %.2fs'%(time.time()-start))
cache = df['インキ'].values
plt.scatter(embedd[:, 0]*cache, embedd[:, 1]*cache, s=6, c='orange', label='インキ')
cache = df['機構'].values
plt.scatter(embedd[:, 0]*cache, embedd[:, 1]*cache, s=6, c='g', label='機構')
cache = df['受容シート'].values
plt.scatter(embedd[:, 0]*cache, embedd[:, 1]*cache, s=6, c='r', label='受容シート')
cache = df['用途'].values
plt.scatter(embedd[:, 0]*cache, embedd[:, 1]*cache, s=6, c='b', label='用途')
fig.legend(labels)

ラベルと文書ベクトルを読み込んでPCAで n_components=2 次元(2次元)に変換します。

cache = df['インキ'].values
embedd[:, 0]*cache
embedd[:, 1]*cache

で、0次元目のデータと1次元目のデータとをそれぞれ「インキ」クラスに限定しています。

plt.scatter(embedd[:, 0]*cache, embedd[:, 1]*cache, s=6, c='orange', label='インキ')

それぞれをx軸、y軸として色を指定しラベルをつけて散布図としてグラフに追加するという流れです。

プロット例

次元圧縮方法の中でも t-SNE を使うとクラスがはっきり分離し、似た文書が集まってクラスターになりますが、計算に時間がかかります。

3次元プロット

plotly を使うとインタラクティブなグラフが描けます。pandas.DataFrameとしてデータを与えるところが特徴です。

df = pd.concat([label['公報番号(全文リンク)'], 
        pd.DataFrame(embedd, columns=['x', 'y', 'z']),
        label['ラベル'],
        pd.DataFrame([1]*len(embedd), columns=['size'])],
        axis=1)
# plotlyによる3次元プロット
fig = px.scatter_3d(df, x='x', y='y', z='z', color='ラベル',
hover_name='公報番号(全文リンク)',
size='size', size_max=5, opacity=1,
title='mecab_STtransf_TSNE')
fig.update_layout(template='ygridoff') # テンプレートの選択
fig.show()

グラフを html で書き出すこともできます。ただ、マウスを合わせたときのラベルの色が黄色1色です。

fig.write_html('data/mecab_STtransf_TSNE.html')

マウスで回転させてみる(新しいタブで開きます)

クラスタリング

クラスタリングはデータの集合をできるだけ共通のグループになるように仕分けることですが、教師データを使わず各クラスの特徴を自ら見つけ出すことができます。

クラスタリングには階層的手法と非階層的手法があります。階層的手法には大きな集団を分割する分割型と個々のデータをまとめ上げる凝集型とがあります。非階層的手法の代表例としてはランダムにk個の点を置き、その点への距離が近いデータを仮のクラスタとし、さらに個々のクラスタの中心を求め、再び各データとの距離を計算し・・・を繰り返す方法があります。

神嶌先生のサイトにわかりやすい説明があります。

k-means法

ここでは非階層的手法の代表例として紹介したk-means法による特許データの教師なし分類タスクを紹介します。

教師なしのため、k個のクラスタが何を意味するか、設計者が解析する必要がありますが、分類タスクに用いるラベルデータがそのタスクに適しているかどうか、判定することができます。

from sklearn.cluster import KMeans
num_clusters = 8
clustering_model = KMeans(n_clusters=num_clusters)
# 文書ベクトルの読み込み
docvec = np.load('data/docvec.npy')
clustering_model.fit(docvec)
y_KM = clustering_model.fit_predict(docvec)
出力は0~7の8段階となります。各クラスタごとに予め分類した4つのクラスと照合すると次の通りになります。
mecab_BoW (4114, 6275)
cluster No インキ 機構 受容シート 用途 インキ 機構 受容シート 用途 インキ 機構 受容シート 用途
0 2 277 0 10 0.31% 12.71% 0.00% 0.88% 0.69% 95.85% 0.00% 3.46%
1 11 421 18 315 1.68% 19.31% 12.16% 27.80% 1.44% 55.03% 2.35% 41.18%
2 0 71 0 5 0.00% 3.26% 0.00% 0.44% 0.00% 93.42% 0.00% 6.58%
3 60 411 13 50 9.19% 18.85% 8.78% 4.41% 11.24% 76.97% 2.43% 9.36%
4 574 210 116 435 87.90% 9.63% 78.38% 38.39% 43.00% 15.73% 8.69% 32.58%
5 1 353 0 46 0.15% 16.19% 0.00% 4.06% 0.25% 88.25% 0.00% 11.50%
6 2 254 0 262 0.31% 11.65% 0.00% 23.12% 0.39% 49.03% 0.00% 50.58%
7 3 183 1 10 0.46% 8.39% 0.68% 0.88% 1.52% 92.89% 0.51% 5.08%

mecab_STtransf (4114, 768)
cluster No インキ 機構 受容シート 用途 インキ 機構 受容シート 用途 インキ 機構 受容シート 用途
0 2 475 6 91 0.31% 21.79% 4.05% 8.03% 0.35% 82.75% 1.05% 15.85%
1 2 112 0 296 0.31% 5.14% 0.00% 26.13% 0.49% 27.32% 0.00% 72.20%
2 373 39 121 175 57.12% 1.79% 81.76% 15.45% 52.68% 5.51% 17.09% 24.72%
3 247 4 1 45 37.83% 0.18% 0.68% 3.97% 83.16% 1.35% 0.34% 15.15%
4 9 480 7 16 1.38% 22.02% 4.73% 1.41% 1.76% 93.75% 1.37% 3.12%
5 11 605 0 43 1.68% 27.75% 0.00% 3.80% 1.67% 91.81% 0.00% 6.53%
6 9 33 13 428 1.38% 1.51% 8.78% 37.78% 1.86% 6.83% 2.69% 88.61%
7 0 432 0 39 0.00% 19.82% 0.00% 3.44% 0.00% 91.72% 0.00% 8.28%
受容シートの分類に着目すると、STtransf(sentence-transformer)が良いですが、インキや用途との区別があまり良くないデータセットであることがわかります。
 
クラスタリングで分けたものをクラスとした教師あり学習もノイズ落としなど特定のタスクによっては現実的であると考えられます。

類似度ランキング

AIをうたう特許分析ツールには、ランキング表示するものがあります。これらのツールは文書ベクトルを作るところにノウハウがありますが、ランキングにはほぼ コサイン類似度 が使われます。解説記事

もちろん2文書間の距離を計算することもできます。一般的な2点間の距離というとユークリッド距離ですが、それ以外にもいくつかの距離の計算方法があります。

予め作成した文書ベクトル中の特定文書に対する類似度を比較する場合

distances = scipy.spatial.distance.cdist(docvec[i], docvec, metric='cosine')[0]

で計算し、docvec[i](1文書)に対する docvec(各文書)の距離が行列として取り出されます。metric に cosine を指定していますが、公式には他の距離計算方法が列挙されています。

results = zip(range(len(distances)), distances)
results = sorted(results, key=lambda x: x[1])
print('\nTop ' + str(closest_n) + ' most similar sentences in corpus:\n')
# 類似の上位closest_nを表示
for idx, distance in results[1:closest_n+1]:
print(kohoNo[idx], '(distance: %.4f)' %(distance/2), '\n', '\n  '.join(textwrap.wrap(text[idx], 50)), '\n')

まず、zip 関数で距離と連番を振ったリストを作ります。この連番は公報番号や独立請求項をデータから取り出すときのインデックスとして使います。

次に sorted 関数で距離の昇順に並べ換えます。

その次距離が短い方から取り出していきますが、最小値は必ず0です。というのは、文書ベクトル集団 docvec とその中の1文書 docvec[i] との距離を測っているので、必ず同じ文書同士の距離を計算し、その結果が0というわけです。そこで results[1:closest_n+1] とすることで0番目を使わず、1番目からclosest_n個を取り出して表示させています。

大抵のベクトル化法において同じ分野の近い文書を提示しました。しかし、Doc2Vecは全く関係ない文書が提示されました。

文書を検索システムに直接入力して、内部データと照合するシステム

transformer モデルのように、テキストを直接入力できる入力層を持つニューラルネットワークモデルを用い、予め学習させて得られた学習済みモデルを使うことで、このようなシステムを作ることができます。ここでは sentence-transformer を使いました。詳細はソースコードをご覧ください。

Query:
多官能カチオン重合性化合物、及びカチオン硬化触媒(C)を含有する紫外線硬化性樹脂組成物であり、前記紫
外線硬化性樹脂組成物をAr雰囲気のドライボックス内に入れて1時間放置した場合の重量減少量が1%未満で
あり有機EL素子のための封止材を作製するために用いられる、紫外線硬化性樹脂組成物。多官能カチオン重合
性化合物、及びカチオン硬化触媒(C)を含有する紫外線硬化性樹脂組成物であり、前記紫外線硬化性樹脂組成
物の硬化物の吸湿率が0.1質量%以上であり、前記吸湿率は、Ar雰囲気下で前記紫外線硬化性樹脂組成物に
紫外線を照射することで作成された厚み10μmのフィルムを真空乾燥して、乾燥後の前記フィルムの質量(M
0)を測定し、前記フィルムを85℃、85%RHの条件下に24時間曝露して、吸湿後の前記フィルムの質量
(M)を測定し、(M-M0)/M0×100(質量%)の式で算出される、有機EL素子のための封止材を作
製するために用いられる、紫外線硬化性樹脂組成物。
Query:
多官能カチオン重合性化合物、及びカチオン硬化触媒(C)を含有する有機EL素子のための封止材を作製する
ために用いられる、前記紫外線硬化性樹脂組成物の硬化物の吸湿率が0.1質量%以上であり、紫外線硬化性樹
脂組成物であり、有機EL素子のための封止材を作製するために用いられる、紫外線硬化性樹脂組成物。多官能
カチオン重合性化合物、及びカチオン硬化触媒(C)を含有する紫外線硬化性樹脂組成物であり、前記紫外線硬
化性樹脂組成物をAr雰囲気のドライボックス内に入れて1時間放置した場合の重量減少量が1%未満であり前
記吸湿率は、Ar雰囲気下で前記紫外線硬化性樹脂組成物に紫外線を照射することで作成された厚み10μmの
フィルムを真空乾燥して、乾燥後の前記フィルムの質量(M0)を測定し、前記フィルムを85℃、85%RH
の条件下に24時間曝露して、吸湿後の前記フィルムの質量(M)を測定し、(M-M0)/M0×100(質
量%)の式で算出される、紫外線硬化性樹脂組成物。

上のクエリは特開2019-163468号公報の独立請求項から得られた文書で、下のクエリはその文書の中の文節を一部入れ替えたもので単語は全く同じです。この2つのクエリに対して異なる結果が出ました。transformerモデルは文脈を学習できると言われますが、その性質がここにも表れています。ユーザーが入力する文書の語順によって結果が異なるという性質は、検索安定性の観点から賛否があるところです。

ランク特開2019-163468文節入れ替え
1特開2018-162341 (distance: 0.1207)特開2017-205964 (distance: 0.0904)
2特開2017-222154 (distance: 0.1210)WO16/104423 (distance: 0.0913)
3特開2019-145525 (distance: 0.1227)特開2016-196134 (distance: 0.0937)
4特開2017-127973 (distance: 0.1238)特開2016-196135 (distance: 0.0970)
5特開2019-048429 (distance: 0.1270)特開2016-078438 (distance: 0.0983)
6特開2016-181648 (distance: 0.1276)特表2017-503674 (distance: 0.1005)
7WO14/024885 (distance: 0.1302)WO16/167347 (distance: 0.1006)
8特開2016-175988 (distance: 0.1312)特開2019-145525 (distance: 0.1012)
9WO16/129670 (distance: 0.1314)特開2017-022068 (distance: 0.1026)
10特表2017-517640 (distance: 0.1330)特開2016-126963 (distance: 0.1038)

学習済みモデルはさらにファインチューニングできます。特許文書によりファインチューニングすることで精度がどのように上がるのか、気になります。

ソースコード

google Colaboratory で使用可能な jupyter notebook 形式で配布しています。