それでは、前回の続きで出願人の名寄せの処理を行っていきます。前回までの作業で、共同出願人をばらして、1出願人毎に公報番号と出願人と出願日が入ったデータフレームdf2を作成しました。単にばらしただけなので出願人名の名寄せはできていません。前回集計した際にもその点が問題として残りました。同じ出願人なのにその表記がばらついていると別々の出願人として集計してしまいます。それを避けるための名寄せになります。
さて、出願人名の名寄せの処理ですが、何か自動的にできるような話を期待されてた方は申し訳ありません。ある程度の軽減はしますが、名寄せの作業自体は手作業が入ります。それでは、前回の作業からの続きで説明していきます。
まずは、名寄せの処理をある程度軽減するためにdifflibをインポートします。
import difflib as diff
I先に作った出願人のリストunique_apnsから二つの出願人の組み合わせを重複無しで取り出して、difflibで二つのテキストのマッチ度を算出するSequenceMatcherを用いて、テキスト全体の長さの内で同じテキストの羅列がある割合を計算します。それが0.7を超えているものを名寄せの候補としてリストアップします。
for (str1, str2) in [
(str1, str2)
for str1 in unique_apns
for str2 in unique_apns
if str1 < str2
]:
# 類似度を計算、0.0~1.0 で結果が返る
s = diff.SequenceMatcher(None, str1, str2).ratio()
if s > 0.7:
print (str1, "<->", str2)
print ("match ratio:", s, "\n")
こんな感じです。
マッチ度が高い上記の候補の中でも、名寄せすべきもの、そうでないものは人手で判断することになります。また、社名変更等で同じ出願人だけど大きく変わっているものは、difflibでは無理なので、それも人手で判断する必要があります。名寄せの候補が決まったら、次の様に名寄せの対象の出願人名のデータフレームを探し出して(左側)、名寄せする出願人名に書き換えます(右側)。手作業は避けられませんが、一度、このような名寄せ用の修正処理の記述を集めておけば、次回以降の処理では手間が軽減されるはずです。
df2.loc[df2['出願人'] == 'インテルアイピーコーポレイション', '出願人'] = 'インテルコーポレイション'
df2.loc[df2['出願人'] == 'インテル・コーポレーション', '出願人'] = 'インテルコーポレイション'
df2.loc[df2['出願人'] == 'ローベルトボツシユゲゼルシヤフトミツトベシユレンクテルハフツング', '出願人'] = 'ローベルトボッシュゲゼルシャフトミットベシュレンクテルハフツング'
名寄せが終わったら、再度、、出願人別の出願年別出願件数集計表を作成して新たなデータフレームdf3に保存します。
df3 = df2['公報番号'].groupby([df2['出願人'], df2['出願日'].dt.year]).count()
作成したdf3はエクセルデータとして出力することもできます。エクセルデータとして出力するためのxlsxwriterをインポートしてdf3.to_excelで任意のファイル名で出力します。
import xlsxwriter
df3.to_excel('apn_list.xlsx')
出力したエクセルのサンプルapn_list.xlsxを置いておきます。ここまでで、エクセルファイルからの読み込みと書き出しの両方を説明したので、今回のdifflibを用いた手法ではなく、一旦書き出した上で以前の記事で紹介したOpen Refineを用いて名寄せを行って、再度読み込むという手法も可能ではありますが、その辺は臨機応変に行っていただけば良いと思います。名寄せの手法は色々あり、今回提示した手法もその一つにすぎません。Excelに書き出して、Excel上で名寄せを行うのもありかと思います。
次回は、名寄せの要らない特許分類の分割処理と集計作業を行う予定です。