企業の名寄せについての一考
特許データの分析時や集計時には企業の名寄せについてはなかなか悩まされる
ことと思う。名寄せが必要な理由は大きくは以下の理由がある。
①企業の変遷によるものー名称変更、合併、吸収 etc.
②表記揺れ 整理標準化データのなかでも表記の揺れは大きい。特に海外出願人はほぼ一筋縄ではいかず、人間が見たら同じに見えてもエクセルやDB上は全く別物となってしまう。
で、ここでは①の解決方法についての提案を一つ。
以前の記事に紹介したNISTEP(科学技術・学術政策研究所)の企業名辞書を使用する方法である。
産業における研究開発・イノベーションに関するデータ | 科学技術・学術政策研究所 (NISTEP)
この中の企業名辞書テーブルを用いる方法である。ありがたいことにMySQLのダンプ(CSV)形式になっているのですぐにインポートして利用することができる。インポートした結果は以下(ツールによってDBテーブルの中身を表示)。
comp_id : 各企業(comp_name)で表される企業ごとのid
history_id:同一企業の変遷レコードをグループ化して扱うための番号
(合併、吸収、名称変更などは同じグループ化される)
たとえば「サンリオ」は comp_id: 1008136, history_id: 1008136 で、逆に history_id 1008136 で検索すると以下のような結果となる。つまり以下は1つのグループとなる。
一応企業HPで確認して正しいことはわかった(あたりまえか)。
で、テーブルからのこの取得方法は上記のような二段階の検索はせずに副問い合わせを使って1回で取得可能。ちなみにテーブル名は1_comp_name_main_TBLなので
select * from 1_comp_name_main_TBL where history_id in
(select history_id from 1_comp_name_main_TBL where comp_name = 'サンリオ')
サンリオの例は企業変遷だが、合併・統合の例でいうとリクシルの情報は以下のとおり
で、これをどうやって名寄せに利用するかというと、上記のSQLで得られたcomp_nameを使ってさらに出願人名で書誌データ(整理標準化データなど)を検索すれば名寄せを考慮した検索が自動的にできる。もちろんどこまでを名寄せと考えるかは各自の判断があるのでそのあたりの工夫は必要になるだろう。
SQLで考えると副々問い合わせになるので可読性は悪くなりそうだけどほかのやり方を知っている人がいたら教えてもらいたいです。。
さらに、この方法と以前に触れたexcel+pythonの技を使うと縦セルに企業名を並べておいて一気に上記の方法で取得した企業情報や件数集計を埋めることができる。
実際にやってみたので画面を動画キャプチャしてデモにしようかと思ったけど、動画にするのがいまいちうまくいかなかったのあきらめた(笑)。
上記の例はデータベースを構築することが前提となるが、ありがたいことにExcelの形式でも提供されているので何らかの自動化は可能だと思う。私はVBAはできないので具体的なことは言えないけれど、もし手動で利用するにしても有用な情報だと思う。仕様や詳細は是非HPを見てみてほしい。
python から excel の操作
ライブラリ openpyxl を使用すればできた
https://openpyxl.readthedocs.io/en/default/index.html#
インストールはMac環境では
pip install openpyxl
使用例
# coding: utf-8
import openpyxl
wb = openpyxl.load_workbook(filename = 'sample.xlsx')
sheet = wb['test']
print sheet['A2'].value #セルA2の値
cell_range = sheet['A1':'C10'] # Cells(A1:C10) の取得
for cell in cell_range:
print cell[0].value # 列Aの各要素の値を出力
# タプルで1列ごと取得 1行目なら (A1, B1, C1) となる Aの要素はインデックス0
#cell_range の中身
# (<Cell test.A1>, <Cell test.B1>, <Cell test.C1>)
# (<Cell test.A2>, <Cell test.B2>, <Cell test.C2>)
# (<Cell test.A3>, <Cell test.B3>, <Cell test.C3>)
# (<Cell test.A4>, <Cell test.B4>, <Cell test.C4>)
# (<Cell test.A5>, <Cell test.B5>, <Cell test.C5>)
# (<Cell test.A6>, <Cell test.B6>, <Cell test.C6>)
# (<Cell test.A7>, <Cell test.B7>, <Cell test.C7>)
# (<Cell test.A8>, <Cell test.B8>, <Cell test.C8>)
# (<Cell test.A9>, <Cell test.B9>, <Cell test.C9>)
# (<Cell test.A10>, <Cell test.B10>, <Cell test.C10>)
wb.save('sample.xlsx') # セーブ
基本的な読み書きは以上でだいたいいける。あとは都度サンプルを見ればよし。
VBAよりこっちの方が楽でよいし、データベースにアクセスしつつ値を入力できそうなので結構使えそう。
キーワード検索 ≠ 全文検索
特許の商用データベースを利用していてこんなこと感じたことがあると思う。
例えば全文を対象としてキーワード「静電容量センサ」で検索
検索キーワードをハイライトして公報をチェック
しかしそこにはキーワード「静電容量センサ」がない。
これは我々ユーザが利用するイメージと実際の動作に違いがあることが理由である。各社商用データベースのエンジンになにが使用されているかは公開されていないがおそらく動作は下記と同じと思う。
通常我々が思い描くイメージは 「静電容量センサ」の語句のかたまりをテキストに対して一致させて検索させているものだと思う。もちろんこの方法での検索はデータベースでできるのだが、おそらく利用していないはず。理由はとても遅いから。これはSQLでいうとLIKE演算による部分一致になる。
では実際にどうしているかというと文章を語句単位に切り分けて、語句単位のマッチングをしている。これがデータベース(OracleやMySQLなど)でいう全文検索(Full Text Search)である。そして、その語句の切り分け方は以下の3通りある。なお、各商用データベースがどれを利用しているかは不明。
1.空白による区切り
英語などの言語に適用
2.N-gram
N文字単位で区切る。特に2文字単位はbigramと呼ばれ、日中韓はこれで対応するケースが多い。逆に英語では2文字では不十分といわれている。
3.形態素解析
形態素解析エンジンによって単語単位に分割。動詞の活用の表記揺れなども吸収できる。辞書を用いるので新語などには弱い。
bigramを例にとると 「静電容量センサ」 は「静電」、「電容」、「容量」、「量セ」、「セン」、「ンサ」に分解されて それらを同じ順序でもつ文献が検索される。適合率は下がるが漏れはないことはおわかりいただけると思う。
なぜこれで速くなるかということは説明が長いし、私も完全には理解してはいないが、自身で実験データ(公報3万件分)でLIKE演算と比較すると100倍くらいの速度の違いがあった。
これを知ってどうなるのかなという気もするけど少なくとも最初の?は消えるのではないでしょうか。ちなみに特許情報フェアのUSPTOのカンファレンスでは庁内の全文検索はN-gramとの記載があった(のでこのネタが浮かんだ)。
企業名や出願人の名寄せ
特許の分析をする際に一番悩ましいのが名寄せではないかと思う。
名寄せが必要な理由は
①企業の名称変更、合併、吸収
②単に表記ミス
などがある。
①の解決には商用のツールを使うという手があるのかもしれない(使ったことないので知らないけど)。あるいは企業のHPや会社情報DB見てメモしたりとかやるのかもしれない。だけど分析対象の出願人・企業名が多い場合はかなりキツイと思う。
そんな時利用できるのはNISTEP(科学技術・学術政策研究所)
に公開されている NISTEP企業名辞書 というのがある。これを使えば企業名を検索して変遷やグループ企業などを一気に取得することができる。例えばパナソニックと松下電器産業は同じとか。
さらに外部データとの連携ができるようにコードが付与されているのであんなことやこんなこともできるのではないかと妄想させるところが素晴らしい。一部の特許データへの接続も考慮されている。
ただリレーショナルデータベースの構造で提供されるのでデータベース構築+SQLのスキルは必要になるのである程度の作業は必要になる(自分でHP調べるよりははるかに楽とは思うが)。ただ、逆にそのおかげで検索したりテーブル結合したりしてデータが即取得できるようにはなる。
商用利用もOKなので興味のある方は試してはいかがでしょうか。
②の表記ミスの解決については先ほど触れた一部の特許データを使えば大体の範囲をカバーできる(すべてではない)。これはまた長いので別途。
insert ignore 〜の問題
insert ignore 〜 の構文でインサートしたときには重複行がある場合にはインサートを実行しないのだがちょっと問題点が。。
プライマリキー(たとえば id) をauto_increment で設定していて かつ それ以外のカラムにUNIQUE KEYを設定している場合に問題があるよう。 insert ignore 〜でインサートが実行されないときにもauto_incrementが実行されるのでプライマリキーにギャップ(空番)が出てしまい、現状存在するプライマリキーの番号とシーケンスの番号の差異が一定以上(たしか10000)になるとエラーになってしまう。
これはmysql5.1.22 のinnoDBの仕様らしく設定を変えるしかないので断念。。
バルクインサートで便利かと思ったのだが、1データずつ存在チェック+インサートしかなさそう。パフォーマンスはわるそうだが仕方ないかな。。
整理標準化データの追加
整理標準化データはデータの更新があったときに該当する公報のマスタデータが
配布される形式になっている。
たとえばある出願 2000-123XXX にIPCの更新があったときにはそれについてのすべての整理標準化データの出願マスタ1レコード分が配信される。つまり更新があるときには全カラム更新となるのでdelete, insertの方が処理が楽なのかもしれない。
その場合最新の情報が正となるのでデータ作成の時には 旧->新の場合と 新->旧の場合の処理が異なる。新たなデータの挿入の際にユニークキー(四法+出願番号)が重複するとき、旧->新の時は delete , insert 、 新->旧の時は単に無視となる。
そんなときの insert の構文
旧->新:delete + insert
replace into 〜
ユニークキーに重複があればdelete + insert, なければ insert
ただし、id などのカラムは書き換えてしまう。
新->旧:無視
insert ignore into 〜
ユニークキーに重複があればなにもしない。 なければ insert
ちなみに整理標準化データの出願マスタはDVD一回配布分だけで10万件分ある。。
全回分処理したら何件になるのだろうか。。。