PDFの壁を打ち破る:数式・表・多段組対応のデータ抽出ツール MinerUの威力


PDFの壁を打ち破る:数式・表・多段組対応のデータ抽出ツール MinerUの威力

opendatalab/MinerU

2025-10-14

ホテルのコンシェルジュのように、このツールをどのように活用できるか、導入方法、そしてサンプルコードまで、分かりやすく丁寧にご案内しますね。

MinerUは、一言でいうと「複雑なPDFなどの非構造化データを、大規模言語モデル(LLM)がすぐに使える、構造化されたデータ(MarkdownやJSON)に魔法のように変換してくれる」Pythonライブラリです。

PDFは、論文、契約書、技術仕様書、報告書など、重要な情報源でありながら、データとして扱うには非常に手間がかかります。従来のPDFパースは、レイアウトが崩れたり、表や数式が文字化けしたりと、苦労が絶えませんでした。

MinerUは、この「PDFからのデータ抽出と前処理の苦痛」を解消してくれます。

課題(Before MinerU)メリット(After MinerU)
データ前処理の地獄: PDFから手作業でコピペ、または複雑な正規表現やカスタムスクリプトで抽出。LLM-Readyなデータ: 高精度で構造を保ったMarkdownやJSONを自動生成。前処理時間が激減。
レイアウトの複雑さ: 多段組、ヘッダー/フッター、脚注が混在し、テキストがバラバラになる。正確な読み順の確保: 人間が読む自然な順序でテキストを再構成。エージェント(Agentic Workflow)の入力として最適。
非構造化データの壁: 表や数式をデータ化するのが困難。OCRが必要な場合もある。リッチなデータ抽出: 表をHTMLに、数式を$\LaTeX$に変換してくれます。スキャンPDFのOCRも自動で対応。
エージェント開発のボトルネック: 信頼性の低いPDF抽出結果が、エージェントの意思決定を歪ませる。信頼性の高い入力: クリーンで構造化されたデータにより、エージェントの処理精度と信頼性が向上。

MinerUはPythonで提供されています。セットアップは非常にシンプルです。

Python 3.8以上が必要です。仮想環境(venvcondaなど)での作業を強くお勧めします。

pipを使って簡単にインストールできます。

# ターミナルで実行
pip install mineru

OCR機能など、特定の機能を利用する場合は、追加の依存関係をインストールすることが推奨されています。

# 拡張機能を使いたい場合はこちら
# 詳細な要件は公式のGitHubリポジトリをご確認ください。
# 例: pip install mineru[ocr, all] など

ここでは、PDFファイルを読み込み、Markdown形式とJSON形式に変換する基本的なコードをご紹介します。

import os
from mineru.pdf import PDFMiner
from mineru.schemas import OutputFormat

# 1. MinerUクライアントの初期化
# 多くの設定がありますが、基本はこのままでOK
miner = PDFMiner(
    # デフォルトではMarkdown形式で構造を保持
    output_format=OutputFormat.MARKDOWN_MULTI_MODAL
)

# 2. 解析したいPDFファイルのパスを指定
pdf_path = "specification.pdf"

# ※ 注意: このサンプルを実行するには、作業ディレクトリに 'specification.pdf' を配置してください。
if not os.path.exists(pdf_path):
    print(f"エラー: ファイル '{pdf_path}' が見つかりません。テスト用のPDFを配置してください。")
else:
    print(f"'{pdf_path}' の解析を開始します...")

    # 3. PDFの解析を実行
    # parse_pdfメソッドは、指定したフォーマット(ここではMarkdown)の文字列を返します。
    # 結果は MinerUResult オブジェクトとして返されます。
    result = miner.parse_pdf(pdf_path)

    # --- 結果の確認と保存 ---

    # 4. Markdown形式の出力を取得し、ファイルに保存
    markdown_content = result.get_content(OutputFormat.MARKDOWN_MULTI_MODAL)
    output_md_path = "output_spec.md"

    with open(output_md_path, "w", encoding="utf-8") as f:
        f.write(markdown_content)

    print("-" * 30)
    print(f"Markdown形式での抽出が完了しました。ファイル: {output_md_path}")
    print("\n--- 抽出されたMarkdownのプレビュー (最初の一部) ---")
    print(markdown_content[:500] + "...") # 最初の500文字を表示

    # 5. JSON形式の出力を取得(より構造化されたデータ向け)
    # JSON形式は、段落、表、数式などがオブジェクトとして格納され、プログラムで扱いやすいです。
    json_content = result.get_content(OutputFormat.JSON_READ_ORDER)
    output_json_path = "output_spec.json"

    with open(output_json_path, "w", encoding="utf-8") as f:
        f.write(json_content)
    
    print("-" * 30)
    print(f"JSON形式での抽出が完了しました。ファイル: {output_json_path}")
    print("\n--- 抽出されたJSONデータのプレビュー (最初の一部) ---")
    import json
    json_data = json.loads(json_content)
    # JSONデータの中身の構造を確認
    print(f"ルート要素のキー: {list(json_data.keys())}")
    if 'pages' in json_data and json_data['pages']:
        print(f"最初のページの要素数: {len(json_data['pages'][0]['elements'])}")
    print("...")

Markdownデータ(output_spec.md
LLMのコンテキストウィンドウにそのまま入力し、要約、質問応答、特定の情報抽出を行う。 例: 「この仕様書に記載されているセキュリティ要件を3点抽出せよ」

JSONデータ(output_spec.json
データをパースし、特定のセクション(例
表データ)をデータベースに格納したり、プログラム的に処理したりする。 例: JSON内のtype: 'table'のエントリを抽出し、pandas DataFrameに変換して分析する。


opendatalab/MinerU




ACL 2025発表の「Dolphin」がエンジニアにもたらす変革

おいおい、今日のバーベキュー、最高の肉が手に入ったぜ! あ、〇〇ちゃん、今日もお肉焼くの上手だね!「いやぁ、そんなことないっすよ。この網の熱を均一にする技術、まるでドキュメントのレイアウトを完璧に読み取るAIみたいじゃないですか!」え?なんだって?


「あら、設定が丸見えよ!」Prowlerで焦げ付かないクラウド・セキュリティ管理術

「あら、大変!AWSの設定が油ギトギト(脆弱性だらけ)じゃない!」ソフトウェアエンジニアの皆さん、自分の作ったインフラが安全かどうか、不安で夜も眠れないことはありませんか?Prowlerは、あなたの代わりにクラウド環境を隅々までチェックして、焦げ付きや汚れを見つけ出してくれる、最強の自動お掃除ロボットなんです。


PythonでOpenAI APIを使いこなす:公式ライブラリ入門ガイド

ただ、ソフトウェアエンジニアの視点から、OpenAIの公式Pythonライブラリがどのように役立つか、導入方法やサンプルコードの例を、分かりやすく丁寧に解説します!OpenAIの公式Pythonライブラリ、openai-pythonは、OpenAIが提供する強力なAPIを、Pythonを使って簡単に操作するためのツールです。


【エンジニア向け】DocSendの代替!オープンソースPDF分析ツール「Papermark」徹底解説

諸君、ごきげんよう!我々はPDFを扱うエンジニアの味方、ペーパーマークだ! 君たちの中に、PDFドキュメントを共有する時、こんなことで悩んでるやつはいないか?「この企画書、送ったはいいけど、本当に読まれてるのかな…?」 「みんなどのページでつまずいてるんだ…?」 「URLを自社ドメインにしたいけど、どうすれば…?」


【ガンダムコント風】ザクとは違うのだよ!LLMアプリ開発の設計図集「awesome-llm-apps」解説

モビルスーツ開発に明け暮れる皆さん、ご苦労様です!今日はですね、なんと、ザクとは違うのだよ、ザクとは!…と言いたくなるくらい、最先端の技術が詰まった「設計図集」をご紹介します。それが、この「Shubhamsaboo/awesome-llm-apps」というプロジェクトです!


オースティン・パワーズ流!donnemartin/system-design-primerで学ぶシステム設計

さて、今日は君たちソフトウェアエンジニアの卵たちに、とっておきの情報を持ってきてやったぜ! オースティン・パワーズばりのキレッキレな解説で、システム設計の奥深さをとくとご覧あれ!皆さん、システム設計って聞いて「うっ…頭が…」ってなる人、いるんじゃないかな? 大規模なシステムって、まるで僕のモジョパワーみたいに複雑怪奇で、どこから手をつけていいか分からないって人も多いだろう。


リンクも驚く情報収集術!Maigretで広がるエンジニアの視野

ハイラルを旅する勇敢なソフトウェアエンジニアの皆さん、ごきげんよう!今日は、まるでゼルダの伝説の壮大な冒険のように、私たちエンジニアが「情報収集」という試練に立ち向かうための、素晴らしい魔法のアイテムをご紹介しましょう。その名も「soxoj/maigret」!


【体験談】roboflow/supervisionが私のCVプロジェクトを変えた話

こんにちは!今回は、コンピュータービジョンのプロジェクトに取り組むソフトウェアエンジニアの皆さんにとって、まさに「痒い所に手が届く」ツールであるroboflow/supervisionについて、その魅力と使い方をたっぷりご紹介します。まるで、これまでバラバラだったパーツをピタッとつなぎ合わせてくれる接着剤のような存在で、開発効率がぐんとアップすること間違いなしですよ!


証拠物件(EPUB)を逃がすな。calibredbで実現する、エンジニア流・電子書籍取り調べ術

エンジニアの皆さん、お疲れ様です。今日は、電子書籍界の「巨大な証拠保管庫」こと calibre について、警察のガサ入れ…ではなく、技術的な「現場検証」をしていきましょう。電子書籍の管理ソフトとして有名な calibre ですが、中身は Python で書かれた超巨大なオープンソースプロジェクト です。エンジニアにとっては、ただの「本棚」以上の価値があります。


PythonでAIを分業させる技術:microsoft/agent-frameworkで効率化

このフレームワークは、まるでドラマの名探偵チームを結成して、複雑な事件(タスク)を連携して解決していくようなイメージで捉えると分かりやすいですよ!‍♂このフレームワークは、AIエージェントを構築、連携、デプロイするための強力なツールキットです。Pythonと