web-dev-qa-db-ja.com

請求書の自動データ抽出OCRまたはPDF

請求書からデータを抽出して、会計士に要約を送信するソリューションを探しています。

月に約20ユーロでそのようなサービスを提供している会社がいくつかあり、請求書は通常非常によく認識されています。しかし、私が試したサービスでは、気に入ったすべてのデータが抽出されないか、データを会計士に送信するためのExcelエクスポートなどの機能が不足しています。そして、月に20ユーロを支払い、月に5回の請求書で別のサービスを管理しなければならないことは、まだ私には魅力的ではありませんでした。

私は少し調べていて、このスタックオーバーフローの質問を見つけました: 請求書を処理するためにOCRソフトウェアを推奨できる人はいますか?

それは少し時代遅れであり、より最新の推奨事項を見つけることを望んでいます。 Ephesoftコミュニティエディションを試してみましたが、最初は非常に有望に見えました。しかし、ソフトウェアには学習とレビューのステップがあります。レビューステップ内では、データは学習ステップにフィードバックされていないようです。さらに、手作業で行うよりも面倒な感じがします。大企業向けだと思います。

簡単なデータ抽出ソフトウェアを探しています。これは、表示する各ステップで学習します。

Apache Tikaも調べましたが、単純なWebインターフェイスで使用する準備ができていないようです。

1)有料のOCRサービスに関する推奨事項はありますか?合計VAT額/ VAT%/合計金額/合計金額通貨/ VAT通貨/支払われたアカウント/会社名を柔軟に抽出できます。優れた輸出で?

2)オープンソースソフトウェアに関する推奨事項はありますか?

3)少数(年間50未満)の請求書をどのように処理するかについて、一般的なアドバイスはありますか?

どうもありがとうございました、

トビー

8
Toby

生のOCRとその上にある正規表現(非常に限られたユースケースでは正常に機能する可能性があります)を除いて、APIアクセスを提供する他のいくつかのオプションがあります。デモや販売プロセスなしで実際に使い始めることができるもの:

  • TagGun-レシートに特化し、ラインアイテムも抽出できます。毎月50レシートで無料です。
  • Elis-請求書に特化し、さまざまなテンプレートを自動的にサポートします(事前トレーニング済みの機械学習モデル)。毎月300未満の請求書

あなたが販売プロセスを進んで通過することをいとわない場合(そして彼らは実際に本物で生きているように見えます):

  • LucidTechおよびItemize(APIの詳細は非公開であるため、精度と抽出されるフィールドは不明です)
  • FlexiCapture Engine-テンプレートに基づいて、特定の請求書形式ごとに1つ定義する場合

(免責事項:私はElisのベンダーであるRossumと提携しています。他のAPIを追加する編集を提案してください!)

8
Petr Baudis

Syphtは、これを行うためのAPIを提供します: http://www.sypht.com

Pythonクライアント: https://github.com/sypht-team/sypht-python-client

ステップ1

pip install sypht

ステップ2

from sypht.client import SyphtClient, Fieldset

sc = SyphtClient('<client_id>', '<client_secret>')

with open('invoice.png', 'rb') as f:
    fid = sc.upload(f, fieldsets=["document, "invoice"])

print(sc.fetch_results(fid))

免責事項:私はベンダーと提携しています

3
Simon Mittag

請求書処理の自動化された方法(機械学習を使用)を備えたAPIへのリンクを追加させてください。

試してみるために、展開されたデモがあります: https://rossum.ai/developers

抽出プロセスは、次のようにAPI( https://docs.api.rossum.ai/ )で自動化できるようになりました。

from __future__ import division, print_function

import argparse
import json
import os

import requests
import polling

DEFAULT_API_URL='https://all.rir.rossum.ai'

class ElisClient(object):
    """
    Simple client for Rossum Elis API that allows to submit a document for
    extraction and then wait for the processed result.
    Usage:
    ```
    client = ElisClient(secret_key, base_url)
    document_id = client.send_document(document_path)
    extracted_document = client.get_document(document_id)
    ```
    """
    def __init__(self, secret_key, url=DEFAULT_API_URL):
        self.secret_key = secret_key
        self.url = url
        # we do not use requests.auth.HTTPBasicAuth
        self.headers = {'Authorization': 'secret_key ' + self.secret_key}

    def send_document(self, document_path):
        """
        Submits a document to Elis API for extractions.
        Returns: dict with 'id' representing job id
        """
        with open(document_path, 'rb') as f:
            content_type = self._content_type(document_path)
            response = requests.post(
                self.url + '/document',
                files={'file': (os.path.basename(document_path), f, content_type)},
                headers=self.headers)
        return json.loads(response.text)

    @staticmethod
    def _content_type(document_path):
        return 'image/png' if document_path.lower().endswith('.png') else 'application/pdf'

    def get_document_status(self, document_id):
        """
        Gets a single document status.
        """
        response = requests.get(self.url + '/document/' + document_id, headers=self.headers)
        response_json = json.loads(response.text)
        if response_json['status'] != 'ready':
            print(response_json)
        return response_json

    def get_document(self, document_id, max_retries=30, sleep_secs=5):
        """
        Waits for document via polling.
        """
        def is_done(response_json):
            return response_json['status'] != 'processing'

        return polling.poll(
            lambda: self.get_document_status(document_id),
            check_success=is_done,
            step=sleep_secs,
            timeout=int(round(max_retries * sleep_secs)))

def parse_args():
    parser = argparse.ArgumentParser(description='Elis API client example.')
    parser.add_argument('document_path', metavar='DOCUMENT_PATH',
                        help='Document path (PDF/PNG)')
    parser.add_argument('-s', '--secret-key', help='Secret API key')
    parser.add_argument('-u', '--base-url', default=DEFAULT_API_URL, help='Base API URL')

    return parser.parse_args()

def main():
    args = parse_args()
    client = ElisClient(args.secret_key, args.base_url)
    print('Submitting document:', args.document_path)
    send_result = client.send_document(args.document_path)
    document_id = send_result['id']
    print('Document id:', document_id)
    extracted_document = client.get_document(document_id)
    print('Extracted data:')
    print(json.dumps(extracted_document, indent=4))

if __name__ == '__main__':
    main()

と呼ばれる

python elis_client_example.py ../data/invoice.pdf -s xxxxxxxxxxxxxxxxxxxxxx_YOUR_ELIS_API_KEY_xxxxxxxxxxxxxxxxxxxxxxx

(例 https://github.com/rossumai/elis-client-examples/

追加して明確にするために、Iamは、開発者にこのサポートを有効にすることに取り組んでいるチームの一員です。

2
Holi

請求書からデータを抽出することは複雑な問題です。オープンソースソリューションはまだ見ていません。 OCRは、データ抽出プロセスの一部にすぎません。画像の前処理、データ認識用のAIエンジンなどが必要です。

この問題を解決するための多くの解決策があります。それらのすべてが少し異なります。 @PeterBaudisはすでにそれらのいくつかについて言及しています。

それらは非常に単純なものから始まります。

  • OCR SPACEレシートスキャン -テーブル形式でデータを抽出しますが、それでもデータを解析して、テキストのどの部分(請求書番号など)であるかを判断する必要があります

より高度なものへ:

  • Nanonets -機械学習APIの多くのソリューション(請求書、納税申告書など)
  • typless -任意のドキュメント(請求書、注文書など)のシングルコールAPI、月額50の請求書で無料
  • パラスクリプト -AbbyFlexiCaptureに似たテンプレートシステム

ユースケースを知ることは重要です。万能の解決策はありません。それはあなたが何を達成しようとしているのかによります:

  • データマイニング-安価で高速でなければなりません。データの欠落や不正確さはミッションクリティカルではありません。あなたはデータ分析でそれをきれいにすることができます。

  • 企業の自動化-訓練された繰り返し請求書はほぼ100%機能する必要があります。スピードと新しい請求書はミッションクリティカルではありません。

  • 税関などの自動化-取得したデータをできるだけ多く返すことが不可欠です。セット全体の正確さは非常に重要ですが、おそらくすべてのドキュメントがとにかくレビューされます。

したがって、それらをテストして、プロセス/ニーズにどのように適合するかを確認する必要があります。

免責事項:私はtyplessの作成者の1人です。編集を提案してください。

0
Jan Giacomelli