財務省の公開した交渉記録PDFをいじる その3(本件終了)
スポンサーリンク
一応切りの良いところまで作業したのでここで終了。
プログラムは汚いので載せてないです。
フォーマットが微妙に違うなどの数々のトラップによりかなりの部分を手作業で治すハメに。自分で作ったページ範囲データの不備のせいでさらに無駄な苦労があったりと、見事に自業自得。
Google Cloud Vision APIのOCR機能の、認識ミスのパターンについて知見が深まったのでその点はプラスだったかな、と思っています。
自分で後で振り返るためのメモ的側面が強いのであまり役に立たないかな、と思います。
方針
過去記事の方針のまま。
- 目次のPDFから交渉記録(応接記録)を機械可読(Computer Readable)な形式に変換
- マスク無しのPDFを画像化、再度PDFに変換して過去記事で紹介したAPIでOCR
- 目次のページ番号から必要なページを割り出して、OCR結果を分割、どうにして添付資料のページを除去
- どうにかしてMarkdown化
- 静的ページジェネレーターでWebページ化
成果物
Netlifyで公開しています。
OGPとか検索機能とかそのへんは気が向けばどうにかするかも。
備忘録
あまり再現性のない情報ですが載せておきます。
方式検討
- まず交渉記録の個別の文書のタイトルを特定
- タイトルより上にある機密文書指定などの補足情報は捨てる
- 応接方法として記録されている情報はカテゴリ情報に使う
- 極力、インデントなどの情報は残す
- ある程度は妥協してエディタで修正する
- 80点主義で行く
JSONのパースに関しては過去記事参照。
プログラムそのものは微妙な上にバグっていたので自粛。一部の処理のみ。
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_generator
とarchive_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と認識するケースもある。
また、水平方向の罫線があっても、間にスペースが空いていると行の一部とはみなされず、独立した文字の塊という扱いになる。 水平方向より縦方向に隣接した文字の領域があればそちらを優先してブロック扱いする。
交渉記録文書のフォーマットに関して
先方/相手方といった書式の違いだけでなく順序が違ったりとか。「以上」だったり「(以上)」だったり地味にトラップ多し。
特に時刻の表記はかなり厄介で途中で諦めた。
お役所なのに内部文書のフォーマットは意外とフリーダム。ただ、議事録としては外部の人の名前を先(ページの上部)に書く、と教わったのでその辺は大丈夫か、という感じ。
何はともあれ書式は統一していただきたい。
反省点と今後の課題
兎にも角にも前処理重要。それと仕事が遅すぎ > 自分。
ちょっとめんどうではあるけど、JSONの時点で認識ミスをピンポイントで補正してもよかったかも。
JSONビューワー件エディタのような治具?というかユーティリティが必要。
結論:横着はダメ
今後の課題
傾き補正、ノイズ除去、領域分割。あとはに印刷文書に手書きでメモが入っているパターンをどうするか。
所感など
もうやだこの連中。不当要求ですよ不当要求。
すぐに思い出すだけでも昼休みに押しかけたり、仕事に愛がない?とか仕事に命をかけろとかと罵詈雑言とか。
もし自分が近畿地方局の人間だったら余裕で退職届書いて精神的苦痛を理由に訴訟ですよ。
売却金額をはじめから公表したりとか、そもそも大阪府が認可しなければ……とか、寄付金の水増しを見抜いていれば、とか まあ思うところはたくさんあります。
公務員だって人間。教育勅語は罵詈雑言を奨励していなかったはずです。
次は陸自のイラク日報のような、救いのある公文書にトライしたいところ。
まとめ
ちまちまと作業しているうちに一ヶ月経過していたり、追加で文書が開示されていたりと微妙な展開。
まあPythonに対する習熟度の向上という点ではギリギリ有益だったかと。GoogleのOCRエンジンについては画質が悪いので多少の認識ミスは仕方がないのかという印象。
交渉記録に関してはせっかくなので感想文のようなものを書こうかなと思います。