📝

GPT を使って汎用 OCR を作った

2023/03/22に公開

はじめに

GPT を使って画像・テキストから欲しい情報を抽出するライブラリを作りました。

https://github.com/Anieca/Xtracture

パッケージを公開済みなので以下のコマンドでインストールできます。

pip install -U xtracture

使い方

下例のとおりです。

from pathlib import Path

from xtracture.extractor import Extractor
from xtracture.item_extractor import GPTItemExtractor
from xtracture.schema import ExtractTarget
from xtracture.text_extractor import LambdaTextExtractor


def main():
    # OCR 済みのテキストを入力する場合
    text_extractor = LambdaTextExtractor()
    # Tesseract で OCR する場合
    # text_extractor = TesseractTextExtractor()
    # Google Cloud Vision API で OCR する場合
    # tex_extractor = GoogleVisionTextExtractor()
    
    item_extractor = GPTItemExtractor(model_name="gpt-3.5-turbo")
    extractor = Extractor(text_extractor, item_extractor)

    # LambdaTextExtractor の場合はテキストファイルを指定
    # TesseractTextExtractor, GoogleVisionTextExtarctor の場合は画像ファイルを指定
    file_path = Path("./ocr_result.txt")
    
    # 抽出したい key と key の情報をまとめる
    extract_targets = [
        ExtractTarget(key="会社名", description="会社の名前"),
        ExtractTarget(key="代表者名", description="代表者の名前"),
        ExtractTarget(key="収入金額", description="収入の合計金額"),
    ]
    results = extractor.extract(file_path, extract_targets)
    print(results)


if __name__ == "__main__":
    main()

ocr_result.txt の中身が以下の通りだとします

会社名:ABC株式会社
住所:東京都千代田区1-2-3
代表者:XYZ

電話番号: 000-1111-2222

上述のスクリプトを実行すると以下の結果になります

[
    Item(key='会社名', values=["ABC株式会社"]), 
    Item(key='代表者名', values=['XYZ']), 
    Item(key='収入金額', values=[])
]

簡単な説明

主に以下の要素で構成されています。

  • TextExtractor: データを受け取り、テキスト形式に変換するクラス
  • ItemExtractor: 抽出したい情報とその詳細・制約を指定し、テキストから情報を抽出するクラス
  • Extractor: 上記 2 つのクラスを組み合わせ、最終的なデータ抽出処理を行うクラス
  • ExtractTarget: 抽出対象の情報を定義するクラス
  • Item: 抽出結果

テキスト抽出(TextExtractor)は既存のライブラリ(Tesseract, Google Cloud Vision API)にお任せなので特筆する点はありません。

項目抽出(ItemExtractor)に GPT を使っています。
と言ってもこちらもプロンプトに以下の処理を実行させて結果を返しているだけです。

  1. OCR 結果を補正せよ
  2. 情報を抽出せよ
  3. 情報抽出結果を補正せよ
  4. JSON フォーマットで出力せよ

中身について

良い点

  • OCR 誤りをそれなりに補正してくれる
  • 固有表現抽出の精度はかなり高い

悪い点

  • 高い(GPT はトークン単位での課金になるためそれなりに高いです)
  • 出力が安定しない(例えば空のテキストを入力すると適当な結果が返ってきます)
  • 遅い(リアルタイムな応答が要求されるシステムには到底使えません)

おわりに

世間を騒がせている GPT ですが、汎用に近い OCR が簡単に実装できるようになった点も革新的に感じたため、お試しで作ってみました。

正直そのまま使えるようなライブラリではなく、コード量も少ないので各自で実装いただいたほうが良いと思います。

また、おそらく Microsoft や Google の各種ドキュメントビューアーに標準的に搭載されていく機能かと思います。少し待てば安定した製品を使うことができそうです。

機能のほとんどがプロンプトの文章を作成することに依存していて開発としてはかなり新しい体験でした。

GPT-4 が画像の入力に対応すれば現状の「テキスト抽出→項目抽出」というプロセスも不要になり、よりシンプルで高い精度の OCR が実現可能になる可能性が高いと考えられます。楽しみです。

Discussion