PDFからテキストを抽出することが難しい理由とは?
PDFは、さまざまなデバイスやプラットフォームでコンテンツの正確なレイアウトを維持するように設計されています。また、ドキュメントがどこで表示または印刷されても同じように見える状態で保存されています。PDFは統一されたコンテンツをドキュメント化して共有する手段としては最も適しています。
しかし、PDFが持つこの形式がRAGのテキスト抽出をする際に障壁となることがあるので、なぜ、PDFのテキスト抽出が難しいのか構造も含めて解説します。
PDFファイル内のテキストは、テキストフレームまたはレコードとして整理されています。テキストフレームやレコード間はテキストの内容や意味に基づきて紐づいているものではないため、単純にテキストを抽出すると意味をなさない訳のわからない文章になります。
テキスト抽出しようと思うと厄介なPDFの固定レイアウト
PDFの固定レイアウトは、異なるプラットフォームやデバイス間でドキュメントが同一に表示されるために必要で、レイアウトの機能は、フォーマットが重要な法的文書、請求書、学術論文、専門的な出版物では必須機能と言ってもいいでしょう。ただ、RAGに外部情報としてPDFのテキスト抽出を行うことでいくつかハードルに直面します。
断片的に設置されたテキスト
PDFのテキストは、列、サイドバー、画像の周りに視覚的に整理されている場合があります。これはページを視覚的みる人間の読者には理解できますが、機械的にテキストを抽出するとテキストの順序が逆になったりと混在することがあります。例えば、テキスト抽出を左から右に2列形式を読み取ると、列間で交互に文章が読み取られ、テキストの文章がメチャクチャになり、意味がわからない文章になってしまいます。
視覚的にわかる位置に設置されたテキスト
PDFのテキストは、文章同士の関係性(例えば、これがタイトルで、これが本文である、といった情報)ではなく、ページ上の正確な位置(座標)情報に基づいて配置されています。人間にとっては見やすいレイアウトを作るのに便利ですが、コンピュータにとっては扱いにくい情報です。例えば、人間は「大きな文字で中央に配置されたテキスト」を見出しだと認識できますが、コンピュータはそれが単に「座標(x, y)に配置された、サイズzのテキスト」としか認識しません。そのため、PDFからテキストを抽出すると、単なる文字列の羅列になってしまい、どこが見出しでどこが本文なのか、といった情報が失われてしまいます。この座標情報から元の文書の構造(見出し、段落、セクションなど)を推測するには、高度な処理が必要になります。まるで、ジグソーパズルのピースがバラバラに散らばっていて、それを位置情報だけを頼りに組み立て直すようなものです。簡単に言うと、PDFは見た目を重視したファイル形式なので、コンピュータが内容を理解するには、見た目から内容を推測する高度な技術が必要になる、ということです。
論理的に構造立てテキストで説明がなされていない形式
PDFは、見た目通りに文書を表示することに特化したファイル形式です。そのため、文書の見栄え(例えば、タイトルが大きく太字で表示されているなど)はきちんと表現されていますが、文書の論理的な構造(例えば、これがタイトルで、これが本文であるといった情報)は、多くの場合、きちんと保存されていません。例えるなら、PDFは「きれいに盛り付けられた料理の写真」のようなものです。写真を見れば、料理の見た目や材料は分かりますが、それがどんな料理で、どんな順番で食べるべきなのかといった情報は写真からは読み取れません。同様に、PDFファイルを見れば、文書の見た目は分かりますが、どこがタイトルでどこが本文なのか、といった論理的な構造は、見た目から推測するしかありません。PDFには、論理構造を保存するための仕組み(タグ付きPDFなど)も存在しますが、実際にはあまり使われていません。そのため、PDFから情報を読み取る際には、見た目から内容を推測する必要があるのです。このように、PDFは見た目重視のファイル形式であるがゆえに、コンピュータが内容を理解するには、見た目から内容を推測する高度な技術が必要になる、ということです。
視覚的マークアップで意味的マークアップではないPDF
ウェブサイトを作る際に使うHTMLという言語では、「<h1>」や「<p>」といったタグを使って、文章の見出しや段落を指定します。これらのタグは、単に見栄えを変えるだけでなく、「これは見出し」「これは段落」といった意味も持っています。これを意味的マークアップと言います。
一方、PDFは基本的に見た目を重視したファイル形式なので、このような意味的なタグはほとんど使われていません。例えば、PDFでは、タイトルが大きな文字で太字で表示されていても、コンピュータにとっては単に「大きな太字の文字列」でしかありません。「これはタイトルである」という情報は含まれていません。これを視覚的マークアップと言います。
例えるなら、HTMLは「食材にラベルを貼って整理整頓された冷蔵庫」のようなものです。ラベルを見れば、何がどこにあるのか、すぐに分かります。一方、PDFは「食材がいろいろ入っているけれど、ラベルが貼られていない冷蔵庫」のようなものです。食材は見えるけれど、それが何なのか、すぐに判断するのは難しいでしょう。
このように、HTMLでは意味的なタグを使って文書の構造を明示的に表現しているのに対し、PDFでは視覚的な表現のみで構造を暗示しているため、コンピュータが文書の内容を理解するのが難しいのです。
特に、テキスト抽出ツールは、意味的なタグがないと、PDFの内容を単なる文字列の羅列として認識してしまいます。そのため、タイトル、本文、キャプションなどを自動的に区別することが難しくなります。
標準構造タグを埋め込んでいないケース
PDFには、文書の構造をきちんと保存するための機能(PDF/Aやタグ付きPDF)が用意されています。
例えば、タグ付きPDFは、文書の中に「これは見出し」「これは段落」といった情報を埋め込むことができます。これらの機能を使えば、コンピュータはPDFの内容を正確に理解し、テキストを読み上げたり、画面サイズに合わせてレイアウトを調整したりすることが容易になります。
しかし、現実には、これらの機能が使われているPDFはほとんどありません。多くのPDFは、見た目だけを重視して作られており、文書の構造に関する情報は含まれていません。
そのため、コンピュータは、文字の大きさや配置、行間などの見た目から、文書の構造を推測するしかありません。このような推測は、必ずしも正確ではありません。そのため、PDFから情報を読み取る際には、誤りが発生する可能性があることを理解しておく必要があります。
PDFからテキストを抽出するには?
PDFのテキスト抽出がややこしいことを理解したところで、PDFファイルからテキストを取り出すには、いくつかの方法があります。それぞれの特徴を理解して、最適な方法を選びましょう。
1. テキストベースの抽出 (一番シンプル)
PDFがテキストデータで作成されている場合、直接テキストを取り出すことができます。
2. 光学文字認識 (OCR) (画像を読み取る)
スキャンされた画像や手書き文字が含まれるPDFの場合、OCRを使って文字を読み取ります。
3. ハイブリッドアプローチ (応用編)
テキストベースの抽出とOCRを組み合わせた方法です。PDFの内容に合わせて、最適な方法を自動的に選択します。
- メリット: どんなPDFにも対応できる柔軟性!
- デメリット: 複雑な仕組みで、処理時間がかかることも。
- 使えるツール例: pdfplumber + Tesseract OCR
ベクトル化する時のチャンクも考慮してツールを選定
PDFの内容をベクトル化する際には、チャンク(分割単位)を考慮してツールを選定することが重要です。以下のようなチャンク単位での抽出が考えられます:
- ページ単位: 各ページごとにテキストを抽出し、ベクトル化します。ページ単位での抽出は、ページごとの内容が独立している場合に有効です。
- 段落単位: 各段落ごとにテキストを抽出し、ベクトル化します。段落単位での抽出は、文脈を保ちながら詳細な解析を行いたい場合に有効です。
- セクション単位: 各セクション(例えば、章や節)ごとにテキストを抽出し、ベクトル化します。セクション単位での抽出は、文書の構造を保ちながら解析を行いたい場合に有効です。
具体的なツール選定の例
- pdfplumber: ページ単位や段落単位でのテキスト抽出が可能で、テキストベースのPDFに最適です。
- Tesseract OCR: 画像ベースのPDFに対して、ページ単位や画像単位でのテキスト抽出が可能です。
- Azure Document Intelligence: クラウドベースで高精度なOCRを提供し、ページ単位やセクション単位での抽出が可能です。