feat: Add data quality verification & cleanup scripts

## Data Quality & Cleanup (Priorities 1-6)

Added comprehensive data quality verification and cleanup system:

**Scripts créés**:
- verify_data_quality.py: Analyse qualité complète œuvre par œuvre
- clean_duplicate_documents.py: Nettoyage doublons Documents
- populate_work_collection.py/clean.py: Peuplement Work collection
- fix_chunks_count.py: Correction chunksCount incohérents
- manage_orphan_chunks.py: Gestion chunks orphelins (3 options)
- clean_orphan_works.py: Suppression Works sans chunks
- add_missing_work.py: Création Work manquant
- generate_schema_stats.py: Génération stats auto
- migrate_add_work_collection.py: Migration sûre Work collection

**Documentation**:
- WEAVIATE_GUIDE_COMPLET.md: Guide consolidé complet (600+ lignes)
- WEAVIATE_SCHEMA.md: Référence schéma rapide
- NETTOYAGE_COMPLETE_RAPPORT.md: Rapport nettoyage session
- ANALYSE_QUALITE_DONNEES.md: Analyse qualité initiale
- rapport_qualite_donnees.txt: Output brut vérification

**Résultats nettoyage**:
- Documents: 16 → 9 (7 doublons supprimés)
- Works: 0 → 9 (peuplé + nettoyé)
- Chunks: 5,404 → 5,230 (174 orphelins supprimés)
- chunksCount: Corrigés (231 → 5,230 déclaré = réel)
- Cohérence parfaite: 9 Works = 9 Documents = 9 œuvres

**Modifications code**:
- schema.py: Ajout Work collection avec vectorisation
- utils/weaviate_ingest.py: Support Work ingestion
- utils/word_pipeline.py: Désactivation concepts (problème .lower())
- utils/word_toc_extractor.py: Métadonnées Word correctes
- .gitignore: Exclusion fichiers temporaires (*.wav, output/*, NUL)

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-01 11:57:26 +01:00
parent 845ffb4b06
commit 04ee3f9e39
26 changed files with 6945 additions and 16 deletions

View File

@@ -0,0 +1,239 @@
# Analyse de la qualité des données Weaviate
**Date** : 01/01/2026
**Script** : `verify_data_quality.py`
**Rapport complet** : `rapport_qualite_donnees.txt`
---
## Résumé exécutif
Vous aviez raison : **il y a des incohérences majeures dans les données**.
**Problème principal** : Les 16 "documents" dans la collection Document sont en réalité **des doublons** de seulement 9 œuvres distinctes. Les chunks et summaries sont bien créés, mais pointent vers des documents dupliqués.
---
## Statistiques globales
| Collection | Objets | Note |
|------------|--------|------|
| **Work** | 0 | ❌ Vide (devrait contenir 9 œuvres) |
| **Document** | 16 | ⚠️ Contient des doublons (9 œuvres réelles) |
| **Chunk** | 5,404 | ✅ OK |
| **Summary** | 8,425 | ✅ OK |
**Œuvres uniques détectées** : 9 (via nested objects dans Chunks)
---
## Problèmes détectés
### 1. Documents dupliqués (CRITIQUE)
Les 16 documents contiennent des **doublons** :
| Document sourceId | Occurrences | Chunks associés |
|-------------------|-------------|-----------------|
| `peirce_collected_papers_fixed` | **4 fois** | 5,068 chunks (tous les 4 pointent vers les mêmes chunks) |
| `tiercelin_la-pensee-signe` | **3 fois** | 36 chunks (tous les 3 pointent vers les mêmes chunks) |
| `Haugeland_J._Mind_Design_III...` | **3 fois** | 50 chunks (tous les 3 pointent vers les mêmes chunks) |
| Autres documents | 1 fois chacun | Nombre variable |
**Impact** :
- La collection Document contient 16 objets au lieu de 9
- Les chunks pointent correctement vers les sourceId (pas de problème de côté Chunk)
- Mais vous avez des entrées Document redondantes
**Cause probable** :
- Ingestions multiples du même document (tests, ré-ingestions)
- Le script d'ingestion n'a pas vérifié les doublons avant insertion dans Document
---
### 2. Collection Work vide (BLOQUANT)
- **0 objets** dans la collection Work
- **9 œuvres uniques** détectées dans les nested objects des chunks
**Œuvres détectées** :
1. Mind Design III (John Haugeland et al.)
2. La pensée-signe (Claudine Tiercelin)
3. Collected papers (Charles Sanders Peirce)
4. La logique de la science (Charles Sanders Peirce)
5. The Fixation of Belief (C. S. Peirce)
6. AI: The Very Idea (John Haugeland)
7. Between Past and Future (Hannah Arendt)
8. On a New List of Categories (Charles Sanders Peirce)
9. Platon - Ménon (Platon)
**Recommandation** :
```bash
python migrate_add_work_collection.py # Crée la collection Work avec vectorisation
# Ensuite : script pour extraire les 9 œuvres uniques et les insérer dans Work
```
---
### 3. Incohérence Document.chunksCount (MAJEUR)
| Métrique | Valeur |
|----------|--------|
| Total déclaré (`Document.chunksCount`) | 731 |
| Chunks réels dans collection Chunk | 5,404 |
| **Différence** | **4,673 chunks non comptabilisés** |
**Cause** :
- Le champ `chunksCount` n'a pas été mis à jour lors des ingestions suivantes
- Ou les chunks ont été créés sans mettre à jour le document parent
**Impact** :
- Les statistiques affichées dans l'UI seront fausses
- Impossible de se fier à `chunksCount` pour savoir combien de chunks un document possède
**Solution** :
- Script de réparation pour recalculer et mettre à jour tous les `chunksCount`
- Ou accepter que ce champ soit obsolète et le recalculer à la volée
---
### 4. Summaries manquants (MOYEN)
**5 documents n'ont AUCUN summary** (ratio 0.00) :
- `The_fixation_of_beliefs` (1 chunk, 0 summaries)
- `AI-TheVery-Idea-Haugeland-1986` (1 chunk, 0 summaries)
- `Arendt_Hannah_-_Between_Past_and_Future_Viking_1968` (9 chunks, 0 summaries)
- `On_a_New_List_of_Categories` (3 chunks, 0 summaries)
**3 documents ont un ratio < 0.5** (peu de summaries) :
- `tiercelin_la-pensee-signe` : 0.42 (36 chunks, 15 summaries)
- `Platon_-_Menon_trad._Cousin` : 0.22 (50 chunks, 11 summaries)
**Cause probable** :
- Documents courts ou sans structure hiérarchique claire
- Problème lors de la génération des summaries (étape 9 du pipeline)
- Ou summaries intentionnellement non créés pour certains types de documents
---
## Analyse par œuvre
### ✅ Données cohérentes
**peirce_collected_papers_fixed** (5,068 chunks, 8,313 summaries) :
- Ratio Summary/Chunk : 1.64
- Nested objects cohérents ✅
- Work manquant dans collection Work ❌
### ⚠️ Problèmes mineurs
**tiercelin_la-pensee-signe** (36 chunks, 15 summaries) :
- Ratio faible : 0.42 (peu de summaries)
- Dupliqué 3 fois dans Document
**Platon - Ménon** (50 chunks, 11 summaries) :
- Ratio très faible : 0.22 (peu de summaries)
- Peut-être structure hiérarchique non détectée
### ⚠️ Documents courts sans summaries
**The_fixation_of_beliefs**, **AI-TheVery-Idea**, **On_a_New_List_of_Categories**, **Arendt_Hannah** :
- 1 à 9 chunks seulement
- 0 summaries
- Peut-être trop courts pour avoir des chapitres/sections
---
## Recommandations d'action
### Priorité 1 : Nettoyer les doublons Document
**Problème** : 16 documents au lieu de 9 (7 doublons)
**Solution** :
1. Créer un script `clean_duplicate_documents.py`
2. Pour chaque sourceId, garder **un seul** objet Document (le plus récent)
3. Supprimer les doublons
4. Recalculer les `chunksCount` pour les documents restants
**Impact** : Réduction de 16 → 9 documents
---
### Priorité 2 : Peupler la collection Work
**Problème** : Collection Work vide (0 objets)
**Solution** :
1. Exécuter `migrate_add_work_collection.py` (ajoute vectorisation)
2. Créer un script `populate_work_collection.py` :
- Extraire les 9 œuvres uniques depuis les nested objects des chunks
- Insérer dans la collection Work
- Optionnel : lier les documents aux Works via cross-reference
**Impact** : Collection Work peuplée avec 9 œuvres
---
### Priorité 3 : Recalculer Document.chunksCount
**Problème** : Incohérence de 4,673 chunks (731 déclaré vs 5,404 réel)
**Solution** :
1. Créer un script `fix_chunks_count.py`
2. Pour chaque document :
- Compter les chunks réels (via filtrage Python comme dans verify_data_quality.py)
- Mettre à jour le champ `chunksCount`
**Impact** : Métadonnées correctes pour statistiques UI
---
### Priorité 4 (optionnelle) : Regénérer summaries manquants
**Problème** : 5 documents sans summaries, 3 avec ratio < 0.5
**Solution** :
- Analyser si c'est intentionnel (documents courts)
- Ou ré-exécuter l'étape de génération de summaries (étape 9 du pipeline)
- Peut nécessiter ajustement des seuils (ex: nombre minimum de chunks pour créer summary)
**Impact** : Meilleure recherche hiérarchique
---
## Scripts à créer
1. **`clean_duplicate_documents.py`** - Nettoyer doublons (Priorité 1)
2. **`populate_work_collection.py`** - Peupler Work depuis nested objects (Priorité 2)
3. **`fix_chunks_count.py`** - Recalculer chunksCount (Priorité 3)
4. **`regenerate_summaries.py`** - Optionnel (Priorité 4)
---
## Conclusion
Vos suspicions étaient correctes : **les œuvres ne se retrouvent pas dans les 4 collections de manière cohérente**.
**Problèmes principaux** :
1. ❌ Work collection vide (0 au lieu de 9)
2. ⚠️ Documents dupliqués (16 au lieu de 9)
3. ⚠️ chunksCount obsolète (4,673 chunks non comptabilisés)
4. ⚠️ Summaries manquants pour certains documents
**Bonne nouvelle** :
- ✅ Les chunks et summaries sont bien créés et cohérents
- ✅ Les nested objects sont cohérents (pas de conflits title/author)
- ✅ Pas de données orphelines (tous les chunks/summaries ont un document parent)
**Next steps** :
1. Décider quelle priorité nettoyer en premier
2. Je peux créer les scripts de nettoyage si vous le souhaitez
3. Ou vous pouvez les créer vous-même en vous inspirant de `verify_data_quality.py`
---
**Fichiers générés** :
- `verify_data_quality.py` - Script de vérification
- `rapport_qualite_donnees.txt` - Rapport complet détaillé
- `ANALYSE_QUALITE_DONNEES.md` - Ce document (résumé)