目次


OCR とアナリティクス・テクノロジーを使用して PDF ファイルから表の情報を抽出する

Comments

IBM Bluemix を使用して、PDF ファイルからテキストと、文書に含まれる表の構造を一緒に抽出し、自動的にエラーを修正した上で XML 出力または HTML 出力を生成するアプリケーションを作成する方法を紹介します。

PDF 文書をテキストに変換するには、PDF 文書からすべてのテキストを抽出するだけでなく、その文書に含まれる表の構造も保持する必要があります。例えば、PDF 文書に以下の表があるとします。

PDF 文書の表の例を示す画像
PDF 文書の表の例を示す画像

この表をテキストに変換する場合、表内のすべてのテキストを抽出し、表の構造を正しく識別して、その表の構造を反映したマークアップ・タグ (<TABLE><TR><TD> など) を、抽出したテキストに挿入する必要があります。このステップを実行するには、商用 OCR エンジン (IBM Datacap に組み込まれている Nuance OCR エンジンなど) を使用することができます。

ただし、OCR エンジンからの出力にはエラーが含まれている可能性があります。そのような出力は、以降の処理で使いものになりません。以下の図に示されているように、この例での OCR エンジンからの出力には、赤い枠で囲まれた部分に 2 つのエラーがあります。

表として識別された部分の出力 (エラーが修正されていない状態)
表として識別された部分の出力 (エラーが修正されていない状態)

第一のエラーとして、表のタイトルが他の列見出しに混じり込んでいます。第二のエラーとしては、最初の行の見出しと表のタイトルが 1 つのセルに結合されています。そこで、このようなエラーを修正する何らかの手段が必要となります。

私たちのチームは、エラー修正テキスト・アナリティクス・ライブラリーを使用して、このようなエラーを修正する方法を開発しました。このテキスト・アナリティクス・ライブラリーは、自己完結型 AQL モジュールとして実装され、組み込み SystemT ランタイム内で実行されます。大まかに言うと、このモジュールは表の構造のグラフィック表現を作成して表の構造に含まれるエラーを特定し、そのグラフ構造にルール駆動型の手法を適用してエラーを修正します。上記の例でのエラーを修正すると、以下のような結果になります。

修正された表の構造の画像 (エラー修正を適用した後)
修正された表の構造の画像 (エラー修正を適用した後)

このチュートリアルでは、PDF 文書を変換してテキストにする Web サービスを提供する REST アプリケーションを、Bluemix を使用して作成する方法を説明します。このサービスは PDF ファイルを受け取って、その PDF ファイルを (表として識別された部分を取り込んだ) XML または HTML によるテキスト表現に変換した後、その結果をユーザーに返します。XML 表現は OCR エンジン (例えば、IBM Datacap に組み込まれている Nuance OCR エンジン) からの出力である一方、HTML 表現は OCR エンジンによって表として識別された部分の構造に含まれるエラーを修正する、エラー修正プロセスの出力結果です。

このアプリケーションを構成する要素は以下のとおりです。

  • Web 層: 受信される PDF ファイルを受け取って、結果をクライアント・アプリケーションに返すための REST API を提供します。
  • Java コンポーネント: PDF ファイルを処理するこのコンポーネントは、PDF ファイルをバックエンドの OCR エンジンに送信してその結果を取得し、表として識別された部分に対してテキスト・アナリティクス・ライブラリーを適用してエラー修正を行います。
  • バックエンドの OCR エンジン: IBM Datacap によって提供されます。

IBM Datacap は、文書イメージから情報を抽出します。複数の認知エンジンと連動する IBM Datacap は、ルールを使用して構成することができます。このチュートリアルでは、Datacap OCR エンジンを例として用いますが、これに相当する OCR エンジンであれば、どのエンジンでも使用することができます。

アプリケーションを作成するために必要となるもの

  • REST を使用した Web 開発の知識。このチュートリアルの REST アプリケーションは、Spring Framework 3.1.2 を使用して開発します。詳細については、Spring Framework の「Quick Start」を参照してください。
  • アプリケーションの開発に使用する統合開発環境 (IDE)
  • BigInsights プラグイン。「InfoSphere BigInsights Tools for Eclipse のインストール」を参照してください。
  • Bluemix アカウント
  • OCR サービスを提供するバックエンドの Datacap サーバー。Datacap OCR サーバー・イメージは、このリンク先からダウンロードすることができます。このイメージを起動する方法については、付属の readme.txt ファイルを読んでください。
  • REST アプリケーションのテスト用ツール。ここでは、Firefox アドオンの Poster を使用します。
  • Web アプリケーションのテストに使用する Web サーバー。ここでは、Tomcat Version 7.0 サーバーを使用します。

ステップ 1. Spring Framework 3.1.2 を使用して新規 Web プロジェクトを作成する

このステップで作成するプロジェクトには Spring コントローラーを含め、必要なライブラリーと Web サーバー・ランタイムが組み込まれるようにプロジェクトを構成します。

  1. PDFOCRApp という名前の新しい動的 Web プロジェクトを作成します。この Web プロジェクトの /WEB-INF/lib フォルダーに、必要な Spring Framework 3.1.2 JAR ファイルをコピーします。以下に、必要な JAR ファイルが示されています。リポジトリーの既存の Web プロジェクトをワークスペースにインポートするのでも、新規プロジェクトを作成して必要な JAR ファイルを /WEB-INF/lib フォルダーにコピーするのでも構いません。

    Spring Framework の「Quick Start」を参照してください。または、Maven リポジトリーから直接 JAR ファイルをダウンロードします。

    プロジェクトのレイアウトを示す画像
    プロジェクトのレイアウトを示す画像
  2. BigInsights V2.1.2.0 ライブラリーをプロジェクト・ライブラリーに追加します。
    1. 新しく作成した Web プロジェクトを右クリックし、「Properties (プロパティー)」を選択します。
    2. ポップアップ・ウィンドウで「Java Build Path (Java ビルド・パス)」をクリックし、右側の「Libraries (ライブラリー)」パネルを選択します。
    3. 「Add Library (ライブラリーの追加)」をクリックします。
    4. 「Add Library (ライブラリーの追加)」ウィンドウで、「BigInsights Libraries (BigInsights ライブラリー)」を選択してから「Next (次へ)」をクリックします。
    BigInsights ライブラリーを追加する操作を示す画像
    BigInsights ライブラリーを追加する操作を示す画像
  3. リストから「BigInsights V2.1.2.0」を選択して、「Finish (完了)」をクリックします。 プロジェクトのライブラリーを示す画像
    プロジェクトのライブラリーを示す画像
  4. 「New Server (新規サーバー)」ウィザードで新しいサーバーを追加し、アプリケーションのデプロイ先とする Web サーバーを選択します。この例では、Tomcat Version 7.0 サーバーを選択します。
  5. HTTP リクエストおよび HTTP レスポンスを処理する Spring コントローラー・クラスを新規に作成します。以下に記載するサンプル・コードで、REST フォーマットの HTTP リクエストおよび HTTP レスポンスを処理する RESTController という名前の新しいクラスを作成します。このクラスには、extractanalytics という2 つのメソッドを含めます。それぞれの関数の URL は、@RequestMapping の値で定義します。この場合、各 @RequestMapping の値は対応する関数を以下のように呼び出します。
    • /pdfextraction: この URL が呼び出す extract メソッドは、クライアントが POST 送信した PDF ファイルを受け取って Java API を呼び出し、その PDF ファイルを OCR エンジンが組み込まれているバックエンドの Datacap サーバーに (PDF ファイルの内容を認識するために) 送信し、その結果を XML フォーマットでクライアントに返します。
    • /pdfanalytics: この URL が呼び出す analytics メソッドは、クライアントが POST 送信した PDF ファイルを受け取って Java API を呼び出し、その PDF ファイルを OCR エンジンが組み込まれているバックエンドの Datacap サーバーに (PDF ファイルの内容を認識するために) 送信し、認識された結果に対してエラー修正を実行した上で、修正された結果を HTML フォーマットでクライアントに返します。

    この 2 つの関数に、PDF ファイルを処理するためのコードを作成して追加する方法については、ステップ 3 で説明します。

    このコントローラー・クラスの関数は、以下のコード・リストで定義されています。

        @RequestMapping(value = "/index", method = RequestMethod.GET)
        public String index(HttpServletRequest request, HttpServletResponse response) {
            
            // this returns the index.jsp under /web-inf/jsp folder with .jsp
            return "index";
        }
    
        @RequestMapping(value = "/pdfextraction", method = RequestMethod.POST)
        public @ResponseBody
        Object extract(HttpServletRequest request, HttpServletResponse response) throws Exception {
                  
    
            return "ok";
        }
    
        @RequestMapping(value = "/pdfanalytics", method = RequestMethod.POST)
        public @ResponseBody
        Object analytics(HttpServletRequest request, HttpServletResponse response) throws Exception {
            System.out.println("pdfanalytics");
           
    
            return "ok";
    
    }

    新しく作成したコントローラー・クラスを使用するには、Spring コンテキスト・リスナーをロードして起動するように web.xml ファイルを編集しなければなりません。また、rest-servlet.xml ファイルを編集して、Spring にそのコントローラー・クラスをロードするよう指示する必要もあります。詳細については、サンプルとして提供されている rest-servlet.xml および web.xml ファイルを参照してください。

ステップ 2. PDF に含まれる表の抽出処理と分析処理を行うための新しい BigInsights Java プロジェクトを作成する

このプロジェクトでは AQL を使用して PDF ファイルを処理します。このセクションでは、既存の BigInsights Text Analytics プロジェクトを Eclipse ワークスペースにインポートする方法を説明します。変更する必要がある AQL ファイルは 1 つだけなので、AQL について十分に理解している必要はありません。後で、ステップ 1 で作成した Web プロジェクトに Java ファイルとコンパイル済み AQL モジュールをコピーして、Web 上で実行できるようにします。

  1. 「File (ファイル)」メニューから「Import (インポート)」を選択し、次に「Existing Projects into Workspace (既存プロジェクトをワークスペースへ)」を選択します。generic_table_extraction プロジェクトを選択して、このプロジェクトをワークスペースにインポートします。このプロジェクトは、以下のような構造になっています。 プロジェクトのレイアウトを示す画像
    プロジェクトのレイアウトを示す画像
  2. datacap_conversion という名前の AQL モジュールに含まれる 1 つの AQL ソース・ファイルに変更を加え、ステップ 4 で作成する Datacap Taskmaster Web サービスのアドレスを指すようにする必要があります。この AQL モジュールのソースは、/textAnalytics/src/datacap_conversion/main.aql にあります。 AQL モジュールの場所を示す画像
    AQL モジュールの場所を示す画像

    以下に、main.aql のコードを記載します。

    1. 必要な変更は、[YOUR_DATACAP_SERVER_NAME] を Datacap サーバー (ステップ 4 で作成します) の名前で置き換えることのみです。
    2. main.aql ファイルを保存してから閉じます。
    3. プロジェクトを再ビルドします。これにより、コンパイル後の AQL にソースへの変更が反映されます。それには、メニューから「Project (プロジェクト)」、「Build All (すべてをビルド)」の順に選択します。
    サンプル AQL のコードを示す画像
    サンプル AQL のコードを示す画像
  3. 次は、AQL モジュールを呼び出す TextAnalyticsJavaAPI という名前の新規 Java クラスを作成します。このクラスによって AQL モジュールを呼び出すと、これらのモジュールが Datacap Taskmaster Web サービス API を呼び出し、PDF ファイルを処理して XML にした後、その結果を修正するためのコードを呼び出します。TextAnalyticsJavaAPI に含まれる関数は、以下のように別のアプリケーションによって呼び出され、引数の値にはストリングとして XML または HTML が指定されます。
    	public boolean datacapResultToFile<String format> throws Exception
  4. Java ソース・コードと textAnalytics コード・フォルダーを、作成した Web プロジェクトにコピーします。この作業が完了すると、Web プロジェクトの構造は以下のようになっているはずです。Web プロジェクトのレイアウトを示す画像
    Web プロジェクトのレイアウトを示す画像

ステップ 3. Java コードを呼び出す REST コントローラーを完成させる

Web プロジェクト内で Java プロジェクトを使用するには、ステップ 1 で作成した Web プロジェクトに BigInsights Java プロジェクトのファイルをコピーして、コントローラー・クラスが AQL モジュールを呼び出せるように変更を加える必要があります。

最終的な REST コードは以下のようになります。

@RequestMapping(value = "/pdfextraction", method = RequestMethod.POST)
public @ResponseBody
	Object extract(HttpServletRequest request, HttpServletResponse response)throws Exception {
		
		// Store the pdf in a temporary folder
		String working_folder = prepreTempFolder();

		try {

			// the pdf file full path, the pdf file will be named sample.pdf
			String pdfFileLocation = working_folder + File.separator + PDF_FILE_NAME;

			// store the file to a local working folder
			storeFile(request.getInputStream(), pdfFileLocation);

			// prepare the pdflist.txt file and write the full path of the pdf file
			// in it
			byte[] data = pdfFileLocation.getBytes();
			String inputFileLocation = working_folder + File.separator	+ PDF_LIST_FILE_NAME;
			FileOutputStream out = new FileOutputStream(inputFileLocation);
			out.write(data);
			out.close();

			// call the API to process the PDF file to xml or html
			TextAnalyticsJavaAPI textAnalytics = new TextAnalyticsJavaAPI(working_folder);

			if (textAnalytics.datacapResultToFile("XML")) {

				response.setContentType("application/xml");
				response.setHeader("Content-Disposition","attachment;filename=" + XML_FILE_NAME);

				InputStream is = new FileInputStream(working_folder	+ File.separator + XML_FILE_NAME);

				IOUtils.copy(is, response.getOutputStream());
				response.flushBuffer();
				is.close();

				return "ok";
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// clean the temp working directory
			FileUtils.deleteDirectory(new File(working_folder));
		}

		return "ok";
	}

ステップ 4. Datacap Web サービスを準備する

PDF ファイルを処理するために使用するのは、IBM Datacap に組み込まれている Nuance OCR エンジンです。この OCR エンジンを呼び出すために、ここでは Datacap Taskmaster Web サービスを使用します。Taskmaster Web サービスは Datacap 製品の一部となっており、Microsoft IIS (Internet Information Services) Web サーバーに Web アプリケーションとしてインストールされます。セットアップと構成には、デフォルト値を使用することを前提とします。つまり、Taskmaster Web Services はポート 8011 で使用可能になるため、ステップ 2 で変更を加えた AQL に設定されている URL でアクセスすることができます。

このサンプルで実装した REST Web サービス呼び出しは、Taskmaster Web サービスによって使用可能にされた関数を呼び出して PDF の変換を行います。具体的には、以下の関数を使用します。各関数については、Taskmaster Web サービスの資料で説明されています。

wTM CreateBatch
wTM UploadFile
wTM GetBatchAttributes
wTM ReleaseBatch
wTM GetFile

このチュートリアルで提供している Datacap サーバー・イメージは、1 つしかありません。このイメージは、このリンク先からダウンロードすることができます。このイメージに対して必要な作業は、イメージを起動して、ステップ 2 で説明したようにサーバー名を変更することだけです。

ステップ 5. アプリケーションを実行する

アプリケーションをテストするために、Eclipse で Web アプリケーションを起動します。

Web サーバーが起動した後は、REST クライアントとして機能する Firefox アドオンの Poster を使用します。Poster は Web アプリケーションに PDF ファイルを送信し、受信したレスポンスを表示します。

  1. 「URL」フィールドに、テスト対象の URL を入力します。この URL のフォーマットは、http://<servername>:<port>/appContext/mapping のようになっている必要があります。この例では、「http://localhost:8080/PDFOCRapp/pdfextraction」と入力します。
  2. 「Browse (参照)」をクリックして、送信する PDF ファイルを選択します。PDF ファイルを選択すると、「Content Type (コンテンツ・タイプ)」フィールドの値が自動的に「application/pdf」に変更されます。
  3. 「POST」をクリックしてリクエストを送信します。
テストに使用する Poster の画像
テストに使用する Poster の画像


数分のうちに、以下のようなレスポンスを受信するはずです。

Poster のレスポンスを示す画像
Poster のレスポンスを示す画像

ステップ 6. Web アプリケーションをエクスポートして Bluemix にプッシュする

注: WAR ファイルをエクスポートする前に、必ずステップ 2 で説明したように YOUR_DATACAP_SERVER_NAME を変更してください。

  1. Eclipse プロジェクトを右クリックし、「Export (エクスポート)」 > 「Web」 > 「War file (WAR ファイル)」の順に選択し、「Next (次へ)」をクリックします。WAR ファイルの名前を指定し、エクスポート先を選択して、エクスポートを完了します。
  2. エクスポートされた WAR ファイルをアプリケーションとして Bluemix にプッシュするために、Bluemix にログインして、push コマンドを実行します。以下は、push コマンドの一例です。
    cf push pdfocr -p app_war.war
  3. アプリケーションが起動した後は、Poster を使用して、Bluemix にデプロイしたアプリケーションをテストすることができます。「URL」フィールドにアプリケーション名を指定する必要はありません。アプリケーションの URL の後に続けて、コントローラーで使用するリクエスト・マッピング (例えば、/pdfextraction) を指定するだけで構いません。 Poster によるテストを示す画像
    Poster によるテストを示す画像

まとめ

このチュートリアルでは、エンド・ユーザーに PDF の表抽出サービスを提供できる REST アプリケーションの作成方法を紹介しました。このアプリケーションは表の構造を維持してテキストを抽出し、このプロセスで発生したエラーを自動的に修正します。また、REST アプリケーションを作成するために、IBM Datacap に提供されている OCR エンジンと併せて Spring Framework 3.1.2 を使用しています。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development, Cloud computing
ArticleID=1004049
ArticleTitle=OCR とアナリティクス・テクノロジーを使用して PDF ファイルから表の情報を抽出する
publish-date=04302015