データインジェスト v5 - マルチフォーマット対応¶
作成日: 2025年12月16日
ステータス: 初回インジェスト実行中
概要¶
上層部からのフィードバック「ナレッジの量が不足している」に対応し、大量のドキュメントを一括で取り込むためのマルチフォーマット対応インジェストパイプラインを構築しました。
投入データの分析結果¶
データソース¶
data/additional20251216/
ファイル種類別集計¶
| 拡張子 | 件数 | 処理 |
|---|---|---|
| 765 | ✅ 処理対象 | |
| Word (.docx) | 156 | ✅ 処理対象 |
| Excel (.xlsx) | 39 | ✅ 処理対象 |
| Excel (.xls) | 30 | ✅ 処理対象 |
| SQL | 574 | ❌ 除外 |
| DLL | 503 | ❌ 除外 |
| その他バイナリ | 多数 | ❌ 除外 |
処理対象サマリー¶
| カテゴリ | 件数 |
|---|---|
| 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分程度かかる見込みです。
関連ドキュメント¶
- architecture.md - システムアーキテクチャ
- development.md - 開発ガイド
- structured_chunk_schema.md - チャンクスキーマ定義