フラクトゥール(亀の子文字)のOCR:現代語化の前に原文を忠実に保持する
古書の検索や翻訳を行う前に、再現可能な小規模なフラクトゥールOCRテストを行い、認識エラーと長いsの正規化を正しく見分けましょう。

印刷されたフラクトゥール(ドイツ文字・亀の子文字)をOCR処理する際は、この書体に対応したモデルを選び、ページの短い一節でテストして、文字起こしで長いs( ſ)をそのまま残すか、 sに正規化するかを決めます。確認済みの原文テキストは、現代語化や翻訳データとは必ず分けて管理してください。見慣れた単語になっているからといって、印刷に忠実な読み取り結果であるとは限りません。
私たちは、フラクトゥールフォントで作成した短いドイツ語のテスト文章2点と、対照群として現代フォントの文章を用意して検証しました。これらのような鮮明な画像であっても、フラクトゥールモデルはある文章では iſt を ift に、別の文章では if に誤認識しました。この検証から得られた有益な成果は、ツールの優劣ランキングではなく、 「文字を認識すること」「文字起こしの規約を決めること」「言語を現代化すること」はそれぞれまったく別の作業である.
という事実の実証でした。なお、本ガイドは印刷されたページを対象としています。手書きのカレント体(Kurrent)やズッターリーン体(Sütterlin)、損傷した写本、あるいは歴史的コレクション全体の処理ワークフローを定めるものではありません。
OCRを実行する前に「何が正解か」を決める
ツールを比較する前に、1文程度の文字起こし方針を定めておきましょう。例えば、「原文の綴りと長いsを保持し、確認できない単語には印をつける」といった具合です。そうしないと、意図的な正規化をエラーと誤認してしまったり、流暢に見えるからといって意図しない書き換えを受け入れてしまったりする恐れがあります。
この違いを具体的に示しているのがOCR-Dです。OCR-Dの レベル1 ガイドラインでは、長いsと丸いsをともに s; レベル2および3 ではこれらを区別します。これらはあくまで文字起こしの規約であり、すべての古い綴りを現代の表記に変えてしまうための指示ではありません。公式の レベル1の「s」に関する規則 および レベル2/3の「s」に関する規則.
個人の読書プロジェクトでは、以下の出力を分けて管理してください。
| 出力形式 | 作成した教材テキストからの例 | 用途 |
|---|---|---|
| 原文準拠のテキスト | Die rothe Blume ſteht hier. | 認識された文字を画像と照合して確認する |
| 長いsを正規化した派生テキスト | Die rothe Blume steht hier. | 長いsの区別なしでの検索や閲覧 |
| 現代語化された派生テキスト | Die rote Blume steht hier. | 綴りを現代化した独立した編集版 |
2行目は ſ を sに変更しているだけで、OCR-Dレベル1のすべての規則を適用しているわけではありません。3行目は原文の綴り自体も変更しています。どちらの派生版も、原文準拠のテキストを予告なく置き換えるようなことがあってはなりません。
特に、文字の f を一括して sに置換してはいけません。OCRの誤認識結果には iftが含まれていましたが、原本にも本物の f が存在する可能性があります。一律の置換ルールに頼るのではなく、画像と照合して単語を修正してください。
8回の検証実験で何が起きたか
2026年9月11日、教材用の3行のオリジナル文2篇を UnifrakturMaguntia および Noto Sansでレンダリングしました。それぞれの画像を、固定された2つのTesseractモデル( tessdata_best のフラクトゥール書体モデルと英語モデル)で認識させました。英語モデルの設定は比較対象用であり、現代ドイツ語のベースライン ではありません 。
8回の呼び出しはすべてTesseract 5.5.3、LSTMモード(--oem 1)、単一テキストブロック(--psm 6)、解像度300 dpiを使用しました。元の実験内では設定の変更、結果の除外、認識の再試行は一切行っていません。9月12日に同じ8つの画像でパッケージ再現テストを実施した際も、保存されていた出力バイトが完全に再現されました。
画像は単純な文字ボックスの描画ではなく、Apple CoreTextを使用して合字(リガチャ)を有効化した本格的なテキスト整形で生成されています。2200 × 460の白いキャンバス上に64ピクセルのテキストを配置しました。画像、グリフ数チェック、フォントライセンス、モデルハッシュ、および未加工の出力結果は、 実験パッケージの手順.

専用モデルでも修正が必要だった点
最初の原文の行は次の通りでした:
Das Waſſer iſt klar.
フラクトゥールフォントの画像に対して、フラクトゥール専用モデルは次のように出力しました:
Das Waſſer ift klar.
行の大半は正確に認識されましたが、 ſ 内の iſt が fになりました。第2の一節では、 Das Thal iſt weit. が Das Thal if weit.と認識されました。1文字が誤変換され、もう1文字が欠落したことになります。出力されたドイツ語がそれらしく読めるからといって、原文との突き合わせ確認を省略してよい理由にはなりません。
現代フォントの対照実験では、別のエラーが発生しました。フラクトゥールモデルは第1の一節の単語自体は保持したものの、 Buch 12; Seite 27; Nummer 105. に含まれる2つのセミコロンをコロンに変換してしまいました。長いsのチェックだけを行っていた場合、こうした句読点の変化は見逃されていたでしょう。
正解データの基準によってスコアは変わる
認識前に確定した2つの正解データ(完全に一致する原文テキスト、および のみ ſ → sを現代形に置換した原文)と、未加工の全出力を照合してスコアを算出しました。どちらの比較でもUnicodeをNFCに正規化し、空白文字を縮約していますが、大文字・小文字や句読点は保持しています。スコアリング前に未加工出力を畳み込み(正規化)することはありません。
以下の数値は文字編集距離(挿入、削除、置換の数)であり、正解率のパーセンテージではありません。
| 一節 | レンダリングフォント | OCRモデル | 完全な原文に対する編集量 | 長いsのみを正規化した対象に対する編集量 |
|---|---|---|---|---|
| 長いsと数字 | フラクトゥール | フラクトゥール | 1 | 6 |
| 長いsと数字 | フラクトゥール | 英語 | 8 | 8 |
| 長いsと数字 | Noto Sans | フラクトゥール | 2 | 8 |
| 長いsと数字 | Noto Sans | 英語 | 7 | 7 |
| 歴史的綴り | フラクトゥール | フラクトゥール | 2 | 4 |
| 歴史的綴り | フラクトゥール | 英語 | 7 | 7 |
| 歴史的綴り | Noto Sans | フラクトゥール | 0 | 3 |
| 歴史的な表記法 | Noto Sans | 英語 | 4 | 4 |
ある行の「0」は、その短い入力に対して完全一致したことを意味するに過ぎず、実際の書籍の次のページについては何も示していません。逆に、 ſ を正しく保持したモデルは、 sを必須とする正解データと比較した場合に追加の差異として判定されます。こうした差異は表記方針の不一致を示しているだけで、必ずしも誤認識とは限りません。
確認する: すべての元の出力結果とスコア、 固定された原文テキストとスコア判定方針、または 検証用スクリプト。このパッケージにはSHA-256ハッシュが記録されているため、モデル、画像、出力を各結果と照合できます。
この実験からは判断できないこと
これらは大きめのフォントで生成された鮮明な2つの合成文章であり、古い版の実物スキャンではありません。インクのかすれ、細かい活字、ノド(余白)、段組み、紙の傷み、手書き文字、あるいは独立した人間による書き起こしなどは検証していません。また、現代ドイツ語モデルや商用OCRツール、BookTranslatorのOCRおよび翻訳出力についても検証していません。
これらの例はご自身の手元の資料を確認するためのヒントとして捉え、書籍全体のエラー率の推定値とは見なさないでください。この表だけをもとに歴史的資料コレクション用のOCRサービスを選ぶことは推奨しません。
実際に必要なページを対象に限定的なテストを実施する
ローカルでTesseractを使用する場合は、出力を比較する前にエンジンのバージョンと正確なモデルファイルを記録してください。モデル名だけでは、ダウンロードしたファイルを特定できません。こちらの 出所記録 には、固定された公開モデルとフォントソースへのリンクが掲載されています(容量の大きいモデルファイル自体はこの記事に同梱されていません)。
弊社の シングルブロックのサンプル画像において、フラクトゥール用スクリプトモデルをローカルに models/Fraktur.traineddataとして保存した場合のコマンドは以下のとおりです。
tesseract samples/long-s-fraktur.png stdout --tessdata-dir ./models -l Fraktur --oem 1 --psm 6 --dpi 300
Tesseractの コマンドラインドキュメント では、LSTMモードやPSM 6における単一の均一なテキストブロックという前提について説明されています。今回の3行の画像はその前提に合致しますが、これは段組みのある書籍の全ページをPSM 6で処理することを推奨するものではありません。
実際の本を処理する際は、まず確実に書き起こせる箇所と、対象資料を代表する難易度の高いページを1ページ選んでテストしてください。人名や見慣れない用語、数字、書体の変化が含まれる箇所を選びましょう。書体や言語が混在している本の場合は、フラクトゥールの段落が1つうまく読めたからといって文書全体に適用できると思い込まず、個別の 多言語混在PDFのOCRガイド を参考にしてください。
スキャン画像は変更せずそのまま保持してください。生のOCR結果は修正後のテキストとは別に保存し、確認した箇所ごとにページ番号や画像識別子を記録しておきます。出力結果が判読不能な場合は、何百ページもの処理を一括で実行する前に、ページ画像自体の品質やセグメンテーションを見直してください。
欠落した単語を勝手に補完せずに書き起こしを修正する
「元の位置」「生のOCR結果」「確認済みの読み」「理由」の4列からなるシンプルな修正ログを使用してください。「理由」には、文字自体の明確な誤認なのか、編集方針に基づく書き換えなのかを区別して記録します。
| 確認結果 | 適切な対応 | 避けるべき対応 |
|---|---|---|
画像には明確に「 iſt」とあるが、OCR結果は「 ift | 画像と照合して該当箇所のみを修正する | 文書内のすべての「 f 」を一括置換する |
OCRは「 rothe」のまま保持しているが、読みやすさのために「 rote 」にしたい | 原文の表記を保持した上で、現代語表記であることがわかる派生テキストを作成する | 現代語への書き換えをOCRの誤認識修正として扱う |
| 数字や句読点が異なっている | 前後の文脈が自然であっても、その箇所を必ず確認する | 見慣れない字形のみを確認すること |
| 画像自体が完全に判読不能である | 作業用の翻刻テキストに不確定箇所としてマークし、参照用の画像情報を残す | もっともらしい生成単語を、復元された証拠としてそのまま採用すること |
ダウンロードしたPDFでテキストをすでに選択できる場合は、最初からやり直す前に、貼り付けたテキストと画像を突き合わせて確認してください。 PDFのコピー&ペースト問題の診断 では、見た目のページが正しく表示されていても、非表示テキストや文字マッピングが誤っている理由を解説しています。これは、フラクトゥール認識モデルの選定とは別の問題です。
検索、引用の確認、あるいはドイツ語の読解そのものが目的であるなら、信頼できる原本テキストを作成した時点で作業を終えてかまいません。翻訳は必須のクリーンアップ手順ではないのです。
言語そのものが依然として障壁である場合にのみ翻訳を行う
他の言語を必要とする読者にとっては、校正済みの原文が整って初めて翻訳が役立つ段階となります。スキャン画像、校正済み翻刻テキスト、そして翻訳文を明確に区別して保持しておけば、疑わしい記述の原因が文字認識にあるのか翻訳にあるのかを判断できます。 スキャンPDFの翻訳ワークフロー では、より包括的な作業の流れを解説しています。
もし BookTranslatorのPDF翻訳機能を利用する場合は、全体の結果に依存する前に、ご自身の文書の代表的な部分で品質を検証してください。私たちの実験は、BookTranslatorによる歴史的なフラクトゥールの処理性能を検証したものでは ありません 。そのOCRモードはクリーンな文書を再構築するため、元のページレイアウト、フォント、フォントサイズが変更される場合があります。出力結果をファクシミリ(完全な複製)として扱ったり、元のページ番号や参照関係がそのまま維持されると思い込んだりしないでください。
実践的な手順は明快です。まず原本の読みを確定し、正規化を行った場合はその旨を明記し、必要に応じて翻訳に進みます。自然で流暢な表現はプロセスの最終段階で目指すべきものであり、最初の根拠となるテキストの代わりにすべきではありません。





