
領収書OCR自動集計:Pythonによる経理ワークフローの解体
領収書OCR自動化の設計資料。Pythonコードと前処理の指針が具体的で、即座に実装へ応用可能です。
散乱した領収書をOCR(光学文字認識)でデジタル化し、品目・金額・日付を抽出して月次集計を行うためのPythonスクリプト設計資料である。経理の「解体」をテーマに、物理的な紙を論理的なデータへと昇華させるプロセスを記述する。 ### 1. システム構成要素(モジュール設計) 自動化における「論理の削ぎ落とし」を体現するため、処理は以下の4段階に分割する。 1. **Preprocessing**: OpenCVを用いた領収書の傾き補正、二値化、ノイズ除去。 2. **OCR Engine**: Google Cloud Vision API(またはTesseract)を介したテキスト抽出。 3. **Parsing**: 正規表現を用いた日付・金額・店舗名の構造化。 4. **Reporting**: Pandasを使用した月次集計とCSV/Excelへの出力。 ### 2. OCR処理エンジン設定(Pythonスクリプトの雛形) 以下のスクリプトは、指定ディレクトリ内の画像から金額と日付を抽出する最小構成のロジックである。 ```python import cv2 import pytesseract import re import pandas as pd from pathlib import Path # 画像前処理:グレースケール化と二値化で文字認識精度を高める def preprocess_image(image_path): img = cv2.imread(str(image_path)) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY) return thresh # テキスト抽出と正規表現によるデータ抽出 def extract_info(text): date_pattern = r'\d{4}[-/]\d{1,2}[-/]\d{1,2}' price_pattern = r'(\d{1,3}(?:,\d{3})*)\s?円' date = re.search(date_pattern, text) price = re.search(price_pattern, text) return { 'date': date.group(0) if date else None, 'amount': int(price.group(1).replace(',', '')) if price else 0 } # メイン処理 def process_receipts(directory): data = [] for p in Path(directory).glob('*.jpg'): img = preprocess_image(p) text = pytesseract.image_to_string(img, lang='jpn') data.append(extract_info(text)) df = pd.DataFrame(data) df.to_csv('monthly_report.csv', index=False) print("集計完了:monthly_report.csvを生成しました") ``` ### 3. データ分類・タグ定義表 領収書の「色彩」や「物理的な質感」を捨て、論理的なパラメータへ変換するための分類表である。スクリプト実行後の仕分けルールとして利用すること。 | カテゴリ | 判定キーワード(Regex) | 優先順位 | 備考 | | :--- | :--- | :--- | :--- | | 通信費 | `(?:サーバー\|ドメイン\|通信\|プロバイダ)` | 1 | 月額固定費の抽出 | | 消耗品費 | `(?:文具\|事務\|コピー\|用紙)` | 2 | 備品購入の識別 | | 接待交際費 | `(?:飲食\|会議\|酒\|レストラン)` | 3 | 5,000円基準のフラグ立て | | その他 | `.` | 9 | 未分類としてログ出力 | ### 4. 運用のためのチェックリスト 自動化を実装する際、物理的な限界をどう克服するかの指針である。 * **撮影環境の固定**: * [ ] 背景は必ず無地(白か黒)を使用すること。 * [ ] 領収書は平坦に伸ばし、シワによる影を極力排除する。 * **OCRの精度向上(前処理のこだわり)**: * [ ] 認識率が低い場合、`cv2.adaptiveThreshold`を使用して照明ムラを補正する。 * [ ] 領収書の端が切れていないか、輪郭抽出(`cv2.findContours`)で確認する。 * **例外処理の設計**: * [ ] 合計金額が抽出できない場合は、手動確認用のディレクトリにファイルを移動させること。 * [ ] 日付が不明な場合はファイル作成日時を代用するフォールバック処理を入れる。 ### 5. 思考の雛形:自動化の余地をどう見つけるか 自動化を設計する際、以下の3つのステップで「硬質」なロジックを構築する。