コンテンツにスキップ

データインジェスト v5 - マルチフォーマット対応

作成日: 2025年12月16日
ステータス: 初回インジェスト実行中

概要

上層部からのフィードバック「ナレッジの量が不足している」に対応し、大量のドキュメントを一括で取り込むためのマルチフォーマット対応インジェストパイプラインを構築しました。

投入データの分析結果

データソース

data/additional20251216/

ファイル種類別集計

拡張子 件数 処理
PDF 765 ✅ 処理対象
Word (.docx) 156 ✅ 処理対象
Excel (.xlsx) 39 ✅ 処理対象
Excel (.xls) 30 ✅ 処理対象
SQL 574 ❌ 除外
DLL 503 ❌ 除外
その他バイナリ 多数 ❌ 除外

処理対象サマリー

カテゴリ 件数
PDF 765
Word (.docx/.doc) 106
Excel (.xlsx/.xls) 69
重複スキップ(PDF/Word両方存在) 51
処理対象合計 約940件

重複検出

同一ファイル名でPDFとWordの両方が存在するケースが51件検出されました。
→ PDFを優先し、Word版はスキップする方針を採用

作成したツール

1. ingest/prepare_data_v5.py - マルチフォーマットインジェスト

機能

  • PDF処理: pdfplumber を使用したテキスト抽出
  • Word処理: python-docx を使用(テーブル内テキストも抽出)
  • Excel処理: openpyxl を使用(全シートを処理)
  • 重複検出: 同名のPDF/Wordファイルを検出し、どちらかをスキップ
  • バイナリ除外: DLL、EXE、SQL等の非ドキュメントファイルを自動除外
  • チャンク分割: 設定可能なサイズでテキストを分割
  • コンテンツハッシュ: MD5ハッシュによる重複排除サポート

使用方法

# ドライラン(実際の処理なし)
python ingest/prepare_data_v5.py "data/additional20251216" --dry-run

# 実行
python ingest/prepare_data_v5.py "data/additional20251216" -o "data/chunks_additional_v5.jsonl"

# オプション
#   --dry-run           : ドライランモード
#   --prefer-word       : 重複時にWordを優先(デフォルトはPDF優先)
#   --chunk-size N      : チャンクサイズ(デフォルト: 1000)
#   --chunk-overlap N   : オーバーラップ(デフォルト: 200)

出力形式(JSONL)

{
  "chunk_id": "doc_001_chunk_001",
  "content": "ドキュメントのテキスト内容...",
  "source_path": "path/to/document.pdf",
  "doc_type": "pdf",
  "page_number": 1,
  "chunk_index": 0,
  "total_chunks": 5,
  "content_hash": "a1b2c3d4..."
}

除外パターン

以下の拡張子は自動的に除外されます: - バイナリ: .dll, .exe, .bin, .obj, .lib - データベース: .sql, .sqc, .mdf, .ldf - 設定: .config, .xml, .json, .ini - 開発: .cs, .vb, .resx, .sln, .csproj - その他: .con, .dat, .bak

依存ライブラリ

pip install pdfplumber python-docx openpyxl

2. ingest/check_duplicates.py - 重複差分チェック

機能

  • PDF/Wordの同名ファイルペアを検出
  • 両ファイルのテキストを抽出して比較
  • Jaccard類似度を計算
  • Markdownレポートを生成

使用方法

# レポート生成
python ingest/check_duplicates.py "data/additional20251216" -o "duplicates_report.md"

# 標準出力
python ingest/check_duplicates.py "data/additional20251216"

出力例

# 重複ファイルレポート

## サマリー
- 重複ペア数: 51
- 高類似度(>90%): 45
- 中類似度(50-90%): 4
- 低類似度(<50%): 2

## 詳細

| ファイル名 | 類似度 | PDF文字数 | Word文字数 | 推奨 |
|-----------|--------|----------|-----------|------|
| manual.pdf / manual.docx | 98.5% | 15,432 | 15,410 | PDF |
| ...

技術スタック

ライブラリ バージョン 用途
pdfplumber - PDFテキスト抽出
python-docx 1.2.0 Wordドキュメント処理
openpyxl 3.1.5 Excelファイル処理

処理フロー

data/additional20251216/
        │
        ▼
┌───────────────────────────────┐
│   prepare_data_v5.py          │
│   ・ファイル種別判定           │
│   ・バイナリ除外               │
│   ・重複検出                   │
│   ・テキスト抽出               │
│   ・チャンク分割               │
└───────────────────────────────┘
        │
        ▼
data/chunks_additional_v5.jsonl
        │
        ▼
┌───────────────────────────────┐
│   Azure AI Search             │
│   インデックス登録            │
└───────────────────────────────┘
        │
        ▼
    KnowledgeYard システムで検索可能

今後の作業

完了待ち

  • [ ] 初回インジェスト完了
  • [ ] JSONLファイル生成確認

次ステップ

  • [ ] Azure AI Search へのインデックス登録
  • [ ] 新ドキュメントでの検索テスト
  • [ ] 回答精度の確認

将来的な改善

  • [ ] 差分インジェスト(新規・更新ファイルのみ処理)
  • [ ] OCR対応(スキャンPDF)
  • [ ] PowerPoint対応
  • [ ] 処理の並列化によるパフォーマンス改善

警告・注意事項

PDF色情報の警告

処理中に以下のような警告が大量に出力されますが、テキスト抽出には影響ありません

WARNING - Cannot set gray non-stroke color because /'P404' is an invalid float value

これはPDFの色定義に関する問題で、pdfplumberが厳密に解析しようとした結果です。

大規模PDFの処理時間

1000ページ以上のシステムマニュアル等は処理に時間がかかります。
約940件の処理に推定10-20分程度かかる見込みです。

関連ドキュメント