今日も微速転進

ここではないどこかへ

財務省の公開した交渉記録PDFをいじる その3(本件終了)


スポンサーリンク

一応切りの良いところまで作業したのでここで終了。

プログラムは汚いので載せてないです。

フォーマットが微妙に違うなどの数々のトラップによりかなりの部分を手作業で治すハメに。自分で作ったページ範囲データの不備のせいでさらに無駄な苦労があったりと、見事に自業自得。

Google Cloud Vision APIOCR機能の、認識ミスのパターンについて知見が深まったのでその点はプラスだったかな、と思っています。

自分で後で振り返るためのメモ的側面が強いのであまり役に立たないかな、と思います。

方針

過去記事の方針のまま。

  1. 目次のPDFから交渉記録(応接記録)を機械可読(Computer Readable)な形式に変換
  2. マスク無しのPDFを画像化、再度PDFに変換して過去記事で紹介したAPIOCR
  3. 目次のページ番号から必要なページを割り出して、OCR結果を分割、どうにして添付資料のページを除去
  4. どうにかしてMarkdown
  5. 静的ページジェネレーターでWebページ化

成果物

Netlifyで公開しています。

財務省交渉記録 (2018/05)

OGPとか検索機能とかそのへんは気が向けばどうにかするかも。

備忘録

あまり再現性のない情報ですが載せておきます。

方式検討

  1. まず交渉記録の個別の文書のタイトルを特定
  2. タイトルより上にある機密文書指定などの補足情報は捨てる
  3. 応接方法として記録されている情報はカテゴリ情報に使う
  4. 極力、インデントなどの情報は残す
  5. ある程度は妥協してエディタで修正する
  6. 80点主義で行く

JSONのパースに関しては過去記事参照。

a244.hateblo.jp

プログラムそのものは微妙な上にバグっていたので自粛。一部の処理のみ。

Markdownの生成

公式ページを参考にして、front matterと呼ばれるメタデータYAML形式でファイル冒頭に記述する。

具体例は下記のとおり。

---
title: 利用要望照会中財産について
date: 2013-06-28 14:15:00
categories: ["応接記録", "来訪"]
tags: ["園長", "籠池", "土壌汚染", "地下埋設物", "大阪航空局", "ティーズレボ", "森友学園", "塚本幼稚園", "大阪府", ""]
---

JSONをパースして値を取り出して、string.Templateで値を埋め込む。Markdwonで書式を再現できない部分はHTMLタグを使う。

HexoのMarkdownは「はてなブログ」のそれとはちがって空白行を保存するタイプなので無駄な空白行は除去する必要あり*1

参考:Pythonで、string.Templateを使う - naritoブログ

各記事のタグに関してははかなり偏ってしまっているのは反省点。要するに途中で力尽きた……。

正規表現関連メモ

なぜかあまり言及されないことが多いが、Python 3.6から正規表現のマッチした結果の文字列に配列のインデックスでアクセスできる。

import re

m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")

m[0]       # The entire match
#  'Isaac Newton'

m[1]       # The first parenthesized subgroup.
#  'Isaac'

m[2]       # The second parenthesized subgroup.
#  'Newton'

Python正規表現のパターンとして漢字何文字とかひらがな、かたかなという文字の種類でマッチさせたいときはregexを使う必要がある。

標準の正規表現モジュールではRuby 2.x系のようにユニコード文字プロパティを使えないです。

Rubyとは(残念ながら)違うのですよ‥…。

正規表現での漢字マッチをUnicodeプロパティーを使って綺麗に書く方法 in Python

正規表現まわりはRubyのほうが優位性はあるかなと思います。

Hexoカスタマイズなど

テーマはデフォルトのまま。細々と修正しています。

設定ファイルの修正箇所

タイトルなど基本的な部分は省略。

index_generator:
  path: ''
  per_page: 10
  order_by: dat

default_category: uncategorized
category_map:
  応接記録: reception
  来訪: came
  訪問: visit
  架電: call
  受電: receive
  その他: other
  情報: note

archive_generator:
  per_page: 10
  yearly: true
  monthly: true
  daily: false
  order_by: date

theme_config:
    google_analytics: UA-120720274-1
    show_count: true
    widgets:
        - category
        - tagcloud
        - archive
        - tag
    menu:
      Home: /
      Archives: /archives
      About: /about

ページの表示順を通常と逆順にするため、index_generatorarchive_generatorの両方にorder_byオプションを指定しています。

テーマのカスタマイズ

  • themes/landscape/source/css/_partial/custom.styl
  • themes/landscape/source/css/style.styl
  • themes/landscape/source/css/_variables.styl
  • themes/landscape/layout/_partial/article.ejs

CSSについてはcustom.stylというファイルを新規作成してそこに記述。style.stylから読み込む。末尾の#moreの除去。バナー画像の変更など。

参考にしたサイト:Hexoでトップページに記事の概要を出す方法 | Katsunori Nippo

リスト要素のスクロール

divで囲む必要あり。

横並びにした時に、改行せずにスクロールさせる方法 - Qiita

OCR APIの認識ミスの傾向

頑なに丸囲み数字を認識しないGoogle。①とか④を「の」と認識されても困るんですが……。「〃」も認識してくれないね……。

  • 段落の頭の字下げによる空白を"「"と認識するミスが多数。
  • 行末に不要な"」"や”)"が追加される
  • 単語辞書による補正のせいで変な認識をする時がある -「□(四角)」を「口(くち)」と認識したり、「■」の認識に失敗していた地味に面倒。
  • 「数量等」の「等」が認識されない
  • 「架電」が「書架」+「電」のように認識されるケースあり(辞書補正の弊害か?)
  • 「藪」というを認識できず
  • 「㎡(平方メートル)」は「m」と認識*2
  • 「以 上」の間のスペースが何故か改行(\n)になるケースがある(JSON"detectedBreak"の値がおかしい)

「のの」など「の」が連続している場合、正しい認識結果として「①の」とか「②の」だった可能性を考慮すべし。

目視でチェックして認識されない可能性のある文字、記号類は事前に当たりをつけておく必要がある。ただし、全く認識されないわけでもなく、②や③をそれぞれ、2、3と認識するケースもある。

また、水平方向の罫線があっても、間にスペースが空いていると行の一部とはみなされず、独立した文字の塊という扱いになる。 水平方向より縦方向に隣接した文字の領域があればそちらを優先してブロック扱いする。

交渉記録文書のフォーマットに関して

先方/相手方といった書式の違いだけでなく順序が違ったりとか。「以上」だったり「(以上)」だったり地味にトラップ多し。

特に時刻の表記はかなり厄介で途中で諦めた。

お役所なのに内部文書のフォーマットは意外とフリーダム。ただ、議事録としては外部の人の名前を先(ページの上部)に書く、と教わったのでその辺は大丈夫か、という感じ。

何はともあれ書式は統一していただきたい。

反省点と今後の課題

兎にも角にも前処理重要。それと仕事が遅すぎ > 自分。

  • 認識結果の確かさの数値を参照するように
  • 事前に傾き補正などの前処理をちゃんとやるべき
  • 画像を分割してOCRするのも一つの方法だったか
  • 過去記事のページ範囲リストの不備が数箇所あったり

ちょっとめんどうではあるけど、JSONの時点で認識ミスをピンポイントで補正してもよかったかも。

JSONビューワー件エディタのような治具?というかユーティリティが必要。

結論:横着はダメ

今後の課題

傾き補正、ノイズ除去、領域分割。あとはに印刷文書に手書きでメモが入っているパターンをどうするか。

所感など

もうやだこの連中。不当要求ですよ不当要求。

すぐに思い出すだけでも昼休みに押しかけたり、仕事に愛がない?とか仕事に命をかけろとかと罵詈雑言とか。

もし自分が近畿地方局の人間だったら余裕で退職届書いて精神的苦痛を理由に訴訟ですよ。

売却金額をはじめから公表したりとか、そもそも大阪府が認可しなければ……とか、寄付金の水増しを見抜いていれば、とか まあ思うところはたくさんあります。

公務員だって人間。教育勅語は罵詈雑言を奨励していなかったはずです。

次は陸自イラク日報のような、救いのある公文書にトライしたいところ。

まとめ

ちまちまと作業しているうちに一ヶ月経過していたり、追加で文書が開示されていたりと微妙な展開。

まあPythonに対する習熟度の向上という点ではギリギリ有益だったかと。GoogleOCRエンジンについては画質が悪いので多少の認識ミスは仕方がないのかという印象。

交渉記録に関してはせっかくなので感想文のようなものを書こうかなと思います。

*1:あまり実害はないと思うが、極端に空きが入る

*2:これは仕方ないと思う

広告