Free Trial

ブログ

アナリティクスに関する聡明な考えに触れ、インサイトとアイデアが得られます。
gawa
16 - Nebula
16 - Nebula

PDFのパースは難しい

 

PDFファイルはビジネスにおいて多用されるファイル形式であり、避けては通れません。その背景として、①OSやプラットフォームに依らず閲覧しやすい②複数のファイル形式(Excel, Word, PowerPoint等)をひとつにパッケージできる、という特徴があるからでしょう。特にB to B企業間のデータ交換方式としてPDFが多用されているように感じます。あるPDFを作成した企業(人)にとって、そのPDFはデータ処理の「終着点」かつ成果物ですが、受け取る側としてはデータ処理の「出発点」であり、この辺りのギャップがPDFデータ処理における根深い課題のように感じています。

PDFのような非構造化データのパース処理は一般的にとてもチャレンジングなタスクです。構造化データの場合は方眼紙のように列名と行番号でデータを特定できますが、非構造化データは白紙の自由帳であり、データの特定は幾何学的な位置情報に頼らざるをえません。

 

Alteryx DesignerでPDFを読み込むには?

 

Alteryx DesignerでPDFを入力したいと考えたときに、まずIntelligence SuiteのAdd-onツールの利用を検討するかと思います。こちらのブログ(英語)に、その活用例が紹介されています。

一方、Pythonツールを利用することでもPDFデータを読み込むことが可能であり、選択肢として知っておいて損はありません。本ブログではIntelligence Suiteを使わずに、Pythonツールとpdfminer.sixライブラリーを利用したPDFパース手法を紹介します。

 

Pythonツールでpdfminer.sixを利用してPDFからデータを読み込む

 

pdfminer.sixのライブラリーの詳細な説明は割愛しますが、重要な点は、このライブラリーを利用すると、PDF内のテキストデータに加え、その座標情報も取得できるということです。ただし、pfeminer.sixにはOCRの機能はないため、入力するPDFはReadableなテキストである必要があります。この点ご留意ください。

 

例えば以下のような履歴書のPDFを読み込んでみます。

 

image.png

 

Pythonツール内でpdfminer.sixライブラリーを利用して、各テキストの属性情報をいくつか抜き出してみたのが下図です。PDF内のテキストは矩形のオブジェクトとして認識されており、その矩形の4つの頂点の(X, Y)座標を取得し X0, X1, Y0, Y1 としています。Angleはテキストの角度を表しています。0°であれば横書き、90°/-90°であれば縦書きとなります。座標情報はPDFパースにおいて非常に重要な情報です。例えば、X0(Y0)の値が同じテキストは、縦(横)に整列しているとみなし、表形式を再現するのに利用できるかもしれません。

 

image.png

 

座標データから空間オブジェクトを作り、PDFパースする

 

ここからは応用例です。先述の通りテキストデータは取得できましたが、どのレコードに欲しいデータがあるのか判別できません。これを空間オブジェクトを利用して、抜き出してみたいと思います。この手法は、こちらのブログ(英語)で紹介されているImage Templateツールと似たような発想になります。つまり、予めテンプレートのPDFに、抜き出したいデータのある個所をマークアップしておき、そのテンプレートと照合する形でデータを抜き出します。

 

テンプレートの作成

 

まずは抜き出したいデータのある個所をマークアップしたテンプレートを作成します。同じ様式のページがひとつのPDFファイル内で繰り返し存在する想定として、1ページ目をテンプレートに利用します:

  1. 1ページ目で、抜き出したいデータの範囲をカバーするように注釈のテキストボックスを配置
  2. それぞれのテキストボックス内にデータの名前(生年月日、電話番号、など)を入力

 

image.png

Alteryx Workflow

 

PDF内では、もともとPDFに入っているテキストオブジェクトと、先のステップで追加したような注釈オブジェクトは、異なる種類のオブジェクトとして認識されます。これらのオブジェクトを取得し、テキストと座標を取得する一連の処理をマクロ化してみました。下図のマクロの出力アンカーから

Tアンカー:テキストオブジェクト ➡取り出したいデータ と 矩形の空間オブジェクト

Aアンカー:注釈オブジェクト   ➡テンプレートの注釈データ と 矩形の空間オブジェクト

が出てきます。

 

image.png 

 

続いて、TアンカーとAアンカーの空間オブジェクトをSpatial Matchで照合させます。こうすることで、テンプレート側の注釈オブジェクトの範囲内に存在するテキストデータのみを抜き出すことが可能になります。下図の左側の設定画面を見ると、その包含関係が視覚的にも分かります。

 

image.png

 

この後の処理は目的によりますが、例えばページでグループ化し、クロスタブをするとこのような形に変換されます

 

image.png

Spatial PDFマクロ利用時の注意点

 

先ほど紹介したWFをyxzpで共有しますので、興味ある方は一度動作させてみてください。WF内で利用しているマクロ'Spatial PDF.yxmc'を利用するにあたり注意事項です。このマクロをお使いのコンピュータで初めて実行する際は、Pythonライブラリーをインストールする必要があります。以下手順に従ってください:

 

①Alteryx Designerを管理者権限で起動する。アイコン右クリック➡管理者として実行

 

image.png

 

②yxzpを展開しWFを開く。Spatial PDFの設定画面で 'Library' Install Mode' を選び、WFを実行。

 

image.png

 

実行後にエラーが出なければライブラリーのインストールは成功

エラーが出た場合、以下を確認

・Pythonのライブラリーインストールのコマンド pip がネットワークではじかれていないか?オフィスからだとProxyでブロックされていることがあるので、IT管理者に問い合わせる。

・Alteryx Designerが管理者権限で起動しているか?

 

さいごに

 

本ブログでは、Pythonツールと空間ツールを利用したPDFデータのパースについてご紹介しました。毎回決まったところに存在するデータを抜き出す場合に有効な手法となります。また、空間オブジェクトを使わずとも、座標情報を利用することで表を再現するなど、他にも応用がきくと思います。

PDFパースは一般的な最適解がないタスクです。Intelligence Suite等の機能も併せて、何がベストプラクティスとなりうるのか、幅広くご検討いただければと思います。

 


 

本ブログで共有しているWFについての申し送り事項です

・2022.3と2024.1にて動作確認済みです

・技術紹介目的で作成したWFであり、必ずしも動作を保証するものではありませんので、利用・不具合修正等は自己責任で実施ください

・エラー/不具合等の問い合わせ対応はいたしかねますのでご了承ください