- 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>
5.6 KiB
📑 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 :
- Extraction LLM classique (par défaut) - Analyse sémantique via modèle de langage
- 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 :
# Via API
process_pdf(
pdf_path,
use_ocr_annotations=True, # Active l'analyse d'indentation
)
Algorithme
- Détection de la TOC : Recherche "Table des matières" dans le markdown
- Extraction des entrées : Pattern regex
Titre.....PageNumber - Comptage des espaces :
0-2 espaces→ niveau 1 (titre principal)3-6 espaces→ niveau 2 (sous-section)7+ espaces→ niveau 3 (sous-sous-section)
- 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
# 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 :
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
{
"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 :
- Vérifier que le PDF contient bien une TOC explicite
- Augmenter
max_linessi la TOC est très loin dans le document - 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 :
- Vérifier que les titres ont une indentation visuelle dans le PDF original
- Ajuster les seuils d'espaces dans le code (lignes ~90-95 de
toc_extractor_markdown.py) - Examiner le fichier
.mdpour voir comment l'OCR a préservé l'indentation
Entrées manquantes
Problème : Certains titres n'apparaissent pas
Solutions :
- Vérifier le pattern regex (peut ne pas correspondre au format de votre TOC)
- Regarder les logs :
logger.debug()affiche chaque ligne analysée - Augmenter la limite de lignes analysées
🔬 Mode debug
Pour activer les logs détaillés :
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