Files
linear-coding-agent/generations/library_rag/docs_techniques/TOC_EXTRACTION.md
David Blanc Brioir d2f7165120 Add Library RAG project and cleanup root directory
- Add complete Library RAG application (Flask + MCP server)
  - PDF processing pipeline with OCR and LLM extraction
  - Weaviate vector database integration (BGE-M3 embeddings)
  - Flask web interface with search and document management
  - MCP server for Claude Desktop integration
  - Comprehensive test suite (134 tests)

- Clean up root directory
  - Remove obsolete documentation files
  - Remove backup and temporary files
  - Update autonomous agent configuration

- Update prompts
  - Enhance initializer bis prompt with better instructions

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-30 11:57:12 +01:00

197 lines
5.6 KiB
Markdown

# 📑 Extraction de la Table des Matières (TOC)
## Vue d'ensemble
Le système Philosophia propose **deux méthodes** pour extraire la table des matières des documents PDF :
1. **Extraction LLM classique** (par défaut) - Analyse sémantique via modèle de langage
2. **Extraction avec analyse d'indentation** (recommandé) - Détection visuelle de la hiérarchie
## 🎯 Méthode recommandée : Analyse d'indentation
### Fonctionnement
Cette méthode analyse le **markdown généré par l'OCR** pour détecter la hiérarchie en comptant les espaces d'indentation :
```
Présentation → 0-2 espaces = niveau 1
Qu'est-ce que la vertu ? → 3-6 espaces = niveau 2
Modèles de définition → 3-6 espaces = niveau 2
Ménon ou de la vertu → 0-2 espaces = niveau 1
```
### Avantages
-**Fiable** : Détection basée sur la position réelle du texte
-**Rapide** : Pas d'appel API supplémentaire
-**Économique** : Coût zéro (utilise l'OCR déjà effectué)
-**Hiérarchique** : Construit correctement la structure parent/enfant
### Activation
Dans l'interface Flask, cochez **"Extraction TOC améliorée (analyse indentation)"** lors de l'upload :
```python
# Via API
process_pdf(
pdf_path,
use_ocr_annotations=True, # Active l'analyse d'indentation
)
```
### Algorithme
1. **Détection de la TOC** : Recherche "Table des matières" dans le markdown
2. **Extraction des entrées** : Pattern regex `Titre.....PageNumber`
3. **Comptage des espaces** :
- `0-2 espaces` → niveau 1 (titre principal)
- `3-6 espaces` → niveau 2 (sous-section)
- `7+ espaces` → niveau 3 (sous-sous-section)
4. **Construction hiérarchique** : Utilisation d'une stack pour organiser parent/enfant
### Code source
- **Module principal** : `utils/toc_extractor_markdown.py`
- **Intégration pipeline** : `utils/pdf_pipeline.py` (ligne ~290)
- **Fonction clé** : `extract_toc_from_markdown()`
## 📊 Méthode alternative : Extraction LLM
### Fonctionnement
Envoie le markdown complet à un LLM (Mistral ou Ollama) qui analyse sémantiquement la structure.
### Avantages
- Comprend la structure logique même sans indentation claire
- Peut déduire la hiérarchie du contexte
### Inconvénients
-**Moins fiable** : Peut mal interpréter la structure
-**Plus lent** : Appel LLM supplémentaire
-**Plus cher** : Consomme des tokens
-**Aplatit parfois** : Tendance à mettre tout au même niveau
### Activation
C'est la méthode par défaut si l'option "Extraction TOC améliorée" n'est **pas** cochée.
## 🔧 Configuration avancée
### Paramètres personnalisables
```python
# Dans toc_extractor_markdown.py
def extract_toc_from_markdown(
markdown_text: str,
max_lines: int = 200, # Lignes à analyser pour trouver la TOC
):
# Seuils d'indentation personnalisables
if leading_spaces <= 2:
level = 1 # Modifier selon votre format
elif leading_spaces <= 6:
level = 2
else:
level = 3
```
### Pattern TOC personnalisable
Le pattern regex détecte les formats suivants :
- `Titre.....3` (avec points de suite)
- `Titre 3` (avec espaces)
- `Titre..3` (avec quelques points)
Pour modifier, éditer la regex dans `toc_extractor_markdown.py` :
```python
match = re.match(r'^(.+?)\s*\.{2,}\s*(\d+)\s*$', line)
```
## 📈 Résultats comparatifs
### Document test : Ménon de Platon (107 pages)
| Méthode | Entrées | Niveaux | Hiérarchie | Temps | Coût |
|---------|---------|---------|------------|-------|------|
| **LLM classique** | 11 | Tous level 1 | ❌ Plate | ~15s | +0.002€ |
| **Analyse indentation** | 11 | 2 niveaux | ✅ Correcte | <1s | 0€ |
### Exemple de structure obtenue
```json
{
"title": "Présentation",
"level": 1,
"children": [
{"title": "Qu'est-ce que la vertu ?", "level": 2},
{"title": "Modèles de définition", "level": 2},
{"title": "Définition de la vertu", "level": 2},
...
]
},
{
"title": "Ménon ou de la vertu",
"level": 1,
"children": []
}
```
## 🐛 Dépannage
### La TOC n'est pas détectée
**Problème** : Le message "Table des matières introuvable" apparaît
**Solutions** :
1. Vérifier que le PDF contient bien une TOC explicite
2. Augmenter `max_lines` si la TOC est très loin dans le document
3. Vérifier que la TOC contient le texte "Table des matières" ou variantes
### Tous les titres sont au level 1
**Problème** : Aucune hiérarchie détectée
**Solutions** :
1. Vérifier que les titres ont une **indentation visuelle** dans le PDF original
2. Ajuster les seuils d'espaces dans le code (lignes ~90-95 de `toc_extractor_markdown.py`)
3. Examiner le fichier `.md` pour voir comment l'OCR a préservé l'indentation
### Entrées manquantes
**Problème** : Certains titres n'apparaissent pas
**Solutions** :
1. Vérifier le pattern regex (peut ne pas correspondre au format de votre TOC)
2. Regarder les logs : `logger.debug()` affiche chaque ligne analysée
3. Augmenter la limite de lignes analysées
## 🔬 Mode debug
Pour activer les logs détaillés :
```python
import logging
logging.getLogger('utils.toc_extractor_markdown').setLevel(logging.DEBUG)
```
Vous verrez :
```
Extraction TOC depuis markdown (analyse indentation)
TOC trouvée à la ligne 42
'Présentation' → 0 espaces → level 1 (page 3)
'Qu'est-ce que la vertu ?' → 4 espaces → level 2 (page 3)
...
✅ 11 entrées extraites depuis markdown
```
## 📚 Références
- **Code source** : `utils/toc_extractor_markdown.py`
- **Tests** : Testé sur Platon - Ménon, Tiercelin - La pensée-signe
- **Format supporté** : PDF avec TOC textuelle indentée
- **Langues** : Français, fonctionne avec toute langue utilisant des espaces