🗒️ Contexte : Les documents contiennent des informations personnelles identifiables (PII) qui doivent être pseudonymisées et/ou chiffrées avant d'être stockées dans un EDS afin de respecter les conformités européennes (RGPD) et EDS (Référentiel EDS).
*"La pseudonymisation est un traitement de données personnelles réalisé de manière à ce qu'on ne puisse plus attribuer les données à une personne physique identifiée sans information supplémentaire. En pratique, la pseudonymisation consiste à remplacer les données directement identifiantes (nom, prénoms, etc.) d'un jeu de données par des données indirectement identifiantes (alias, numéro séquentiel, etc.)." *CNIL
Arkhn a développé sa bibliothèque NLP basée sur le modèle CamemBERT : Lighter.
Lighter contient un algorithme de pseudonymisation qui détecte les informations identifiantes et les pseudonymise par remplacement, c'est-à -dire en attribuant une nouvelle valeur du même type.
Exemple :
Détection des informations identifiantes
Découverte d'un cancer de l'estomac chez Albert Martin[NOM+PRÉNOM],
né le 4 mars 1988[DATE DE NAISSANCE],
lors d'une consultation le 1er janvier 2025[DATE].
Remplacement
Découverte d'un cancer de l'estomac chez James Wilson,
né en 1988[ANNÉE DE NAISSANCE],
lors d'une consultation le 1er janvier 2025.
Remarque : Un traitement spécifique est appliqué aux dates de naissance afin de conserver l'année, donnée autorisée par la CNIL.
NB: Lighter est remplacé par Nerd.
La pseudonymisation est effectuée sur les **documents **selon le workflow suivant :

- Les documents sont d'abord ingérés sur la plateforme (dans Minio) grâce à un asset d'injection** **orchestré par Dagster. Une traçabilité est faite dans la table ClickHouse etl.etl_doc_injected.
- Ils sont ensuite traités par un ou plusieurs assets Dagster nommés les** assets d'extraction****. Leur rôle est de lancer l'image Docker arkhn/text-extraction **qui pseudonymise les documents grâce à la librairie Lighter. Le résultat est alors stocké dans la table etl.etl_doc_extracted. Une version chiffrée du texte original est aussi générée et stockée dans une colonne adjointe au texte pseudonymisé.
Ainsi, la table etl.etl_doc_extracted obtenue a le format suivant :
| **doc_id** |
**pseudo_text** |
**encrypted_text** |
**partition_date** |
**TEXT_EXTRACTION_VERSION** |
| Identifiant du document |
Texte pseudonymisé |
Texte original chiffré *(champ illisible)* |
Date d'ingestion |
Version de l'algorithme |
Ce processus est intégré dans le pipeline de données en Python et orchestré par **Dagster**.
> **💡** **Observation : **L'ajout de GPUs est important pour la pseudonymisation. Nos expériences ont montré que cela réduit drastiquement le temps de traitement (passage de CPUs à 4 GPU V40 ⇒ réduction de 30 fois du temps de traitement).
## 4. Paramètres
Selon votre source de données, différentes tables de métadonnées doivent être remplies. Pour en savoir plus, veuillez vous référez à la [documentation de Dagster](https://github.com/arkhn/dagster/blob/main/docs/CONFIGURATION.md) et au information ci-après:
- **EASILY** : avoir la table des métadonnées cf [https://github.com/arkhn/codex/blob/7bf1c9c8d67304b1854861b9741cf3d688a2eed9/models/source/easily/staging/document/easily_stg_metadone_metadone_documents.sql#L15](https://github.com/arkhn/codex/blob/7bf1c9c8d67304b1854861b9741cf3d688a2eed9/models/source/easily/staging/document/easily_stg_metadone_metadone_documents.sql#L15)
- **DXCARE** : avoir la table des métadonnées cf [https://github.com/arkhn/codex/blob/7bf1c9c8d67304b1854861b9741cf3d688a2eed9/models/source/dxcare/staging/dxcare_stg_document_sources.sql#L4](https://github.com/arkhn/codex/blob/7bf1c9c8d67304b1854861b9741cf3d688a2eed9/models/source/dxcare/staging/dxcare_stg_document_sources.sql#L4)
- ORBIS :
**Minio : Intégration de documents depuis un bucket **
Il est également possible de lancer la pipeline d'extraction du texte sur des documents déposés dans un bucket Minio.
Cette méthode nécessite d'envoyer les documents dans le bucket.
Pour cela, paramétrer les variables suivantes :
- MINIO_DOC_ACTIVATED = true
| Nom |
Valeur par défault |
**description** |
| `MINIO_BUCKET_NAME` |
`""` |
Nom du bucket |
| `MINIO_KEEP_DOCS` |
`true` |
Boolean pour choisir de garder les documents |
| `MINIO_NB_PROCESSES_EXTRACTION` |
`1` |
Possibilité de parralleliser le job (utile surtout en CPU) |
| `MINIO_ENABLE_PSEUDO` |
`false` |
Activer la pseudonymisation |
## 5. Reprise d'historique
Nous vous conseillons de lancer les partitions en parallèle. Pour cela :
1. Allez dans `lineage`
2. Filtrez sur `group:etl`
3. Cliquez sur les assets souhaitées
4. `Materialize selected`
5. Cliquez sur `all` puis `custom` pour choisir la plage de dates (2 mois par exemple)
6. Cliquez quelque part sur la popup pour actualiser le nombre de partitions
7. Ajoutez du parralélisme (10 run par 10) avec le tag `job_type:realtime` (nom peu adéquat, nous changerons ça) :

1. Les dates se lanceront 10 par 10 jusqu'Ă finir les 2 mois.