
私が PDF Craft を開発したのは、スキャンされた書籍の PDF を、読みやすく検索・整理もしやすい Markdown や EPUB に変えるためです。しかし画像から文字を認識するだけでは足りません。本文中の数字、丸付き記号、星印が、元のページ下部にある正しい注へつながる必要があります。文字が画面に合わせて流れても、この関係が消えれば読書体験は損なわれます。
古書、学術資料、個人の蔵書を整理するときほど、この問題は重要です。変換後は小さな画面でも検索、コピー、読書ができ、本文の参照から注の全文を追えるべきです。出力を確認する際は、スキャン PDF から EPUB へのガイドと数式・脚注の確認項目も参考にしてください。
OCR は文字を読めても、役割までは分からない
OCR はページに何が書かれているかを認識しますが、その文字が本の中で何をしているかまでは必ずしも分かりません。ページ下部の小さな文字は脚注かもしれず、本文の続きかもしれません。丸付き数字は参照記号にも通常の連番にもなります。一つの注が二つの領域に分かれたり、次のページまで続いたりすることもあります。
関係を一つ間違えるだけで、参照先のない記号、結合された二つの注、文中に紛れ込んだページ番号、次ページの柱につながる前ページ末尾の文など、奇妙な EPUB ができます。脚注は PDF Craft にとって長年の難題でした。
最初の試み:LLM に全ページを読ませる
約一年前、従来のプログラムが意味を理解しにくいなら、各ページを大規模言語モデルに渡そうと考えました。モデルは小さな文字が本文を説明していることや、星印・ローマ数字が参照記号であることを理解し、前後の文脈から文がページをまたぐかも判断できます。
一ページずつ見ると魅力的ですが、長い本では数百ページが数百回の呼び出しと待ち時間になります。失敗時には再試行も必要です。ページをまたぐ関係には隣接する文章が要るので、入力も長くなります。しかも大半のページはもともと正しい。高価なモデルが読み終えて「変更不要」と答えるだけの時間が増え、利用者には処理が進んでいるのか止まっているのかも分かりにくくなりました。
まず規則で完結する処理を作る
その後の版では、主な仕事を OCR と決定的な規則に戻しました。本文と脚注を分け、自然な段落をつなぎ、注を個別に分割し、本文の記号と対応づけます。速く、安定していて再実行でき、ほとんどのページをうまく処理します。
ただし本のレイアウトは多様です。注がページ下部や段組みの間にあり、記号が数字や星印になり、柱やページ番号が本文に混ざることもあります。文意の理解が必要な例外は残ります。規則だけでは取りこぼしがあり、全ページを LLM に任せるのは遅くて高価です。
転機:JEV に作り直しではなく点検を頼む
既存の処理を捨てる必要はありません。必要なのは、疑わしいページだけを選ぶ速い品質検査です。JEV には一つだけ質問します。このページの解析結果を変更せずに通してよいか? 文字の書き換えや注ごとの説明は求めず、後続の LLM に送るかどうかを決める確率を受け取ります。
判定の単位は注一件ではなくページ全体です。アルゴリズムが注を完全に見落とした場合、既知の注だけを調べても発見できません。ページ単位なら、参照の欠落、所属の誤り、ページ間の不自然な接続、本文に混ざったページ番号を疑える余地があります。誤検知でモデルの確認が一回増える方が、見逃した誤りを EPUB に残すよりましです。このしきい値は今後さらに調整する必要があります。
flowchart TB
accTitle: ページ点検から制約付きの修正へ
accDescr: OCR と規則が先にページを処理し、JEV がそのまま通せるか判断する。疑わしいページは LLM が修正し、プログラムが整合性を確認する。不合格なら再試行する。
A[OCR と規則] --> B{JEV: ページは信頼できる?}
B -- はい --> F[章の組み立てと出力]
B -- いいえ --> C[LLM が現在ページのみ修正]
C --> D{整合性検査}
D -- 合格 --> F
D -- 再試行 --> C
LLM の修正範囲を厳しく限定する
疑わしいページについて、LLM は前・現在・次の三ページの文字構造を見ます。ただし変更できるのは中央のページだけです。前後のページは、文が境界を越えて続くか判断するための文脈です。この段階でページ画像は渡しません。OCR に文字、位置、レイアウトが残っており、ここで必要なのは再 OCR ではなく意味に基づく修正だからです。
モデルは本文、脚注、ページ番号のラベルを直し、段落のつながりや参照先を修正できます。一方、原文を自由に書き換えたり、ページ構造を変えたりはできません。その後、プログラムが注の索引順、参照と注の対応、ページ境界の両側の整合、指定された本文中で記号位置を一意に特定できるかを確認します。不合格なら具体的な誤りを返し、完全な結果を再提出させます。再試行を減らすために検査を緩めることはしません。
26 ページのサンプルで見えたこと
脚注の多い 26 ページのテスト PDF では、JEV が 6 ページを LLM の対象に選びました。六つとも最初の提出で整合性検査を通り、すでに正しかった本文参照と脚注の 22 組も保持されました。
実際の修正は目立たなくても大切なものでした。印刷されたページ番号が本文になっていたこと、その一つが段落を誤って橋渡ししていたこと、導入文が後続の字下げされた引用文と結合していたことです。モデルは意味と字下げを手掛かりに分離しました。
これは一つのサンプルの観察であり、書籍全般の精度や費用を示す数値ではありません。良い修正工程は正しい部分を残し、根拠のある問題だけを直すべきだと感じました。
高価な判断を必要な場所だけに使う
規則が大半の確定的な処理を担い、JEV が疑わしいページを素早く選び、LLM が少数の意味理解を要する例外を直し、プログラムの検査が最終構造を守ります。修正したページは同じ章の組み立てと Markdown・EPUB の出力工程に戻ります。
今後はさらに多くの言語、レイアウト、長い本で、JEV の見逃し率と LLM に送るしきい値を調べる必要があります。それでも、ページの隅にある数件の誤りを探すために、LLM に本を最初から最後まで読ませる必要はなくなりました。自分の本を変換するなら、PDF Craft の変換画面で脚注のある短いサンプルを試し、本文の記号、注の全文、ページをまたぐ段落を確認してください。

