ディープラーニングを使用したテーブルの検出と情報の抽出

ソースノード: 1325422

テーブル抽出の概要

収集されるデータの量は、アプリケーション、ソフトウェア、およびオンラインプラットフォームの数が増えるにつれて、日々劇的に増加しています。

この膨大なデータを生産的に処理/アクセスするには、貴重な情報抽出ツールを開発する必要があります。

情報抽出の分野で注目を集めているサブエリアのXNUMXつは、画像からの表の抽出、またはフォーム、PDF、ドキュメントからの表形式のデータの検出です。

テーブル抽出 ドキュメント内のテーブル情報を検出して分解するタスクです。

テーブルOCR-画像からテーブルデータを抽出するナノネット!
テーブルOCR–画像からテーブルデータを抽出するナノネット!

さらに処理するために抽出する必要のある表形式のデータを含むドキュメントがたくさんあると想像してください。 従来は、手動で(紙に)コピーするか、Excelシートにロードすることができます。

ただし、テーブルOCRソフトウェアを使用すると、テーブルを自動的に検出し、ドキュメントからすべての表形式データを一度に抽出できます。 これにより、多くの時間とやり直しを節約できます。

この記事では、最初にNanonetsが画像やドキュメントからテーブルを自動的に抽出する方法を見ていきます。 次に、ドキュメント内のテーブルを検出して抽出するための一般的なDL手法について説明します。


請求書、領収書、またはその他の種類のドキュメントから表形式のデータを抽出したいですか? Nanonetsをチェックしてください PDFテーブルエクストラクタ 表形式のデータを抽出します。 デモを予約する 自動化の詳細については テーブル抽出.


目次

NanonetsTableOCRを使用して画像からテーブルを抽出する

  • ユーザー登録 無料のNanonetsアカウントの場合

    • NanonetsTableOCRモデルに画像/ファイルをアップロードする
    • Nanonetsは、すべての表形式データを自動的に検出して抽出します
    • データの編集と確認(必要な場合)
    • 処理されたデータをExcel、csv、またはJSONとしてエクスポートします

ナノネットを使用して画像からテーブルを抽出する

したい PDFからデータをスクレイピング 文書、 PDFテーブルをExcelに変換する or テーブル抽出を自動化する? 詳細 どのようにナノネット PDFスクレーパー or PDFパーサー あなたのビジネスをより生産的にする力を与えることができます。


Nanonets テーブル OCR API

ナノネットを使用したテーブルOCR
ナノネットを使用したテーブルOCR

  ナノネット OCR API OCRモデルを簡単に構築できます。 OCRモデルの精度を上げるために、画像の前処理やテンプレートのマッチング、ルールベースのエンジンの構築について心配する必要はありません。

データをアップロードして注釈を付け、モデルをトレーニングするように設定し、ブラウザベースのUIを介して予測を取得するのを待つことができます。コードを一行も記述せず、GPUについて心配したり、ディープラーニングモデルを使用してテーブル検出に適したアーキテクチャを見つけたりする必要はありません。

また、各予測のJSON応答を取得して、それを独自のシステムと統合し、最先端のアルゴリズムと強力なインフラストラクチャに基づいて構築された機械学習を利用したアプリを構築することもできます。

https://nanonets.com/documentation/


あなたのビジネスは、デジタルドキュメント、PDF、または画像のデータまたはテキスト認識を扱っていますか? 表形式のデータを抽出する方法を知りたいですか? 画像からテキストを抽出する , PDFからデータを抽出する or PDFからテキストを抽出する 正確かつ効率的に?


テーブル抽出が役立つと思う人

前のセクションで説明したように、テーブルはデータをクリーンな形式で表すために頻繁に使用されます。 テーブル全体でデータを構造化して作業を整理することから、企業の巨大な資産を保存することまで、いくつかの領域でそれらを頻繁に見ることができます。 毎日何百万ものテーブルを処理しなければならない組織はたくさんあります。 すべてを手動で行うという面倒な作業を容易にするために、より高速な手法に頼る必要があります。 いくつかのユースケースについて説明しましょう テーブルの抽出 不可欠な場合があります:

情報源: パトリック・トマソ、アンスプラッシュ

個人的な使用例

  テーブル抽出 プロセスは、個人的な小さなユースケースにも役立ちます。 携帯電話でドキュメントをキャプチャし、後でそれらをコンピュータにコピーすることがあります。 このプロセスを使用する代わりに、ドキュメントを直接キャプチャして、カスタムテンプレートに編集可能な形式で保存できます。 以下は、テーブル抽出を個人的なルーチンに適合させる方法に関するいくつかのユースケースです。

ドキュメントを電話にスキャン: 電話で重要なテーブルの画像をキャプチャして保存することがよくありますが、テーブル抽出手法を使用して、テーブルの画像をキャプチャし、表形式でExcelまたはGoogleシートに直接保存できます。 これにより、画像を検索したり、テーブルの内容を新しいファイルにコピーしたりする必要がなくなります。代わりに、インポートされたテーブルを直接使用して、抽出された情報の処理を開始できます。

HTMLへのドキュメント: ウェブページでは、表を使用して提示された大量の情報を見つけます。 それらはデータと比較して私たちを助け、整理された方法で数字について簡単にメモしてくれます。 テーブル抽出プロセスを使用することで、PDFドキュメントまたはJPG / PNG画像をスキャンし、情報を直接カスタム設計されたテーブル形式にロードできます。 スクリプトをさらに記述して、既存のテーブルに基づいて追加のテーブルを追加し、それによって情報をデジタル化することができます。 これにより、コンテンツを編集し、ストレージプロセスを迅速化できます。


産業ユースケース

特に銀行業と保険業では、世界中で事務処理と文書化に大きく取り組んでいるいくつかの産業があります。 顧客の詳細の格納から顧客のニーズへの対応まで、テーブルは広く使用されています。 この情報は、承認のためにドキュメント(ハードコピー)として別のブランチに再度渡されます。この場合、誤った通信により、テーブルから情報を取得するときにエラーが発生することがあります。 代わりに、ここで自動化を使用すると、私たちの生活がはるかに簡単になります。 初期データが取得されて承認されると、それらのドキュメントを直接スキャンして表に入れ、デジタル化されたデータをさらに処理できます。 時間の消費と障害の削減はもちろん、情報が処理される時間と場所をお客様に通知できます。 したがって、これによりデータの信頼性が確保され、操作への取り組みが簡素化されます。 次に、他の可能な使用例を見てみましょう。

品質管理: 品質管理は、主要産業が提供するコアサービスのXNUMXつです。 通常は社内で行われ、関係者のために行われます。 この一環として、提供されたサービスに関するフィードバックを抽出するために、消費者から収集された多くのフィードバックフォームがあります。 産業部門では、テーブルを使用して毎日のチェックリストとメモを書き留め、生産ラインの動作状況を確認しています。 これらはすべて、テーブル抽出を使用してXNUMXか所で簡単に文書化できます。

資産の追跡: 製造業界では、人々はハードコードされたテーブルを使用して、鋼、鉄、プラスチックなどの製造エンティティを追跡します。すべての製造アイテムには一意の番号が付けられ、テーブルを使用して毎日製造および配送されるアイテムを追跡します。 自動化は、誤配置やデータの不整合の観点から多くの時間と資産を節約するのに役立ちます。


ビジネスユースケース

Excelシートとオフラインフォームで実行されるいくつかのビジネス業界があります。 しかし、ある時点で、これらのシートやフォームを検索することは困難です。 これらのテーブルを手動で入力する場合は時間がかかり、データが正しく入力されない可能性が高くなります。 したがって、テーブル抽出はビジネスユースケースを解決するためのより良い代替手段です。

送り状 オートメーション: 多くの小規模および大規模産業があり、その 請求書 引き続き表形式で生成されます。 これらは適切に保護された税務申告書を提供しません。 このようなハードルを克服するために、テーブル抽出を使用してすべてを変換できます 請求書 編集可能な形式に変換し、それによってそれらを新しいバージョンにアップグレードします。

フォームの自動化: オンラインフォームは、企業が必要な情報を収集し、同時にワークフローに組み込まれている他のソフトウェアプラットフォームに接続するのを支援することにより、この実証済みの方法を混乱させています。 手動データ入力の必要性を減らすことに加えて( 自動データ入力)およびフォローアップメール、テーブル抽出により、従来の代替紙の印刷、郵送、保管、整理、および破棄のコストを削減できます。


OCRの問題を念頭に置いていますか? デジタル化したい 請求書、PDFまたはナンバープレート? に向かいます ナノネット 無料でOCRモデルを作成してください!


実際のディープラーニング

ディープラーニングは、人工ニューラルネットワークに基づく機械学習手法の幅広いファミリの一部です。

ニューラルネットワークは、人間の脳の動作を模倣するプロセスを通じて、特定のデータの基になる関係を認識するフレームワークです。 データが通過するさまざまな人工レイヤーがあり、機能について学習します。 コンボリューションNN、リカレントNN、オートエンコーダー、さまざまな種類のデータを処理するジェネレーティブアダーサリナルNNなどのさまざまなアーキテクチャがあります。 これらは複雑ですが、リアルタイムで問題に取り組むための高性能を示しています。 ここで、ニューラルネットワークを使用してテーブル抽出フィールドで行われた調査を見てみましょう。また、それらを簡単に復習しましょう。


テーブルネット

紙: TableNet:エンドツーエンドのテーブル検出とスキャンしたドキュメント画像からの表形式データ抽出のためのディープラーニングモデル

導入: TableNetは、2019年にTCS Researchのチームから提案された最新のディープラーニングアーキテクチャです。主な動機は、携帯電話やカメラを介してスキャンしたテーブルから情報を抽出することでした。

彼らは、画像内の表領域を正確に検出し、検出されたテーブルの行と列から情報を検出して抽出するソリューションを提案しました。

データセット: 使用したデータセットはマーモットでした。 2000ページがPDF形式であり、対応するグラウンドトゥルースとともに収集されました。 これには中国語のページも含まれます。 リンク– http://www.icst.pku.edu.cn/cpdp/sjzy/index.htm

建築: このアーキテクチャは、セマンティックセグメンテーションのエンコーダ-デコーダモデルであるLongetal。に基づいています。 テーブル抽出のFCNアーキテクチャと同じエンコーダ/デコーダネットワークが使用されます。 画像は前処理され、 Tesseract OCR.

モデルは、入力をディープラーニングテクニックにかけることにより、19つのフェーズで導出されます。 最初のフェーズでは、事前トレーニング済みのVGG-1ネットワークの重みを使用しました。 使用されているVGGネットワ​​ークの完全に接続されたレイヤーを1×0.8のたたみ込みレイヤーに置き換えました。 すべての畳み込み層の後に、ReLUのアクティブ化と確率1のドロップアウト層が続きます。 彼らは、1番目のフェーズを、XNUMXつのブランチで構成されるデコードされたネットワークと呼びます。 これは、列領域がテーブル領域のサブセットであるという直感によるものです。 したがって、単一のエンコーディングネットワークは、テーブル領域と列領域の両方の機能を使用して、より正確にアクティブ領域を除外できます。 最初のネットワークからの出力は、XNUMXつのブランチに配信されます。 最初のブランチでは、XNUMXつの畳み込み演算が適用され、最終的な機能マップが元の画像の寸法に合わせて拡大されます。 列を検出するための他のブランチには、ReLUアクティベーション機能を備えた追加の畳み込みレイヤーと、前述のドロップアウト確率と同じドロップアウトレイヤーがあります。 特徴マップは、(XNUMX×XNUMX)たたみ込み層の後に、分数でストライドされたたたみ込みを使用してアップサンプリングされます。 以下はアーキテクチャのイメージです:

TableNetのアーキテクチャ

出力: モデルを使用してドキュメントが処理された後、テーブルと列のマスクが生成されます。 これらのマスクは、テーブルとその列領域を画像から除外するために使用されます。 Tesseract OCRを使用して、情報はセグメント化された領域から抽出されます。 以下は、生成され、後でテーブルから抽出されたマスクを示す画像です。

彼らはまた、元のモデルよりもパフォーマンスの良いICDARで微調整された同じモデルを提案しました。 微調整されたモデルのRecall、Precision、およびF1-Scoreは、それぞれ0.9628、0.9697、0.9662です。 元のモデルには、同じ順序で0.9621、0.9547、0.9583の記録されたメトリックがあります。 それでは、もうXNUMXつのアーキテクチャについて見ていきましょう。


DeepDeSRT

紙: DeepDeSRT:ドキュメントイメージ内のテーブルの検出と構造認識のためのディープラーニング

導入: DeepDeSRTは、ドキュメントまたは画像内のテーブルを検出して理解するために使用されるニューラルネットワークフレームワークです。 タイトルに記載されているように、XNUMXつのソリューションがあります。

  1. ドキュメント画像のテーブル検出のためのディープラーニングベースのソリューションを提供します。
  2. これは、テーブル構造の認識、つまり検出されたテーブルの行、列、およびセルの位置を識別するための、ディープラーニングベースの新しいアプローチを提案します。

提案されたモデルは完全にデータベースであり、ドキュメントや画像のヒューリスティックやメタデータを必要としません。 トレーニングに関する主な利点のXNUMXつは、大規模なトレーニングデータセットを使用せず、テーブル検出とテーブル構造認識の両方に転移学習とドメイン適応の概念を使用したことです。

データセット: 使用されるデータセットは、全体で2013ページの67のドキュメントを含むICDAR 238テーブル競争データセットです。

建築:

  • テーブル検出 提案されたモデルは、テーブルを検出するための基本的なフレームワークとしてFast RCNNを使用しました。 アーキテクチャはXNUMXつの異なる部分に分かれています。 最初の部分では、いわゆる地域提案ネットワーク(RPN)によって、入力画像に基づいて地域提案を生成しました。 XNUMX番目の部分では、Fast-RCNNを使用して地域を分類しました。 このアーキテクチャを裏付けるために、彼らは ZFネット そしてVGG-16の重み。
  • 構造認識 テーブルが正常に検出され、その場所がシステムに認識された後、テーブルの内容を理解するための次の課題は、テーブルの物理構造を構成する行と列を認識して特定することです。 そのため、行と列から情報を抽出するVGG-16の重みで完全に接続されたネットワークを使用しました。 以下は、DeepDeSRTの出力です。

出力:

テーブル検出の出力
構造認識の出力[6]

評価結果は、DeepDeSRTがテーブル検出および構造認識の最先端の方法よりも優れており、1年まで、テーブル検出および構造認識のF96.77メジャーがそれぞれ91.44%および2015%を達成していることを示しています。


グラフニューラルネットワーク

紙: グラフニューラルネットワークを使用したテーブル認識の再考

導入: この研究では、国立人工知能センター(NCAI)のディープラーニングラボラトリーの著者が、テーブルから情報を抽出するためのグラフニューラルネットワークを提案しました。 彼らは、グラフネットワークがこれらの問題に対してより自然な選択であると主張し、XNUMXつの勾配ベースのグラフニューラルネットワークをさらに調査しました。

この提案されたモデルは、視覚的特徴抽出のための畳み込みニューラルネットワークと問題構造を処理するためのグラフネットワークの両方の利点を組み合わせたものです。

データセット: 著者らは、0.5つのカテゴリに分類された、XNUMX万のテーブルからなる新しい大規模な合成データセットを提案しました。

  1. 画像は、マージせず、罫線のないプレーンな画像です
  2. 罫線が時々表示されないなど、画像の境界線の種類が異なる
  3. セルと列のマージを導入
  4. カメラは線形透視変換で画像をキャプチャしました

建築: 彼らは、それぞれの畳み込み特徴を生成する浅い畳み込みネットワークを使用しました。 出力フィーチャの空間次元が入力画像と同じでない場合、入力次元と出力次元の比率に応じて線形的に縮小された位置を収集し、DGCNNと呼ばれるXNUMXつのグラフネットワークを持つ相互作用ネットワークに送信します。そしてGravNet。 グラフネットワークのパラメーターは、元のCNNと同じです。 最終的に、彼らはランタイムペアサンプリングを使用して、内部でモンテカルロベースのアルゴリズムを使用して抽出されたコンテンツを分類しました。 以下は出力です。

出力:

グラフニューラルネットワークによって生成された出力

以下は、ネットワークで生成された、ネットワークのXNUMXつのカテゴリに対して生成された精度の数値を表にしたものです。 データセット セクション:


CGANと遺伝的アルゴリズム

紙: 条件付き生成的敵対的ネットワークと遺伝的アルゴリズムを使用したドキュメントからのテーブルの抽出

導入: この研究では、著者らはボトムアップ(ラインをセル、行、または列に統合する)アプローチではなく、トップダウンアプローチを使用しました。

この方法では、生成的な敵対的ネットワークを使用して、テーブル画像を標準化された「スケルトン」テーブル形式にマッピングしました。 このスケルトンテーブルは、テーブルの内容を含まないおおよその行と列の境界を示します。 次に、遺伝的アルゴリズムによって最適化された距離測定を使用して、候補の潜在テーブル構造のレンダリングをスケルトン構造に適合させます。

データセット: 著者は、4000テーブルの独自のデータセットを使用しました。

建築: 提案されたモデルはXNUMXつの部分で構成されています。 最初の部分では、条件付き生成敵対ニューラルネットワークを使用して、入力画像をスケルトンテーブルに抽象化します。 GANには、ランダムなサンプルを生成するジェネレーターと、生成された画像が偽物かオリジナルかを通知する弁別子のXNUMXつのネットワークがあります。 ジェネレーターGは、プロセスが逆転するボトルネックレイヤーまで入力画像が一連の漸進的なダウンサンプリングレイヤーを通過するエンコーダー/デコーダーネットワークです。 デコードレイヤーに十分な情報を渡すために、スキップ接続を備えたU-Netアーキテクチャが使用され、連結によってスキップ接続がレイヤーiとn − iの間に追加されます。ここで、nはレイヤーの総数、iはレイヤー番号です。エンコーダで。 判別子DにはPatchGANアーキテクチャが使用されます。これにより、パッチのスケールで出力画像の構造が不利になります。 これらは、スケルトンテーブルとして出力を生成します。

XNUMX番目の部分では、各候補とスケルトンの間の距離の測定値を使用して、生成されたスケルトンイメージに対する候補の潜在データ構造の適合を最適化します。 これは、画像内のテキストが抽出される方法です。 以下は、アーキテクチャを表す画像です。

アプローチの概略図

出力: 推定されたテーブル構造は、比較によって評価されます- 行と列の番号、左上隅の位置、行の高さと列の幅

遺伝的アルゴリズムは、テーブルから情報を抽出しながら、行方向に95.5%の精度と列方向に96.7%の精度を提供しました。


ドキュメントをデジタル化する必要があります、 領収書 or 請求書 しかし、コーディングするのが面倒ですか? に向かいます ナノネット 無料でOCRモデルを作成してください!


[コード]従来のアプローチ

このセクションでは、ディープラーニングとOpenCVを使用してテーブルから情報を抽出する方法のプロセスを学習します。 この説明は導入と考えることができますが、最先端のモデルを構築するには、多くの経験と実践が必要になります。 これは、さまざまなアプローチとアルゴリズムを使用してコンピューターをトレーニングする方法の基本を理解するのに役立ちます。

問題をより正確に理解するために、記事全体で使用されるいくつかの基本的な用語を定義します。

  • テキスト:文字列とXNUMXつの属性(上、左、幅、高さ、フォント)を含みます
  • LINE:元のファイルの同じ行にあると想定されるテキストオブジェクトが含まれています
  • 単線:textオブジェクトがXNUMXつだけのlineオブジェクト。
  • マルチライン:複数のテキストオブジェクトを持つ線オブジェクト。
  • マルチライン ブロック:連続する複数行オブジェクトのセット。
  • :テーブル内の水平ブロック
  • コラム:テーブル内の垂直ブロック
  • セル:行と列の交差
  • セル–パディング:セル内の内部パディングまたはスペース。

OpenCVによるテーブル検出

従来のコンピュータービジョン技術を使用して、スキャンしたテーブルから情報を抽出します。 これがパイプラインです。 最初に、通常のカメラを使用してデータ(情報を抽出する必要がある場所からのテーブル)をキャプチャし、次にコンピュータービジョンを使用して、境界線、エッジ、セルを見つけます。 異なるフィルターとコンターを使用し、テーブルのコア機能を強調します。

テーブルの画像が必要になります。 これを電話でキャプチャするか、既存の画像を使用できます。 以下はコードスニペットです。

file = r’table.png’
table_image_contour = cv2.imread(file, 0)
table_image = cv2.imread(file)

ここでは、同じ画像画像を使用するため、XNUMXつの変数をロードしました。 テーブル画像の輪郭 読み込まれた画像に検出された輪郭を描くとき。 以下は、プログラムで使用しているテーブルの画像です。

テーブルの画像

と呼ばれる手法を採用します 逆画像しきい値処理 与えられた画像に存在するデータを強化します。

ret, thresh_value = cv2.threshold( table_image_contour, 180, 255, cv2.THRESH_BINARY_INV)

別の重要な前処理ステップは 画像膨張。 膨張は、前景ピクセルの領域の境界を徐々に拡大するバイナリイメージ(白黒)に適用される単純な数学演算です(すなわち 白いピクセル、通常)。

kernel = np.ones((5,5),np.uint8)
dilated_value = cv2.dilate(thresh_value,kernel,iterations = 1)

OpenCVでは、メソッドを使用します。 輪郭を見つける 現在の画像の輪郭を取得します。 このメソッドはXNUMXつの引数を取ります。XNUMXつ目は膨張した画像です(膨張した画像の生成に使用される画像はtable_image_contourです– findContoursメソッドはバイナリ画像のみをサポートします)、XNUMXつ目は cv2.RETR_TREE 輪郭検索モードを使用するように指示します。XNUMX番目は  cv2.CHAIN_APPROX_SIMPLE これは輪郭近似モードです。 の 輪郭を見つける XNUMXつの値を解凍するため、次の名前の変数をもうXNUMXつ追加します。 階層。 画像がネストされている場合、輪郭は相互依存性を醸し出します。 このような関係を表すには、階層が使用されます。

contours, hierarchy = cv2.findContours( dilated_value, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

等高線は、データが画像のどこに存在するかを示します。 次に、前のステップで計算した等高線リストを反復処理し、メソッドを使用して、元の画像で観察された長方形のボックスの座標を計算します。  cv2.boundingRect。 最後の反復では、メソッドを使用して、これらのボックスを元の画像table_imageに配置しました。 cv2.rectangle().

for cnt in contours: x, y, w, h = cv2.boundingRect(cnt) # bounding the images if y < 50: table_image = cv2.rectangle(table_image, (x, y), (x + w, y + h), (0, 0, 255), 1) 

これが最後のステップです。 ここではメソッドを使用します 名前付きウィンドウ 抽出されたコンテンツとそれに埋め込まれた等高線でテーブルをレンダリングします。 以下はコードスニペットです。

plt.imshow(table_image)
plt.show()
cv2.namedWindow('detecttable', cv2.WINDOW_NORMAL)

出力

上記のコードスニペットでyの値を300に変更します。これが出力になります。

テーブルを抽出したら、tesseract OCRエンジンを介してすべての等高線クロップを実行できます。 こちら。 各テキストのボックスを取得したら、x座標とy座標に基づいてそれらをクラスター化し、対応する行と列を導きます。

これに加えて、PDFMinerを使用してPDFドキュメントをHTMLファイルに変換するオプションがあります。このファイルは、正規表現を使用して解析し、最終的にテーブルを取得できます。 これがあなたがそれをする方法です。


PDFMinerとRegexの解析

小さなドキュメントから情報を抽出するには、深層学習モデルを構成したり、コンピュータービジョンアルゴリズムを作成したりするのに時間がかかります。 代わりに、Pythonで正規表現を使用して テキストを抽出 PDFドキュメントから。 また、この手法は画像には機能しないことに注意してください。 これは、HTMLファイルまたはPDFドキュメントから情報を抽出するためにのみ使用できます。 これは、正規表現を使用する場合、コンテンツをソースと照合して情報を抽出する必要があるためです。 画像を使用すると、テキストを一致させることができなくなり、正規表現が失敗します。 次に、簡単なPDFドキュメントを操作して、その中のテーブルから情報を抽出してみましょう。 以下は画像です:

最初のステップでは、PDFをプログラムに読み込みます。 それが完了したら、PDFをHTMLに変換して、正規表現を直接使用して、テーブルからコンテンツを抽出できるようにします。 このために使用するモジュールは pdfminer。 これは、PDFからコンテンツを読み取り、HTMLファイルに変換するのに役立ちます。

以下はコードスニペットです。

from pdfminer.pdfinterp import PDFResourceManager from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.converter import HTMLConverter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO import StringIO
import re def convert_pdf_to_html(path): rsrcmgr = PDFResourceManager() retstr = StringIO() codec = 'utf-8' laparams = LAParams() device = HTMLConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) fp = file(path, 'rb') interpreter = PDFPageInterpreter(rsrcmgr, device) password = "" maxpages = 0 #is for all caching = True pagenos=set() for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages,password=password,caching=caching, check_extractable=True): interpreter.process_page(page) fp.close() device.close() str = retstr.getvalue() retstr.close() return str

コードクレジット: ゼブロス

正規表現やPDF関連のライブラリを含む多くのモジュールをインポートしました。 メソッドで convert_pdf_to_html、 HTMLファイルに変換する必要があるPDFファイルのパスを送信します。 メソッドの出力は、次のようにHTML文字列になります。

'<span style="font-family: XZVLBD+GaramondPremrPro-LtDisp; font-size:12px">Changing Echoesn<br>7632 Pool Station Roadn<br>Angels Camp, CA 95222n<br>(209) 785-3667n<br>Intake: (800) 633-7066n<br>SA </span><span style="font-family: GDBVNW+Wingdings-Regular; font-size:11px">s</span><span style="font-family: UQGGBU+GaramondPremrPro-LtDisp; font-size:12px"> TX DT BU </span><span style="font-family: GDBVNW+Wingdings-Regular; font-size:11px">s</span><span style="font-family: UQGGBU+GaramondPremrPro-LtDisp; font-size:12px"> RS RL OP PH </span><span style="font-family: GDBVNW+Wingdings-Regular; font-size:11px">s</span><span style="font-family: UQGGBU+GaramondPremrPro-LtDisp; font-size:12px"> CO CJ n<br></span><span style="font-family: GDBVNW+Wingdings-Regular; font-size:11px">s</span><span style="font-family: UQGGBU+GaramondPremrPro-LtDisp; font-size:12px"> SF PI </span><span style="font-family: GDBVNW+Wingdings-Regular; font-size:11px">s</span><span style="font-family: UQGGBU+GaramondPremrPro-LtDisp; font-size:12px"> AH SPn<br></span></div>' 

正規表現は、パターンマッチングに使用される最もトリッキーでクールなプログラミング手法のXNUMXつです。 これらは、たとえば、コードのフォーマット、Webスクレイピング、検証の目的など、いくつかのアプリケーションで広く使用されています。 HTMLテーブルからコンテンツを抽出する前に、正規表現についていくつか簡単に学習しましょう。

このライブラリは、パターンを照合および検索するためのさまざまな組み込みメソッドを提供します。 以下はその一部です。

import re # Match the pattern in the string
re.match(pattern, string) # Search for a pattern in a string
re.search(pattern, string) # Finds all the pattern in a string
re.findall(pattern, string) # Splits string based on the occurrence of pattern
re.split(pattern, string, [maxsplit=0] # Search for the pattern and replace it with the given string
re.sub(pattern, replace, string)

正規表現で通常表示される文字/式には、次のものがあります。

  • [AZ]-大文字
  • d-数字
  • w-単語文字(文字、数字、およびアンダースコア)
  • s-空白(スペース、タブ、および空白)

次に、HTMLの特定のパターンを見つけるために、正規表現を使用してパターンを記述します。 最初に、アドレスチャンクがプログラム名(ANGELS CAMP、APPLE VALLEYなど)に従って個別のブロックに分離されるようにデータを分割します。

pattern = '(?<=<span style="font-family: XZVLBD+GaramondPremrPro-LtDisp; font-size:12px">)(.*?)(?=<br></span></div>)' for programinfo in re.finditer(pattern, biginputstring, re.DOTALL): do looping stuff…

その後、プログラム名、都市、州、郵便番号が常に同じパターン(テキスト、コンマ、5桁の大文字、5つの数字(またはXNUMXつの数字のハイフンXNUMXつの数字))になっていることがわかります。これらはPDFファイルにあります。入力と見なした)。 次のコードスニペットを確認してください。

# To identify the program name
programname = re.search('^(?!<br>).*(?=\n)', programinfo.group(0))
# since some programs have odd characters in the name we need to escape
programname = re.escape(programname) citystatezip =re.search('(?<=>)([a-zA-Zs]+, [a-zA-Zs]{2} d{5,10})(?=\n)', programinfo.group(0))
mainphone =re.search('(?<=<br>)(d{3}) d{3}-d{4}x{0,1}d{0,}(?=\n)', programinfo.group(0))
altphones = re.findall('(?<=<br>)[a-zA-Zs]+: (d{3}) d{3}-d{4}x{0,1}d{0,}(?=\n)(?=\n)', programinfo.group(0)) 

これは、正規表現を使用してPDFファイルから情報を抽出する方法を説明する簡単な例です。 必要な情報をすべて抽出したら、このデータをCSVファイルに読み込みます。

def createDirectory(instring, outpath, split_program_pattern): i = 1 with open(outpath, 'wb') as csvfile: filewriter = csv.writer(csvfile, delimiter=',' , quotechar='"', quoting=csv.QUOTE_MINIMAL) # write the header row filewriter.writerow(['programname', 'address', 'addressxtra1', 'addressxtra2', 'city', 'state', 'zip', 'phone', 'altphone', 'codes']) # cycle through the programs for programinfo in re.finditer(split_program_pattern, instring, re.DOTALL): print i i=i+1 # pull out the pieces programname = getresult(re.search('^(?!<br>).*(?=\n)', programinfo.group(0))) programname = re.escape(programname) # some facilities have odd characters in the name

これは、抽出したHTMLをCSVファイルにプッシュする方法を説明する簡単な例です。 まず、CSVファイルを作成し、すべての属性を見つけて、それぞれの列にXNUMXつずつプッシュします。 以下はスクリーンショットです:

正規表現を使用してテーブルから抽出されたアイテムのスクリーンショット

時々、上記のテクニックは複雑に見え、テーブルがネストされていて複雑である場合、プログラマーに課題を提起します。 ここでは、CVまたはディープラーニングモデルを選択すると、多くの時間を節約できます。 これらの従来の方法の使用を妨げる欠点と課題を見てみましょう。


従来の方法の課題

このセクションでは、テーブル抽出プロセスが失敗する可能性のある場所について詳しく学び、ディープラーニングから生まれた最新の方法を使用してこれらの障害を克服する方法をさらに理解します。 ただし、このプロセスは簡単ではありません。 その理由は、通常、テーブルが全体にわたって一定のままではないためです。 データを表すためのさまざまな構造があり、テーブル内のデータは、さまざまな書式設定スタイル(フォントスタイル、色、フォントサイズ、高さ)で多言語化できます。 したがって、堅牢なモデルを構築するには、これらすべての課題に注意する必要があります。 通常、このプロセスには、テーブルの検出、抽出、変換のXNUMXつのステップが含まれます。 すべてのフェーズの問題をXNUMXつずつ識別しましょう。


テーブル検出

このフェーズでは、指定された入力のどこにテーブルが存在するかを正確に特定します。 入力は、画像、PDF / Wordドキュメント、場合によってはビデオなど、任意の形式にすることができます。 さまざまな手法とアルゴリズムを使用して、線または座標によってテーブルを検出します。 場合によっては、境界線のないテーブルに遭遇することがあり、そこではさまざまなメソッドを選択する必要があります。 これらに加えて、他のいくつかの課題があります:

  • 画像変換: 画像変換は、ラベルを検出するための主要なステップです。 これには、テーブルに存在するデータと境界線の拡張が含まれます。 表に示されたデータに基づいて、適切な前処理アルゴリズムを選択する必要があります。 たとえば、画像を操作する場合、しきい値処理とエッジ検出器を適用する必要があります。 この変換ステップにより、コンテンツをより正確に見つけることができます。 場合によっては、輪郭がうまくいかず、アルゴリズムが画像を強調できないことがあります。 したがって、適切な画像変換ステップと前処理を選択することが重要です。
  • 画質: 情報抽出のためにテーブルをスキャンする場合、これらのドキュメントが明るい環境でスキャンされることを確認する必要があります。これにより、高品質の画像が保証されます。 照明条件が悪い場合、CVおよびDLアルゴリズムは、指定された入力でテーブルを検出できない可能性があります。 ディープラーニングを使用している場合は、データセットに一貫性があり、適切な標準画像のセットがあることを確認する必要があります。 古いしわくちゃの紙にあるテーブルでこれらのモデルを使用する場合、最初にこれらの画像のノイズを前処理して除去する必要があります。
  • さまざまな構造レイアウトとテンプレート: すべてのテーブルが一意ではありません。 XNUMXつのセルは、垂直方向または水平方向にいくつかのセルにまたがることができます。また、スパンするセルの組み合わせにより、膨大な数の構造上のバリエーションを作成できます。 また、一部はテキストの特徴を強調し、表の行は表の構造の理解に影響を与える可能性があります。 たとえば、水平線や太字のテキストは、テーブルの複数のヘッダーを強調する場合があります。 テーブルの構造は、セル間の関係を視覚的に定義します。 テーブル内の視覚的な関係により、関連するセルを計算で見つけ、それらから情報を抽出することが困難になります。 したがって、テーブルのさまざまな構造を処理する上で堅牢なアルゴリズムを構築することが重要です。
  • セルの余白、余白、境界線: これらはすべてのテーブルに不可欠です。パディング、マージン、ボーダーは常に同じになるとは限りません。 セル内に多くのパディングがあるテーブルと、そうでないテーブルがあります。 良質の画像と前処理ステップを使用すると、テーブル抽出プロセスをスムーズに実行できます。

テーブル抽出

これは、テーブルが識別された後に情報が抽出されるフェーズです。 コンテンツがどのように構造化され、どのコンテンツがテーブルに存在するかについては、多くの要因があります。 したがって、アルゴリズムを構築する前に、すべての課題を理解することが重要です。

  • 密なコンテンツ: セルの内容は、数値またはテキストのいずれかです。 ただし、テキストの内容は通常密であり、頭字語や略語を使用したあいまいな短いテキストのチャンクが含まれています。 表を理解するには、テキストを明確にし、略語と頭字語を拡張する必要があります。
  • 異なるフォントとフォーマット: フォントは通常、スタイル、色、高さが異なります。 これらが汎用的であり、簡単に識別できることを確認する必要があります。 いくつかのフォントファミリー、特に筆記体や手書きのフォントファミリーは、抽出が少し難しいです。 したがって、適切なフォントと適切なフォーマットを使用すると、アルゴリズムが情報をより正確に識別するのに役立ちます。
  • 複数のページPDFと改ページ: テーブルのテキスト行は、事前定義されたしきい値の影響を受けます。 また、複数のページにまたがるセルを使用すると、テーブルを識別することが困難になります。 マルチテーブルページでは、異なるテーブルを互いに区別することは困難です。 スパースで不規則なテーブルは扱いにくいです。 したがって、グラフィックのルーリングラインとコンテンツレイアウトは、テーブル領域を見つけるための重要なソースとして一緒に使用する必要があります。

テーブル変換

最後のフェーズには、抽出された情報をテーブルから変換して、Excelまたは他のソフトウェアを使用して編集可能なドキュメントとしてコンパイルすることが含まれます。 いくつかの課題について学びましょう。

  • レイアウトを設定: スキャンしたドキュメントからさまざまな形式のテーブルを抽出する場合、コンテンツをプッシュするための適切なテーブルレイアウトが必要です。アルゴリズムがセルから情報を抽出できない場合があります。 したがって、適切なレイアウトを設計することも同様に重要です。
  • さまざまな価値の提示パターン: セルの値は、さまざまな構文表現パターンを使用して表示できます。 表のテキストが6±2であると考えてください。アルゴリズムはその特定の情報の変換に失敗する可能性があります。 したがって、数値の抽出には、可能な表示パターンの知識が必要です。
  • 視覚化のための表現: テーブルを記述できるマークアップ言語など、テーブルのほとんどの表現形式は、視覚化のために設計されています。 したがって、テーブルを自動的に処理することは困難です。

これらは、従来の手法を使用したテーブル抽出プロセス中に直面する課題です。 次に、ディープラーニングの助けを借りてこれらを克服する方法を見てみましょう。 さまざまな分野で広く研究されています。



ドキュメント、領収書、または 請求書 しかし、コーディングするのが面倒ですか? に向かいます ナノネット 無料でOCRモデルを作成してください!


まとめ

この記事では、テーブルからの情報抽出について詳しく説明しました。 ディープラーニングやコンピュータービジョンなどの最新テクノロジーが、正確な結果を出力するための堅牢なアルゴリズムを構築することで、ありふれたタスクを自動化する方法を見てきました。 最初のセクションでは、個人、業界、およびビジネスセクターのタスクを容易にする上でのテーブル抽出の役割について学び、PDF / HTMLからのテーブルの抽出、フォームの自動化、 請求書 自動化など。コンピュータービジョンを使用してアルゴリズムをコーディングし、しきい値処理、拡張、および輪郭検出技術を使用してテーブル内の情報の位置を見つけました。 従来の手法を使用する場合にテーブルの検出、抽出、変換のプロセスで直面する可能性のある課題について説明し、ディープラーニングがこれらの問題の克服にどのように役立つかについて説明しました。 最後に、いくつかのニューラルネットワークアーキテクチャを確認し、与えられたトレーニングデータに基づいてテーブル抽出を実現する方法を理解しました。



アップデート:
‌ディープラーニングを使用したテーブル検出と情報抽出のさまざまなアプローチに関する読み物を追加しました。

タイムスタンプ:

より多くの AIと機械学習