医療費控除、どうにかしたい。
所得税確定申告のシーズンです。さて、医療費の領収証の束があるんですけど、これを「人別」「医療機関別」に金額を集計し、「2025年」のものだけを取り出し、「自費」の欄を見てインフルの予防接種だったり文書料だったりを除外し、という作業をする季節なわけです。
やってられるか。
どうしてやろう?
こういうとき、アホなAI驚き屋さんは「これからの時代はAIだ!」とか言って、その50枚くらいある医療費の束のPDFをChatGPTにぶん投げてデータ化させてみようとするんですが、まあうまく行かないのでやめましょうね。
アルゴリズムで解ける問題はアルゴリズムで解くべき。AIが仕事をするというのは、AIがコードを書くことで間接的にやってくれるというのがしばらくは現実的なラインであるかと思います。電気も計算資源も有限なので。
というわけでどうにかした
動作風景 https://www.youtube.com/watch?v=K7rsj_gt_s8
ソースコード https://github.com/nananek/iryouhi-ocr
まだ月初めなのに、GitHub Copilot Premium Requestsをゴリゴリつかって開発しました。
アイディアとしては、
- まず枠線の見た目でページをクラスタリング
- クラスタごとに帳票定義 (ほしい項目をアノテーション)
- 今一番イケてるOCR、YomiTokuを使って文字を起こして、帳票定義に従ってピックアップ
ページのクラスタリング
私普段からメガネで、外すと0.1もない視力なんですけど、その視力でぼんやり紙を見比べて同じっぽく見えたら、それは多分同じ病院のレセプトなんですね。
だから、適当にモノクロにして、白黒反転して、ブラー掛けて、乗算が一番大きくなるやつら同士をグループにしてやれば、帳票定義は病院・薬局の数だけで済むわけです。
帳票定義
ほんとうはここぞと人間のタスクをLLMに奪ってほしかった。GPT-4.1に項目の位置教えてって頼んで見たものの、全く期待通りにならず。
YomiToku OCR
GeForce RTX 3050程度のGPUでバリバリ動いてくれるOCRは素晴らしいね!
ここで、よくある帳票OCRシステムって、トリミングしてからOCRすることが多いんですけど、それやるとトリミングされた枠線が文字として認識されるとか、スキャンや印刷の微妙な位置ズレに対してロバスト性が低いとか、あまりいいことがないです。
画像全体をOCRモデルにまかせて文字起こししてもらって、指定した矩形範囲の中にある文字を拾い集めて項目の文字として出すというプロセスを組んでいます。
トリミングと読み取り結果を見比べながら必要に応じて修正
LLMに丸投げすると。たしかに医療費みたいなのもある程度読んでくれるかも知れないんですけど、LLMってすーぐ嘘つくし、どこの数字を拾ってきたみたいなことを全く教えてくれません。
だから最後に人間が目で検証できるプロセスを設けることは非常に大切。
ちなみに
動作風景の動画で使ったサンプルレセプトは、Geminiに組版させました。流石に自分の医療費領収書使うわけにいかないからね。
ScanSnapでスキャンした領収書なら、クラスタリングとの相性はかなりいいです。