Amazon TextractでPDFのテキストを抽出してみる

日本語対応に期待ですね。
2021.12.10

Amazon Textractはドキュメントからテキストやデータを簡単に自動抽出してくれる機械学習のサービスです。

設定やテンプレートが不要, 単純なOCRだけではなく手書き文字の認識、領収書、表やフォームなどの構造化データを抽出する, Amazon Augmented AI を使用して人間によるレビューを追加してモデルを監視し、機密データのレビューを実行 するといった特徴があります。

数時間、数日かかる手作業とは対照的に、Textractは数分でデータを抽出します。

前回までにpythonのライブラリを用いてpdfのテキストを抽出することを試していましたが、確かにただOCRをしただけでは厳しいなと感じました。

なので今回はこのような機械学習を組み込んでいるサービスを使ってpdfからテキスト抽出をしてみたいと思います。

Amazon Textractで検出と抽出できるテキストのタイプ

  • 標準的な英語のアルファベットと ASCII記号を使用している、印刷されたテキストもしくは手書きの文字
  • スペイン語、イタリア語、フランス語、ポルトガル語、ドイツ語で印刷されたテキスト

残念ながらまだ日本語には対応されていません。

PDFを分析してみる

分析ようのファイルは、以下のファイルを利用します。

https://d1.awsstatic.com/Marketplace/solutions-center/downloads/awsmp-datasheet-Gremlin.pdf

※ pdfファイルは11ページ未満でないといけないので、これ以上のページ数だと分割して分析しましょう。

なお、本記事ではAmazon Augmented AIを使ったレビューは取り扱いしません。・

マネージメントコンソールから

AWSのマネージメントコンソールにログインし、Amazon TextractのページにあるAmazon Textract を試すという箇所をクリックします。

このようにサンプルのドキュメントを分析した結果が表示されています。 フォーム、領収書、請求書のサンプルがみれますので、是非確認してみることをお勧めします。

この画面のChoose Fileから自分の持っているPDFをアップロードしてみましょう。

アップロードしたファイルの保存先としてS3バケットの作成を求められるので、ここで作ってしまいます。

ファイルをアップロードすると、このように分析が開始されました。

分析が終わると、もとのpdfと抽出したテキストが表示されます。どのテキストがpdfのどの場所のものかもわかるようになっていてわかりやすいですね、

テキスト抽出の精度もかなり良いと感じました。 単純なフォーマットのpdf以外でも読み出しをしてくれますね。

一方、上記のような図の中のテキストは全て抽出できませんでした。

APIから

AWS cliを使って、非同期操作によるpdfの分析を行ってみます。

PDF形式の分析は非同期操作のみでしかできないので注意が必要です。

参考:

PDFのテキストの検出は、StartDocumentAnalysis というAPIを実行して非同期処理を開始します。

例)

aws textract start-document-text-detection \
 --document-location '{"S3Object":{"Bucket":"bucket","Name":"document"}}' \
 --region <<region-name>>

document-locationオプションにs3バケットと、分析したいドキュメントのキー名を設定して実行します。

成功すると

{
    "JobId": "e6c382979e7ac7dcf383946bf5a8716c74f78be697c98a31a444732ad195ab6b"
}

のようにJobIdが返却されます。

このJobIdを使って GetDocumentAnalysisで結果を取得します。

例)

aws textract get-document-text-detection --region <<region-name>> --job-id <<job-id-number>>

結果は上記のように返ってきます。

検出されたページの総数は、DocumentMetadataで返されます。 検出されたテキストはBlocks配列で返されます。ブロックオブジェクトについては、テキスト検出とドキュメント解析のレスポンスオブジェクトを参照してください

{
      "BlockType": "LINE",
      "Confidence": 98.92459106445312,
      "Text": "Gremlin Chaos Engineering",
      "Geometry": {
........
........
},
{
      "BlockType": "WORD",
      "Confidence": 98.07364654541016,
      "Text": "Gremlin",
      "Geometry": {
.......
.......
},
.......
.......

検出されたテキストは、BlockオブジェクトのTextフィールドに返されます

BlockTypeフィールドは、テキストが行(LINE)なのか単語(WORD)なのかを決定します。

WORDは、スペースで区切られていない1つ以上のISO基本ラテン文字です。

LINEは、タブで区切られた連続した単語の文字列です。

参考ドキュメント:

行とテキストの単語

おまけ(日本語を含むpdf)

日本語対応はしていないですが、どうなるか気になるので試してみます。

使用するpdfは  「みどり」について(日本語版) にします。

結果

なるほど。

テキストとして検出できているけど分析ができない箇所、検出すらできない箇所もある といった挙動に見えますね。

Textractはテキストだけでなくフォームやテーブルのデータも分析して表示してくれるので、 やろうとしているpdfからepubを作る時にかなり役に立ちそうなきがします。

日本語対応に期待ですね。日本語対応に期待ですね。