# Procédure d'extraction — gazetteer paranames ## Vue d'ensemble Le script `scripts/build_paranames_gazetteer.py` télécharge le dataset paranames depuis HuggingFace, filtre les entités de type PER, normalise les noms (NFKD UPPERCASE A-Z) et produit deux gazetteers compressés. ## Pré-requis - Python ≥ 3.10 - Venv du projet activé : `source .venv/bin/activate` - Paquets : `datasets`, `huggingface_hub`, `pyarrow`, `pandas` (déjà présents dans `requirements.txt`). - Connexion réseau pour le premier téléchargement (~1.33 GB). - ~3 GB de cache HuggingFace disponibles. - ~1 GB de RAM (le script lit le parquet par batches de 64 K lignes). ## Lancement ```bash cd /home/dom/ai/anonymisation source .venv/bin/activate python scripts/build_paranames_gazetteer.py ``` Options : - `--hf-cache /chemin` : forcer un cache custom (défaut : `~/.cache/huggingface`). - `--limit N` : ne traiter que N lignes (debug uniquement). ## Étapes internes du script 1. **Téléchargement** via `huggingface_hub.hf_hub_download` du parquet `data/train.parquet` du repo `imvladikon/paranames`. Le cache HF est réutilisé (idempotent). 2. **Chargement** du BDPM stop-words (`data/bdpm/medicaments_stopwords.txt`, 7 312 tokens normalisés en UPPER A-Z) pour filtrer les noms qui sont en fait des médicaments. 3. **Itération par batches** (`pyarrow.parquet.ParquetFile.iter_batches`) sur les colonnes `name` et `type` uniquement. Filtre `type == "PER"`. 4. **Split** de chaque `name` sur espaces et séparateurs courants (`SPLIT_CHARS`). 5. **Heuristique nom/prénom** : - dernier token → **nom de famille candidat** - tokens précédents → **prénoms candidats** - cas mononyme (1 seul token) : considéré comme nom de famille. 6. **Normalisation** : NFKD → strip diacritiques → UPPER → conserver uniquement A-Z (chars latins de base). 7. **Filtres anti-bruit** : - longueur ≥ 3 caractères - longueur ≤ 25 caractères - non présent dans la BDPM stop-words. 8. **Écriture** triée alphabétique en `.txt.gz` compresslevel=9. ## Volumes attendus (ordre de grandeur) - Lignes parquet totales : ~124 M - Lignes PER après filtre : ~82 M - Noms famille uniques (après dédup + normalisation) : quelques centaines de milliers à quelques millions. - Prénoms uniques : idem. ## Régénération (mise à jour) Si une nouvelle version de paranames est publiée, supprimer le cache HF correspondant : ```bash rm -rf ~/.cache/huggingface/datasets--imvladikon--paranames/ python scripts/build_paranames_gazetteer.py ``` ou supprimer simplement les `.txt.gz` cibles et relancer (le download réutilise le cache si la version est inchangée). ## Vérification rapide ```bash zcat data/paranames/noms_famille_world.txt.gz | wc -l zcat data/paranames/prenoms_world.txt.gz | wc -l zcat data/paranames/noms_famille_world.txt.gz | grep -E "^(OYARCABAL|EJNAINI|NGUYEN|SCHMIDT|OBAMA)$" ``` ## Licence paranames est sous **CC BY 4.0**. Les fichiers dérivés (`*.txt.gz`) héritent de cette licence et doivent être redistribués avec attribution (voir README.md).