シンプルなPythonスクリプトによるAI OCR請求書データ抽出

シンプルなPythonスクリプトによるAI OCR請求書データ抽出

FlowHuntのAPIとAIベースOCR、Pythonを活用して請求書データ抽出を自動化し、迅速・正確・スケーラブルなドキュメント処理を実現しましょう。

AIベースのOCRとは?

AI駆動のOCRは、従来型のOCRよりも進化しており、人工知能を活用して文脈を理解し、さまざまなレイアウトに対応し、複雑なドキュメントから高品質な構造化データ抽出を実現します。従来のOCRは固定フォーマットのテキスト認識しかできませんが、AI OCRは請求書やビジネス文書に多い多様なレイアウトや構成にも柔軟に対応できます。

AIベースOCRの主な特徴

  • 文脈理解: AI OCRはNLPを用いてドキュメントの文脈を理解。「合計金額」「請求日」「顧客名」など、項目が異なる場所にあっても正確に識別します。
  • 柔軟性: 従来のOCRは不規則なレイアウトでエラーが出やすいですが、AI OCRは様々な請求書フォーマットから情報抽出が可能です。
  • データ構造化: 多くの場合、AI OCRは従来のOCRの生テキスト出力よりも、そのまま後処理しやすい構造化データを直接提供します。

請求書処理にAI OCRを使う理由

請求書は経理・物流・購買などで正確かつ効率的に処理する必要があります。AI OCRはデータ抽出の自動化とワークフローの効率化を実現し、データ精度も向上します。

請求書向けAI OCRのメリット

  • スピードと効率: AI OCRなら大量の請求書も短時間で処理可能。リソースや人手の削減に寄与します。
  • 精度向上: 多様なドキュメントでトレーニングされたAIモデルにより、手入力時のミスを大幅に軽減します。
  • データ管理の容易さ: データが構造化されているため、データベースや分析システム、ERPなどにも簡単に統合できます。
  • スケーラビリティ: AI OCRは人手を増やさず大量ドキュメント処理が可能。大企業や急成長企業にも最適です。

FlowHuntのAI OCRツール利用によるROI

多くの企業は従来、従業員が手作業で請求書データを抽出していました。これは非常に時間とコストがかかる作業であり、税務・法務・金融など幅広い分野・企業で自動化の余地があります。

このプロセスは5〜15秒程度で完了し、0.01〜0.02クレジットのコストで済みます。従業員が同じ作業を行う場合、時給15〜30ドルが必要です。

OCR Cost Comparison
処理者年間コスト年間処理枚数1枚あたりコスト
人手$30,00012,000$2.50
FlowHunt$16212,000$0.013
FlowHunt($30,000時)$30,0002,250,000$0.0133

FlowHuntの方が圧倒的に効率的だと言えるでしょう。

OCR導入時の課題

OCRは非常に有用ですが、いくつかの課題も存在します。

  1. 画像品質: OCRの精度は画像品質に大きく依存します。ぼやけた画像や低解像度画像では結果が悪化します。
  2. 複雑なフォーマット: 複雑なレイアウトや混在フォント、テーブル等は高度なOCR処理が必要です。
  3. 言語・文字セット: OCRソフトは言語対応が限定的な場合があり、非ラテン文字では専用モデルが必要です。
  4. エラー率: 100%正確なOCRは存在せず、とくに手書きや不規則フォントではエラーが生じやすいです。

これらの課題に対応するには、高性能かつ柔軟なOCRツールが必須です。FlowHuntのAPIは複雑なドキュメント構造にも対応できる堅牢なOCRソリューションであり、大規模OCRプロジェクトにも最適です。

Python OCRスクリプトのセットアップ

自動化には以下のPythonライブラリをインストールしてください。

pip install requests pdf2image git+https://github.com/QualityUnit/flowhunt-python-sdk.git

これにより以下が導入されます:

  • requests: FlowHunt APIへのHTTPリクエスト送信とOCR出力のダウンロード用。
  • pdf2image: PDFページを画像に変換。
  • flowhunt: FlowHuntのPython SDKで、OCR APIとのやり取りを簡単にします。

コードのステップバイステップ解説

このコードはPDFを画像に変換し、各画像をFlowHuntへ送信してOCR処理し、出力をCSV形式で保存します。

ライブラリのインポート

import json
import os
import re
import time
import requests
import flowhunt
from flowhunt.rest import ApiException
from pprint import pprint
from pdf2image import convert_from_path
  • json, os, re, timeはJSON処理、ファイル管理、正規表現、タイマー制御用。
  • requests: HTTPリクエストやOCR結果のダウンロード用。
  • flowhunt: FlowHunt SDK。認証やOCR API通信を担当。
  • pdf2image: PDFページを画像に変換、各ページごとにOCR可能。

PDFページを画像に変換する関数

def convert_pdf_to_image(path: str) -> None:
    """
    Convert a PDF file to images, storing each page as a JPEG.
    """
    images = convert_from_path(path)
    for i in range(len(images)):
        images[i].save('data/images/' + 'page' + str(i) + '.jpg', 'JPEG')
  • convert_from_path: 各PDFページを画像化。
  • images[i].save: 各ページをJPEGで保存し、OCR処理に利用。

出力添付ファイルURLの抽出

def extract_attachment_url(data_string):
    pattern = r'```flowhunt\n({.*})\n```'
    match = re.search(pattern, data_string, re.DOTALL)
    if match:
        json_string = match.group(1)
        try:
            json_data = json.loads(json_string)
            return json_data.get('download_link', None)
        except json.JSONDecodeError:
            print("Error: Failed to decode JSON.")
            return None
    return None
  • OCR出力ダウンロード用URLを正規表現で抽出する関数です。

API設定と認証

convert_pdf_to_image("data/test.pdf")
FLOW_ID = "<FLOW_ID_HERE>"

configuration = flowhunt.Configuration(
    host="https://api.flowhunt.io",
    api_key={"APIKeyHeader": "<API_KEY_HERE>"}
)
  • PDFを画像化。
  • FlowHunt用のAPI認証情報をセット。

APIクライアントの初期化

with flowhunt.ApiClient(configuration) as api_client:
    auth_api = flowhunt.AuthApi(api_client)
    api_response = auth_api.get_user()
    workspace_id = api_response.api_key_workspace_id
  • 認証し、以降のAPI呼び出しに必要なworkspace_idを取得。

フローセッションの開始

flows_api = flowhunt.FlowsApi(api_client)
from_flow_create_session_req = flowhunt.FlowSessionCreateFromFlowRequest(flow_id=FLOW_ID)
create_session_rsp = flows_api.create_flow_session(workspace_id, from_flow_create_session_req)
  • 画像アップロード・OCR処理用のセッションを開始。

画像をアップロードしOCR処理

for image in os.listdir("data/images"):
    image_name, image_extension = os.path.splitext(image)
    with open("data/images/" + image, "rb") as file:
        try:
            flow_sess_attachment = flows_api.upload_attachments(
                create_session_rsp.session_id,
                file.read()
            )
  • 画像ごとにアップロードし、OCR処理を実行。

OCR処理の呼び出しと結果のポーリング

invoke_rsp = flows_api.invoke_flow_response(
    create_session_rsp.session_id, 
    flowhunt.FlowSessionInvokeRequest(message="")
)
while True:
    get_flow_rsp = flows_api.poll_flow_response(
        create_session_rsp.session_id, invoke_rsp.message_id
    )
    print("Flow response: ", get_flow_rsp)
    if get_flow_rsp.response_status == "S":
        print("done OCR")
        break
    time.sleep(3)
  • OCR処理を実行し、3秒ごとに完了を確認。

OCR出力のダウンロードと保存

attachment_url = extract_attachment_url(get_flow_rsp.final_response[0])
if attachment_url:
    response = requests.get(attachment_url)
    with open("data/results/" + image_name + ".csv", "wb") as file:
        file.write(response.content)
  • CSV出力をダウンロードし、ローカル保存。

スクリプトの実行と出力確認

スクリプト実行方法:

  1. PDFファイルをdata/フォルダに配置します。
  2. <FLOW_ID_HERE><API_KEY_HERE>をFlowHuntの認証情報に置き換えます。
  3. スクリプトを実行すると、PDFの画像変換・OCRアップロード・構造化CSV取得まで自動で行えます。

まとめ

このPythonスクリプトは、大量ドキュメント処理が求められる業界でのOCR業務を効率化するソリューションです。FlowHuntのAPIを活用することで、ドキュメントからCSVへの変換を自動化し、ワークフローの最適化と生産性向上を実現します。

コード全体

完全なGistバージョンはこちらをクリック

import json
import os
import re
import time
import requests
import flowhunt
from flowhunt.rest import ApiException
from pprint import pprint
from pdf2image import convert_from_path

def convert_pdf_to_image(path: str) -> None:
    """
    Convert a pdf file to an image
    :return:
    """
    images = convert_from_path(path)
    for i in range(len(images)):
        images[i].save('data/images/' + 'page'+ str(i) +'.jpg', 'JPEG')

def extract_attachment_url(data_string):
    pattern = r'```flowhunt\n({.*})\n```'
    match = re.search(pattern, data_string, re.DOTALL)
    if match:
        json_string = match.group(1)
        try:
            json_data = json.loads(json_string)
            return json_data.get('download_link', None)
        except json.JSONDecodeError:
            print("Error: Failed to decode JSON.")
            return None
    return None

convert_pdf_to_image("data/test.pdf")
FLOW_ID = "<FLOW_ID_HERE>"

configuration = flowhunt.Configuration(host = "https://api.flowhunt.io",
                                       api_key = {"APIKeyHeader": "<API_KEY_HERE>"})

with flowhunt.ApiClient(configuration) as api_client:
    auth_api = flowhunt.AuthApi(api_client)
    api_response = auth_api.get_user()
    workspace_id = api_response.api_key_workspace_id

    flows_api = flowhunt.FlowsApi(api_client)
    from_flow_create_session_req = flowhunt.FlowSessionCreateFromFlowRequest(
        flow_id=FLOW_ID
    )
    create_session_rsp = flows_api.create_flow_session(workspace_id, from_flow_create_session_req)

    for image in os.listdir("data/images"):
        image_name, image_extension = os.path.splitext(image)
        with open("data/images/" + image, "rb") as file:
            try:
                flow_sess_attachment = flows_api.upload_attachments(
                    create_session_rsp.session_id,
                    file.read()
                )
                invoke_rsp = flows_api.invoke_flow_response(create_session_rsp.session_id, flowhunt.FlowSessionInvokeRequest(
                    message="",
                ))
                while True:
                    get_flow_rsp = flows_api.poll_flow_response(create_session_rsp.session_id, invoke_rsp.message_id)
                    print("Flow response: ", get_flow_rsp)
                    if get_flow_rsp.response_status == "S":
                        print("done OCR")
                        attachment_url = extract_attachment_url(get_flow_rsp.final_response[0])
                        if attachment_url:
                            print("Attachment URL: ", attachment_url, "\n Downloading the file...")
                            response = requests.get(attachment_url)
                            with open("data/results/" + image_name + ".csv", "wb") as file:
                                file.write(response.content)
                        break
                    time.sleep(3)
            except ApiException as e:
                print("error for file ", image)
                print(e)

よくある質問

AIベースのOCRとは何ですか?従来のOCRとどのように違いますか?

AIベースのOCRは、機械学習やNLPを活用してドキュメントの文脈を理解し、複雑なレイアウトにも対応、請求書から構造化データを抽出します。従来のOCRは固定フォーマットの文字認識に依存しています。

請求書処理でAI OCRを使う主なメリットは?

AI OCRは、スピード・精度・スケーラビリティ・構造化された出力を実現し、手作業の削減やエラー低減、業務システムとのシームレスな統合を可能にします。

PythonとFlowHuntを使った請求書OCR自動化の方法は?

FlowHuntのPython SDKを使えば、PDFを画像に変換してAPIへ送信、OCR結果をCSV形式で取得し、抽出プロセス全体を自動化できます。

OCR処理の課題とFlowHuntの対応は?

主な課題は画像品質、複雑なレイアウト、多言語対応などです。FlowHuntのAPIは高度なAIモデルと柔軟な処理機能でこれらに対応しています。

FlowHuntによる請求書データ抽出自動化のROIは?

FlowHuntのAI OCRは数秒で請求書を処理し、人件費のごく一部で済むため、効率性とスケーラビリティを大幅に向上できます。

アルシアはFlowHuntのAIワークフローエンジニアです。コンピュータサイエンスのバックグラウンドとAIへの情熱を持ち、AIツールを日常業務に統合して効率的なワークフローを作り出し、生産性と創造性を高めることを専門としています。

アルシア・カハニ
アルシア・カハニ
AIワークフローエンジニア

FlowHuntのAI請求書OCRツールを試す

FlowHuntの堅牢なAI OCRで請求書データ抽出を自動化。時間を節約し、エラーを減らし、PDFを数秒で構造化データに変換してワークフローを効率化しましょう。

詳細はこちら

請求書データ抽出ツール
請求書データ抽出ツール

請求書データ抽出ツール

請求書データ抽出OCRフローが、どのように請求書データの自動抽出・整理を通じて財務プロセスを効率化できるかをご紹介します。その特徴やメリット、あらゆる規模の企業における効率性・正確性の向上について学びましょう。詳細はFlowHuntでご覧ください。...

1 分で読める
OCR Invoice Automation +3
AI請求書OCR&データ抽出ボット
AI請求書OCR&データ抽出ボット

AI請求書OCR&データ抽出ボット

請求書画像をアップロードし、請求書番号、種類、言語、品目、価格、合計金額などの主要な請求書データを抽出することで、請求書処理を自動化します。抽出結果はマークダウンテーブルと構造化CSVファイルとして出力され、業務の効率化をサポートします。...

1 分で読める
AIでOCR課題を解決する
AIでOCR課題を解決する

AIでOCR課題を解決する

AI搭載のOCRがデータ抽出を変革し、文書処理を自動化し、金融・医療・小売業などの業界で効率化を推進する方法をご紹介します。進化の過程や実際のユースケース、OpenAI Soraなど最先端のソリューションにも迫ります。...

1 分で読める
AI OCR +5