トモロログ

仕事や趣味でのメモや記録など

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>)


  sheet['A2'].value = 'てすと' # 値の代入 
  wb.save('sample.xlsx') # セーブ

 

基本的な読み書きは以上でだいたいいける。あとは都度サンプルを見ればよし。

VBAよりこっちの方が楽でよいし、データベースにアクセスしつつ値を入力できそうなので結構使えそう。

キーワード検索 ≠ 全文検索

特許の商用データベースを利用していてこんなこと感じたことがあると思う。

 

例えば全文を対象としてキーワード「静電容量センサ」で検索

検索キーワードをハイライトして公報をチェック

しかしそこにはキーワード「静電容量センサ」がない。

 

これは我々ユーザが利用するイメージと実際の動作に違いがあることが理由である。各社商用データベースのエンジンになにが使用されているかは公開されていないがおそらく動作は下記と同じと思う。

 

 通常我々が思い描くイメージは 「静電容量センサ」の語句のかたまりをテキストに対して一致させて検索させているものだと思う。もちろんこの方法での検索はデータベースでできるのだが、おそらく利用していないはず。理由はとても遅いから。これはSQLでいうとLIKE演算による部分一致になる。

 

では実際にどうしているかというと文章を語句単位に切り分けて、語句単位のマッチングをしている。これがデータベース(OracleMySQLなど)でいう全文検索(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なので興味のある方は試してはいかがでしょうか。

 

②の表記ミスの解決については先ほど触れた一部の特許データを使えば大体の範囲をカバーできる(すべてではない)。これはまた長いので別途。

 

 

 

 

分類不能

整理標準化データを処理していると思いがけないデータにぶつかる

ことがある。

 

たとえば 特開平2−145900のIPCは 0/00

でこれは分類不能の意味らしい。

おそらくだけど検索時にはじかれるようにしているのだろう。

こういうのいっぱいあるのだろうな。

 

しかしデータ処理していてエラーが起こって原因を探った結果こんなだとがっかり

してしまう。多少は時間がかかるし。

 

 

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万件分ある。。

 全回分処理したら何件になるのだろうか。。。

mysql 日本語全文検索 入門

Oracle 山崎氏作成のこの資料を見ればとりあえず始められた。

とってもありがたいです。何度も見ようっと。下記に引用させていただきます。

 

www.slideshare.net

 

www.slideshare.net

 

www.slideshare.net