Jupyter Notebookで特許分析(3)

それでは、前回の続きで出願人の名寄せの処理を行っていきます。前回までの作業で、共同出願人をばらして、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")
 こんな感じです。
アイフォーシーイノベーションズインコーポレイテッド <-> ランディス・ギアイノベーションズインコーポレイテッド
match ratio: 0.7450980392156863 

インテルアイピーコーポレイション <-> インテルコーポレイション
match ratio: 0.8571428571428571 

インテルアイピーコーポレイション <-> インテル・コーポレーション
match ratio: 0.7586206896551724 

インテルコーポレイション <-> インテル・コーポレーション
match ratio: 0.88 

クアルコム,インコーポレイテッド <-> グーグルインコーポレイテッド
match ratio: 0.7333333333333333 

クアルコム,インコーポレイテッド <-> ナヤヘルス,インコーポレイテッド
match ratio: 0.75 

グリー株式会社 <-> ソニー株式会社
match ratio: 0.7142857142857143 

グリー株式会社 <-> ヤフー株式会社
match ratio: 0.7142857142857143 

グーグルインコーポレイテッド <-> セーフオプサージカルインコーポレイテッド
match ratio: 0.7058823529411765 

グーグルインコーポレイテッド <-> ナヤヘルス,インコーポレイテッド
match ratio: 0.7333333333333333 

グーグルインコーポレイテッド <-> ピーティーシーインコーポレイテッド
match ratio: 0.7096774193548387 

センシティシステムズインコーポレイテッド <-> ピーティーシーインコーポレイテッド
match ratio: 0.7027027027027027 

ソニー株式会社 <-> パナソニック株式会社
match ratio: 0.7058823529411765 

ソニー株式会社 <-> ヤフー株式会社
match ratio: 0.7142857142857143 

トリアビューティインコーポレイテッド <-> ハイアービュー・インコーポレイテッド
match ratio: 0.7777777777777778 

トリアビューティインコーポレイテッド <-> ピーティーシーインコーポレイテッド
match ratio: 0.7428571428571429 

ハイアービュー・インコーポレイテッド <-> ハイドロ-エアー、インコーポレイテッド
match ratio: 0.7567567567567568 

パナソニック株式会社 <-> パナソニックIPマネジメント株式会社
match ratio: 0.7142857142857143 

ローベルトボッシュゲゼルシャフトミットベシュレンクテルハフツング <-> ローベルトボツシユゲゼルシヤフトミツトベシユレンクテルハフツング
match ratio: 0.84375 

国立大学法人埼玉大学 <-> 国立大学法人東北大学
match ratio: 0.8 

華為技術有限公司 <-> 華為終端有限公司
match ratio: 0.75 

マッチ度が高い上記の候補の中でも、名寄せすべきもの、そうでないものは人手で判断することになります。また、社名変更等で同じ出願人だけど大きく変わっているものは、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上で名寄せを行うのもありかと思います。
次回は、名寄せの要らない特許分類の分割処理と集計作業を行う予定です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

%d人のブロガーが「いいね」をつけました。