地平線まで行ってくる。

記録あるいは忘備録。時には検討事項。

なんとなく作ってみたコードで、神(方眼紙)エクセルの解析を比較

試してきた神(方眼紙)エクセル解析を比較してみる。

1. 動機

帳票とか複雑なテキストの表は、企業の中ではよく見かけるのではないでしょうか。そこで、「方眼紙エクセル」からの構造化データ抽出について、2つの手法を作ってみていました。それらをそれなりに統合的にパースしたら楽できるなと基本的なお勉強をしてきました。その途中で作成した docling-markdown-generator (IBMのdoclingを使ったmarkdownによる再現) と kami_excel_extractor (VLM/LLMを使った情報抽出) を比較しました。

これまで、なんとなく、ポチポチとdebugしていましたが、それぞれの特徴があります。これらを使って簡単に評価してまとめてみます。

github.com

github.com

2. 評価手法

  • 対象: 7カテゴリのダミー方眼紙エクセルファイル
  • 手法 A: docling (docling-markdown-generator)
  • 手法 B: kami (kami_excel_extractor)
    • モデル B-1: gemini-3.1-flash-lite-preview (Googleさんのgemini API)
    • モデル B-2: ollama/gemma4:latest (ローカルLLM/Ollamaなので量子化モデル)

ダミーモデル達を適当に生成して使いました。

# ファイル名 カテゴリ 難易度 特徴
1 01_simple_table.xlsx 単純表形式 ★☆☆ 通常のヘッダー+データ行(セル結合なし)
2 02_houganshi_form.xlsx 方眼紙レイアウト ★★☆ 細かいセル結合で構成された「申請書」
3 03_complex_report.xlsx 複合帳票 ★★★ ヘッダー情報 + 経費明細表 + 承認欄が混在する複雑な構成
4 04_chart_data.xlsx グラフ付き ★★★ 月別売上データ + 埋め込み棒グラフ
5 05_multi_sheet.xlsx マルチシート ★★☆ 複数シート(社員一覧・部署別集計・注記)のデータ参照
6 06_extreme_merge.xlsx 極端な結合 ★★★ 100列×50行の組織図風で不規則かつ大量のセル結合
7 07_styled_invoice.xlsx スタイル重視 ★★☆ 罫線の太さ・背景色・フォントで視覚的に区分けされた請求書

3. 比較

3.1 抽出結果の具体例(03_complex_report の場合)

「複合帳票 (03_complex_report.xlsx)」の実際の抽出結果の一部を例として挙げます。

手法 A (Docling) の出力

Doclingは罫線を基準に表を認識するため、独立した複数のHTMLテーブルとして断片的に出力させています。データの関連性や帳票の階層構造は、こんなものでしょう。

<table><tbody><tr><th colspan="5">株式会社 経費報告書</th></tr></tbody></table>

<table><tbody><tr><th>項番</th><th>日付</th><th>摘要</th><th>金額</th><th>備考</th></tr></tbody></table>

<table><tbody><tr><th>合計</th></tr></tbody></table>

<table><tbody><tr><th colspan="2">課長</th><th colspan="2">部長</th><th colspan="2">承認</th></tr></tbody></table>

手法 B-1 (Kami + Gemini 3.1 Flash-Lite Preview) の出力

kamiは視覚的特徴(スタイル)とVLMによる意味理解を組み合わせています。ヘッダー、明細行、合計式、承認欄などの「帳票の論理構造」を正確にJSONとして抽出できました。また、不要な空白行(空のセルの連続)を自動的にフィルタリングしているので見やすい結果ですね。計算式は蛇足かもしれませんが、「合計」という表現を補足できるように抽出させています。

{
  "title": "株式会社経費報告書",
  "table_data": {
    "headers": ["項番", "日付", "摘要", "金額", "備考"],
    "rows": [], // 不要な空白行は文脈を読んで自動で省略される
    "summary": {
      "label": "合計",
      "value": 0,
      "formula": "=SUM(D8:D25)"
    }
  },
  "approval_fields": {
    "section_manager": "課長",
    "department_manager": "部長",
    "approval": "承認"
  }
}

手法 B-2 (Kami + Gemma4) の出力

Gemma4(ローカル推論)でも結構頑張ります。表内の空白セル(未入力のダミー行)を null としてすべて律儀に出力してしまうなど、Geminiと比べると推論結果がやや冗長ですが、プロンプトの工夫次第な印象。ゲームPC程度のGPUで動かせるGemma4でここまでやれれば嬉しい。

{
  "title": "株式会社経費報告書",
  "table_data": {
    "headers": ["項番", "日付", "摘要", "金額", "備考"],
    "rows": [
      { "A8": null, "B8": null, "C8": null, "D8": null, "E8": null },
      { "A9": null, "B9": null, "C9": null, "D9": null, "E9": null }
      // ... 以降の空白行も同様に null として出力される
    ],
    "summary": {
      "label": "合計",
      "value": 0,
      "formula": "=SUM(D8:D25)"
    }
  },
  "approval_fields": {
    "section_manager": "課長",
    "department_manager": "部長",
    "approval": "承認"
  }
}

3.2 手法別再現性・精度の目視検証結果

カテゴリ 手法 A (Docling) 手法 B (Kami/Gemini) 手法 B (Kami/Gemma4)
構造再現性 非常に高い (テーブル定義のみ) 極めて高い (帳票の階層を理解) 高い (一部の座標推論に揺らぎ)
意味的抽出 不可 (テキストのみ抽出) 良好 (項目と値を対で抽出) 良好 (冗長な説明が含まれる場合あり)
レイアウト耐性 ルールベースで安定 複雑な結合セルに強い 複雑な結合に強いが推論ミス稀有

3.3 結果として

1. ルールベースの限界と堅牢性 (Docling)

docling は Markdown 変換の安定性に特化して、複雑なセル結合があっても「テキスト」として漏らさず取得するという観点では優秀です。表形式をHTMLで表現させたので、Markdown式の表の表現限界を回避させるだけで使い方が広がります。帳票のフッターや注釈といった、レイアウト上の「意味的な区分」はなくなるので、2次利用の時には注意ですね。

2. VLM モデル比較 (Gemini vs Gemma4)

  • Gemini 3.1 Flash-Lite Preview: さすがの文脈理解力。そこそこ複雑な結合セル群 (06_extreme_merge) でも論理単位を的確にグループ化し、JSON 構造に落とし込んでいました。Flash-Liteでこれなら良し。
  • Gemma 4 (Local): 空間推論において Gemini に肉薄し、実際の出力でも 03_complex_report のような複雑な帳票の計算式や承認欄を構造化できています。十分使えるレベルでは?

4. 運用・技術的推奨指針

運用フェーズ 推奨手法 理由
Markdownに変換したい Docling 環境構築が容易で、帳票の「内容」を素早くテキスト化できるため。
抽出重視 Kami + Gemini 帳票の意味を解釈し、データ抽出ミスを最小限に抑える必要があるため。
コスト重視 Kami + Gemma4 外部 API に依存せず、高度な論理構造抽出(計算式の解釈や項目と値のペアリングなど)が可能であるため。

5. 結びに

「方眼紙エクセル」の解析は、確かに見た目の解析に目が向きます。Docling がその「形式」に着目したのに対し、Kami はその構造を考えています。構造化データを求めるのであれば Kami に優位がありそうです。要件に合わせて両手法を適切に使い分ける(あるいは組み合わせる)運用になると思います。色々な表現ができちゃうのがエクセルです。逆に言えばmarkdownの表現に限界がある以上、元データをちゃんと整理して保存しておくことが重要であると、改めて感じました。

エクセルが中途半端なWYSIWYG風なのは結構辛いですね・・・。