TL;DR
- 最近Doclingに触っていなかったので、特に画像中の表の抽出性能を確認した
- 大きな性能改善は見られず
最近Docling触っていなかった
2024年10月に1.0→2.0のアップデートがあり、性能がかなり向上して仕事でも選択肢に入るレベルとなりました。
その際に触ったのですが、
- 単純なPDF、エクセルの平文、表は読み取れる
- 複雑な表は正しく読み取れない
- Word, Excelのテキストボックスは読み取れない
- 様々なフォーマットをまとめて単一のIFで操作できるのは便利
- 性能的にはLLM、VLMに入れる前段階として採用するか
という感想でした。
最近はVLMにはじめから出力させてもある程度の精度で抽出してくれるのもあり、しばらく追っておらず。
最近の性能を把握するために調べたもののqiita、zennに類似記事が見当たらなかったのでクイックに動かした内容と感想を共有します。
Doclingとは:PDFや画像、Office文書を読み取り、文字・表・レイアウトをそのまま再現して抽出する文書解析ツールです。OCRにも対応しており、画像内の文字も含めてMarkdownなどの扱いやすい形式に変換できます。(チャッピー生成)
検証環境
| 項目 | 内容 |
|---|---|
| 実施日 | 2025年11月13日 |
| OS | Windows |
| CPU | 13世代 Core i5-1345U |
| RAM | 16GB |
| 実行環境 | CPU 実行 |
| Python | 3.12.10 |
| Docling | 2.61.2 |
表の画像の抽出結果
表とキャプションのみを含む画像から表を抽出し、markdown形式で出力させます。日本語の表と英語の表について難易度を変えて検証しました。使用したコードは末尾に記載します。
結論を先に述べると、1年前より性能は良くなっていそうですが、DoclingでOK!となるほどの性能は出ていませんでした。
日本語 - 難易度:低
まずは簡単な表で検証します。「内訳」を抽出し損ねているが表構造は正しいのでヨシ。
↓ここから出力結果
表2-51地方公共团体種别公立書館電子書籍一の導入状况
| 書館数 | 導入館数 | 導入率 | ||
|---|---|---|---|---|
| 合計 | 合計 | 2,637 | 1,232 | 46.7% |
| 都道府 | 56 | 32 | 57.1% | |
| 指定都市 | 243 | 202 | 83.1% | |
| 区 | 204 | 163 | 79.9% | |
| 市 | 1,651 | 771 | 46.7% | |
| 町 | 434 | 62 | 14.3% | |
| 村 | 49 | 2 | 4.1% |
日本語 - 難易度:中
右3列は簡単なので正確に抽出できているので、「分類」列に注目。複数列・行にまたがる「分類」「学習指導要領の内容」はそれぞれのセルに値を入れているのは評価できます。しかし他は正確に埋め切れていません。うーん、中途半端でイマイチ。
↓ここから出力結果
(分類·区分别集计結果)
| 分類 | 分類 | 区分 | 对象 問題数 (間) | 平均 正答率 (%) |
|---|---|---|---|---|
| 学习指導要颌の内容 | 知識及 | (1)の特微使方開事 | 2 | 77 |
| 学习指導要颌の内容 | (2)情報の极方事 | 1 | 63.2 | |
| 学习指導要颌の内容 | (3)我国の語文化事项 | 1 | 81.3 | |
| 学习指導要颌の内容 | 思考力、 | 話·< A | 3 | 66.4 |
| 学习指導要颌の内容 | 判断力、 表現力等 | B < | 3 | 69.7 |
| 学习指導要颌の内容 | C | 57.7 | ||
| 知識·技能 | 4 | 74.6 | ||
| 评俩の点 | 评俩の点 | 思考·判断·表現 | 10 | 63.9 |
| 問題形式 | 問題形式 | 邂抿式 | 64.9 | |
| 短答式 | 3 | 78.6 | ||
| 記述式 | 2 | 59 |
言語指定していないので中国語になっているのは見逃します。
日本語 - 難易度:中
表の構造はシンプルだが日本語モリモリの場合。残念ながら中国語と日本語が混ざった出力になりました。また数値も数と割合を区別して抽出できていません。NE、BEEEなどはどこから来たのか…。
↓ここから出力結果
区表2-36 地方公共团体種别 公立館電子書籍一の導状况
| 全体 | 公立 書館電子書籍 3 | 現在公立書館 部公立国書 電子書籍 館電子書籍 導入寸予定 具体的仁 | 現在公立書館 電子書籍 導 、尊入 | 公立書館電 子籍 | の他 | 無回答 | ||
|---|---|---|---|---|---|---|---|---|
| 全体 | 100.0%) | 33.7%) | 12 1.1%) 一 | 23 2.0%) | 203 18.1%) ( | 437 38.9%) | 42 3.7%) | 27 |
| 都道府 | 46 100.0%) | 27 58.7%) | 2.2%) | 6.5%) | 10 21.7%) | 4 8.7%) | 1 2.2%) | 0 0.0%) |
| 指定都市 | 20 C | 14 | NE 1 5.0%) | 1 5.0%) | 1 5.0%) | BEEES 0 0.0%) | 0 0.0%) | 3 15.0%) |
| 区 | 19 100.0%) | 15 78.9%) | 0 0.0%) | 0 0.0%) | 1 5.3%) | 0 0.0%) | 1 5.3%) | |
| 市 | EASSM 622 | 261 42.0%) | 10 1.6%) | AULA 14 | ASASAEL | 165 26.5%) | MAAMA 3.5%) | 13 2.1%) |
| 町 | 366 100.0%) | 59 16.1%) | 0 0.0%) | 2 0.5%) | 47 12.8%) | 234 63.9%) | 14 3.8%) | 10 2.7%) |
| 村 | 49 100.0% | 2 4.1%) | 0 0.0%) | 1 2.0%) C | 8 16.3%) | 33 67.3%) | 5 10.2%) | 0 0.0%) |
英語 - 難易度:低
英語の方がしっかり調整されていそうなので英語の表でも試してみます。まずは簡単な表から。完璧に抽出できていますね。
↓ここから出力結果
Table 1:Maximum pathlengths,per-layer complexity and minimum numberof sequential operations for different layer types.nis the sequence length,dis therepresentation dimension,is thekernel size of convolutions and r the size of the neighborhood in restricted self-attention.
| Layer Type | ComplexityperLayer | Sequential Operations | MaximumPathLength |
|---|---|---|---|
| Self-Attention | O(n².d) | 0(1) | 0(1) |
| Recurrent | P.u)o | O(n) | (u)o |
| Convolutional | O(k-n.d | 0(1) | O(logk(n) |
| Self-Attention(restricted) | O(r.n-d) | 0(1) | O(n/r) |
英語 - 難易度:中
複数行・列&穴あきの表もしっかり読めています。1020 が1020になっている点以外は完璧。
↓ここから出力結果
Table 2:The Transformer achievesbetterBLEU scores thanprevious state-of-the-art models on the English-to-German and English-to-Frenchnewstest2014 testsata fraction of the trainingcost.
| Model | BLEU | BLEU | Training Cost (FLOPs) | Training Cost (FLOPs) |
|---|---|---|---|---|
| EN-DE | EN-FR | EN-DE | EN-FR | |
| ByteNet[18] | 23.75 | |||
| Deep-Att +PosUnk[39] | 39.2 | 1.0-1020 | ||
| GNMT+RL[38] | 24.6 | 39.92 | 2.3.1019 | 1.4-1020 |
| ConvS2S [9] | 25.16 | 40.46 | 9.6.1018 | 1.5-1020 |
| MoE[32] | 26.03 | 40.56 | 2.0.1019 | 1.2.1020 |
| Deep-Att+PosUnk Ensemble[39] | 40.4 | 8.0.1020 | ||
| GNMT+RLEnsemble[38] | 26.30 | 41.16 | 1.8.1020 | 1.1.1021 |
| ConvS2SEnsemble[9] | 26.36 | 41.29 | 7.7.1019 | 1.2.1021 |
| Transformer(base model) | 27.3 | 38.1 | 3.3.1018 | 3.3.1018 |
| Transformer (big) | 28.4 | 41.8 | 2.3.1019 | 2.3.1019 |
英語 - 難易度:中
かなり頑張っています。基本な構造に間違いはありません。しかし、base列の解釈を誤っている、D列のϵlsが0.2の行がない、などミスもあります。それでも総じて日本語よりは高精度に抽出できています。
↓ここから出力結果
Table 3:Variations on theTransformer architecture.Unlistedvaluesare identical to those of thebase model.All metrics are ontheEnglish-to-German translationdevelopmentset,newstest20i3.Listed perplexitiesareper-wordpiece,according to ourbyte-pairencoding.and shouldnotbecompared to per-word perplexities.
(表示の関係で2つに分けます)
| N | dmodel | dr | h | dk | du | Pdrop | Els | train steps | |
|---|---|---|---|---|---|---|---|---|---|
| base | 6 | 512 | 2048 | 8 | 64 | 9 | 0.1 | 0.1 | 100K |
| 1 | 512 | 512 | |||||||
| 4 | 128 | 128 | |||||||
| (A) | 16 | 32 | 32 | ||||||
| 32 | 16 | 16 | |||||||
| 16 | |||||||||
| (B) | 32 | ||||||||
| 2 | |||||||||
| 4 | |||||||||
| 8 | |||||||||
| (C) | 256 | 32 | 32 | ||||||
| 1024 | 128 | 128 | |||||||
| 1024 | |||||||||
| 4096 | |||||||||
| 0.0 | |||||||||
| 0.2 | |||||||||
| (D) | 0.0 | ||||||||
| * | * | * | * | * | * | * | * | ||
| (E) big | 6 | 1024 | 4096 | 16 | 0.3 | 300K |
(*は"0.2 positionalembedding instead of sinusoids"。表示の関係で切り出した。)
| Variant | PPL (dev) | BLEU (dev) | params x10^6 |
|---|---|---|---|
| base (row1) | 4.92 | 25.8 | 65 |
| base (row2) | 5.29 | 24.9 | — |
| base (row3) | 5.00 | 25.5 | — |
| (A) h=16 | 4.91 | 25.8 | — |
| (A) h=32 | 5.01 | 25.4 | — |
| (A) dk=16 | 5.16 | 25.1 | 58 |
| (B) dk=32 | 5.01 | 25.4 | 60 |
| N=2 | 6.11 | 23.7 | 36 |
| N=4 | 5.19 | 25.3 | 50 |
| N=8 | 4.88 | 25.5 | 80 |
| (C) dmodel=256 | 5.75 | 24.5 | 28 |
| (C) dmodel=1024 | 4.66 | 26.0 | 168 |
| (C) dr=1024 | 5.12 | 25.4 | 53 |
| (C) dr=4096 | 4.75 | 26.2 | 90 |
| Pdrop=0.0 | 5.77 | 24.6 | — |
| Pdrop=0.2 | 4.95 | 25.5 | — |
| (D) pos emb | 4.92 | 25.7 | — |
| (E) big | 4.33 | 26.4 | 213 |
PDFの表の抽出結果
難易度:中
ついでにPDFも試してみました。テキスト情報はそのまま読める分高精度に抽出できていますね。
↓ここから出力結果
経年変化分析調査・保護者に対する調査の結果(概要)のポイント
image
経年変化分析調査・保護者に対する調査の概要
令和7年7月 文部科学省・国立教育政策研究所
image
| 経年変化分析調査 | 保護者に対する調査 | |
|---|---|---|
| 全国的な学力の状況について、経年の変化を把握・分析し、今後の教育施策の検 証・改善に役立てる。 | 家庭状況と学力等の関係について、経年の変化を把握・分析し、今後の教 育施策の検証・改善に役立てる 。 | 調査目的 |
| 令和6年5月 13 日 ( 月 ) ~6月 28 日 ( 金 ) | 左記期間に学校を通じて実施 | 調査実施日 |
| 国・公・私立の小学校6年生、中学校3年生の児童生徒 【抽出】 | 本体調査及び経年変化分析調査を実施した児童生徒の保護者 | 調査対象 |
| 国語、算数・数学、英語(中学校のみ) | 児童生徒の家庭における状況、教育に関する考え方等に関する質問調査 | 調査内容 |
| PBT(※1) | PBT(※1) | PBT(※1) | PBT(※1) | CBT(※2) | CBT(※2) | CBT(※2) | CBT(※2) | CBT(※2) | |
|---|---|---|---|---|---|---|---|---|---|
| 小学校 | 国語・算数 | 各 300 | 校(約3万人) | 国語・算数 | 各 300 | 校(約3万人) | |||
| 中学校 | 国語・数学・英語 | 各 250 | 校(約7万人) | 国語・数学・英語 | 各 250 | 校(約7万人) | |||
| (※1 ) | 前回までと同様の、冊子を用いた筆記形式 | (※2 ) | 児童生徒の ICT | 端末を用いたオンライン方式 |
経年変化分析調査の結果
image
平成 28 年度、令和3年度、令和6年度( PBT 実施校)の結果を比較したところ、各教科において以下のようなことが観察された。ただし、 全国の本調査のスコア分布の状況に関する変化の有無は中長期的に継続して分析する必要があり、次回(令和9年度予定)以降の結果もあ わせて引き続き分析していくこととする。
(1) 国全体のスコアの推移(基準年との比較)
- ・小学校国語・算数、中学校国語・英語について は、本調査のスコアの低下が見られた。
- ・中学校数学については、本調査のスコアの変化 は見られなかった。
(2) 社会経済的背景( SES )とスコア
- ・ SES が低い層の方がスコアの低下が大きい状況 が確認された(中学校英語を除く)。
- ①令和6年度調査については、前回までと同じ PBT で 実施した学校の結果により比較した。
- ②同一内容を CBT で実施したところ、画面レイアウトや 操作等の影響が生じた問題が見られた。
image
1
↑ここまでが出力結果
まとめ
1年前よりある程度の性能改善が見られて、英語なら十分な精度が出ていそうです。Doclingで出力したテキストをLLMに食べさせれば十分に理解してくれそうです。一方で日本語は対応外だったのでしょうか、イマイチな性能でした。結論、この精度では日本語の資料の抽出を任せるには力不足ですね。
とはいえ、複数のフォーマットを一括で扱えるのは便利なので、軽い使用では使っていこうと思います。
おまけ: CPUでの実行速度
おっそい。デフォルトではVLM(IBM Granite?)かEasyOCRあたりを使用しているのかなと思って確認していませんが、約600x200~800x600ピクセルの画像で、約40~220秒かかりました。環境は13世代core i5/メモリ16GB/cpu実行です。性能に対して十分な速度かと言われると悩みます。なお、Macなら簡単に高速化オプションがあるようです。
おまけ2: チャッピーによる分析コメ
Docling は OCR → レイアウト解析 → トークン化 → 表構造推定 の4段階で構造化データを生成する。
- OCR:文字の読み取り(ここが日本語精度に影響)
- レイアウト解析:ページ構造認識(VLMが活躍)
- トークン化:文字を行・セル単位で整理
- 表構造推定:ヒューリスティック+VLMでセル境界や結合を判断
英語・整った表は強いが、日本語+複雑レイアウトは(OCR誤り+レイアウト推定難度)で精度が落ちるのでは。
画像元
画像は以下の中のものを使用しています。
- 文部科学省, 令和6年度「子供の読書活動の推進等に関する調査研究(電子図書館・電子書籍と子供の読書活動推進に関する実態調査)」調査報告書, https://www.mext.go.jp/content/20250528-mxt_chisui01-000042427_2.pdf.
- 文部科学省, 経年変化分析調査・保護者に対する調査の結果(概要)のポイント, https://www.mext.go.jp/content/20250731-mxt_chousa02-000044035-05.pdf
- 文部科学省, 【資料1-1】令和7年度全国学力・学習状況調査の結果(概要), https://www.mext.go.jp/content/20250731-mxt_chousa02-000044035-01.pdf.
- Ashish Vaswani, et al., Attention Is All You Need, https://doi.org/10.48550/arXiv.1706.03762.
コード
import os
import sys
import time
from pathlib import Path
from docling.document_converter import DocumentConverter
# ---- 引数チェック ----
if len(sys.argv) < 2:
print("Usage: python ocr_docling.py <input_file>")
sys.exit(1)
input_path = Path(sys.argv[1])
if not input_path.exists():
print(f"Error: File not found -> {input_path}")
sys.exit(1)
# ---- 環境変数(HF symlink 問題対策) ----
os.environ["HF_HUB_DISABLE_SYMLINKS"] = "1"
# ---- 時間計測開始 ----
start_time = time.time()
converter = DocumentConverter()
results = converter.convert(input_path)
result_md = results.document.export_to_markdown()
# ---- 経過時間 ----
elapsed = int(time.time() - start_time) # 秒
output_filename = f"{input_path.stem}_out_{elapsed}s.md"
output_path = input_path.with_name(output_filename)
# ---- 保存 ----
with open(output_path, "w", encoding="utf-8") as f:
f.write(result_md + "\n")
# ---- 出力 ----
print(result_md)
print(f"OCR結果を保存しました: {output_path}")
⚠️ 誤りや訂正すべき点があれば教えてください。