presidio modulaire

This commit is contained in:
nBiqoz
2025-09-07 12:29:08 +02:00
parent 85d95d05e5
commit c62e5b92d5
42 changed files with 1802 additions and 324 deletions

View File

@@ -0,0 +1,19 @@
# Liste blanche - termes à ne pas anonymiser
allow_list:
# Références légales
- Loi
- Code
- Règlement
- Décret
- Arrêté
- BCE
- TVA
- IEC
- expert-comptable
# Termes financiers
- Euro
- EUR
- Euros
- Taux
- Valeur
- Prix

View File

@@ -0,0 +1,82 @@
# Configuration d'anonymisation complète
anonymizer_config:
default_anonymizers:
# Entités génériques
PERSON: replace
LOCATION: replace
ORGANIZATION: replace
DATE_TIME: replace
MONEY: replace
EMAIL_ADDRESS: replace
IBAN: replace
IP_ADDRESS: replace
# PII Génériques - Données sensibles RGPD
HEALTH_DATA: replace
BIOMETRIC_DATA: replace
SEXUAL_ORIENTATION: replace
POLITICAL_OPINIONS: replace
RGPD_FINANCIAL_DATA: replace
# PII Belges
BE_ENTERPRISE_NUMBER: replace
BE_NATIONAL_REGISTER_NUMBER: replace
BE_PHONE_NUMBER: replace
BE_ADDRESS: replace
BE_ID_CARD: replace
BE_PASSPORT: replace
# PII Françaises
FR_SOCIAL_SECURITY_NUMBER: replace
FR_SIRET: replace
FR_ADDRESS: replace
FR_TAX_ID: replace
FR_BANK_ACCOUNT: replace
FR_ID_CARD: replace
FR_PASSPORT: replace
FR_DRIVER_LICENSE: replace
# Business
BE_PROFESSIONAL_ID: replace
MARKET_SHARE: replace
replacements:
# Entités génériques
PERSON: "[PERSONNE]"
LOCATION: "[LIEU]"
ORGANIZATION: "[ORGANISATION]"
DATE_TIME: "[DATE]"
MONEY: "[MONTANT]"
EMAIL_ADDRESS: "[EMAIL]"
IBAN: "[IBAN]"
IP_ADDRESS: "[ADRESSE_IP]"
# PII Génériques - Données sensibles RGPD
HEALTH_DATA: "[DONNEES_SANTE]"
BIOMETRIC_DATA: "[DONNEES_BIOMETRIQUES]"
SEXUAL_ORIENTATION: "[ORIENTATION_SEXUELLE]"
POLITICAL_OPINIONS: "[OPINIONS_POLITIQUES]"
RGPD_FINANCIAL_DATA: "[DONNEES_FINANCIERES]"
# PII Belges
BE_ENTERPRISE_NUMBER: "[ENTREPRISE_BELGE]"
BE_NATIONAL_REGISTER_NUMBER: "[NRN_BELGE]"
BE_PHONE_NUMBER: "[TELEPHONE_BE]"
BE_ADDRESS: "[ADRESSE_BELGE]"
BE_ID_CARD: "[CARTE_ID_BE]"
BE_PASSPORT: "[PASSEPORT_BE]"
# PII Françaises
FR_SOCIAL_SECURITY_NUMBER: "[NUM_SECU_FR]"
FR_SIRET: "[SIRET_FR]"
FR_ADDRESS: "[ADRESSE_FR]"
FR_TAX_ID: "[NUM_FISCAL_FR]"
FR_BANK_ACCOUNT: "[COMPTE_BANCAIRE_FR]"
FR_ID_CARD: "[CARTE_ID_FR]"
FR_PASSPORT: "[PASSEPORT_FR]"
FR_DRIVER_LICENSE: "[PERMIS_FR]"
# Business
BE_PROFESSIONAL_ID: "[ID_PROFESSIONNEL_BE]"
MARKET_SHARE: "[PART_DE_MARCHE]"

View File

@@ -1,227 +0,0 @@
# =======================
# CONFIGURATION PRESIDIO
# =======================
supported_languages: [en, fr]
nlp_configuration:
nlp_engine_name: spacy
models:
- lang_code: en
model_name: en_core_web_lg
- lang_code: fr
model_name: fr_core_news_lg
ner_model_configuration:
labels_to_ignore:
- LOCATION
- MISC
- CARDINAL
- EVENT
- LANGUAGE
- LAW
- ORDINAL
- PERCENT
- PRODUCT
- QUANTITY
- WORK_OF_ART
confidence_thresholds:
DEFAULT_CONFIDENCE: 0.85
PERSON: 0.85
ORGANIZATION: 0.55
recognizer_registry:
load_predefined_recognizers: true
recognizers:
- name: FlexibleDateRecognizer
supported_language: fr
supported_entity: FLEXIBLE_DATE
patterns:
- name: Date format JJ mois AAAA
regex: "\\b(0?[1-9]|[12][0-9]|3[01])\\s+(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)\\s+(19|20)\\d{2}\\b"
score: 1.0
- name: Date format JJ/MM/AAAA
regex: "\\b(0[1-9]|[12][0-9]|3[01])[-/.](0[1-9]|1[012])[-/.](19|20)\\d{2}\\b"
score: 1.0
context: ["date", "né le", "signé le", "incident du"]
- name: BelgianAddressRecognizer
supported_language: fr
supported_entity: BE_ADDRESS
patterns:
- name: Adresse Belge complète
regex: "\\b(?:\\d{1,4}[A-Za-z]?(?:\\s*,)?\\s+)?(?:Avenue|Rue|Boulevard|Chaussée|Place|Quai|Impasse|Drève)(?:\\s+(?:de|la|le|d'|des))?(?:\\s+[A-Z][a-zà-ÿ'-]+)+,?(?:\\s+\\d{1,4}[A-Za-z]?)?,\\s*\\d{4}\\s+[A-Za-zà-ÿ'-]+"
score: 1.0
context: ["demeurant", "adresse", "siège social", "bureaux situés"]
- name: BelgianPhoneRecognizer
supported_language: fr
supported_entity: BE_PHONE_NUMBER
patterns:
- name: Numéro téléphone Belge (fixe ou mobile)
regex: "\\b0[1-9](?:[./\\s]?\\d{2,3}){3}\\b"
score: 0.95
context: ["Tel", "Tél", "téléphone", "gsm", "mobile"]
- name: SmartOrganizationRecognizer
supported_language: fr
supported_entity: ORGANIZATION
patterns:
- name: Nom + Forme légale (DigitalConsult SPRL)
regex: "\\b([A-Z][a-zà-ÿ]+(?:\\s[A-Z][a-zà-ÿ]+)*)\\s+(SPRL|SRL|SA|SCS|SNC)\\b"
score: 0.9
- name: Forme légale + Nom (SPRL DigitalConsult)
regex: "\\b(SPRL|SRL|SA|SCS|SNC)\\s+([A-Z][a-zà-ÿ]+(?:\\s[A-Z][a-zà-ÿ]+)*)\\b"
score: 0.9
context: ["société", "entreprise", "gérant de la"]
- name: ProfessionalIdRecognizer
supported_language: fr
supported_entity: BE_PRO_ID
patterns:
- name: Numéro IEC
regex: "(n°\\sIEC:?|IEC:?)\\s*\\d{6}"
score: 1.0
context: ["expert-comptable"]
- name: BelgianEnterpriseRecognizer
supported_language: fr
supported_entity: BE_ENTERPRISE_NUMBER
patterns:
- name: Numéro BCE/TVA Belge (avec ou sans BE)
regex: "\\b(BE)?\\s?0?\\d{3}[\\.\\s]?\\d{3}[\\.\\s]?\\d{3}\\b"
score: 1.0
context: ["BCE", "TVA", "intracommunautaire"]
- name: EmailRecognizer
supported_language: fr
supported_entity: EMAIL_ADDRESS
patterns:
- name: Email Pattern
regex: "\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b"
score: 1.0
context: ["email", "courriel", "mail"]
- name: IbanRecognizer
supported_language: fr
supported_entity: IBAN
patterns:
- name: IBAN Pattern
regex: "\\b[A-Z]{2}[0-9]{2}(?:\\s[0-9]{4}){3}\\b"
score: 1.0
context: ["iban", "compte"]
- name: BelgianNRNRecognizer
supported_language: fr
supported_entity: BE_NATIONAL_REGISTER_NUMBER
patterns:
- name: NRN Pattern
regex: "\\b[0-9]{2}\\.[0-9]{2}\\.[0-9]{2}-[0-9]{3}\\.[0-9]{2}\\b"
score: 1.0
context: ["registre national"]
- name: FrenchINSEERecognizer
supported_language: fr
supported_entity: FR_SOCIAL_SECURITY_NUMBER
patterns:
- name: INSEE Pattern with flexible spaces
regex: "\\b[12]\\s*[0-9]{2}\\s*(?:0[1-9]|1[0-2])\\s*(?:2[ABab]|[0-9]{2})\\s*[0-9]{3}\\s*[0-9]{3}[\\s]?[0-9]{2}\\b"
score: 0.95
context: ["sécurité sociale", "insee", "nir"]
- name: IpAddressRecognizer
supported_language: fr
supported_entity: IP_ADDRESS
patterns:
- name: IPv4
regex: "\\b(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\b"
score: 1.0
- name: IPv6
regex: "\\b([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\b"
score: 0.9
allow_list:
- Adresse
- ADRESSE
- Contrat
- Document
- Société
- Investisseur
- Montant
- Prêt
- Intérêt
- Partie
- Parties
- Annexe
- Remboursement
- Conversion
- Financement
- Sortie
- "Juste Valeur Marchande"
- Échéance
- Clause
- Clauses
- Principe
- Coûts
- Notifications
- Article
- Paragraphe
- Directeur
- Gérant
- Président
- DocuSign
- SPRL
- SA
- Loi
- Code
- Règlement
- Décret
- Arrêté
- Euro
- EUR
- Euros
- Taux
- Valeur
- Prix
- Coordonnées
- Témoins
- "Coordonnées bancaires"
- "Témoins clés"
- "montrent"
- "montrent des"
- "montrent des irrégularités"
- "bénéficiaire"
anonymizer_config:
default_anonymizers:
PERSON: replace
LOCATION: replace
ORGANIZATION: replace
DATE_TIME: replace
MONEY: replace
EMAIL_ADDRESS: replace
IBAN: replace
BE_ENTERPRISE_NUMBER: replace
BE_NATIONAL_REGISTER_NUMBER: replace
FR_SOCIAL_SECURITY_NUMBER: replace
BE_PHONE_NUMBER: replace
FLEXIBLE_DATE: replace
BE_ADDRESS: replace
BE_PRO_ID: replace
IP_ADDRESS: replace
replacements:
PERSON: "<PERSONNE>"
LOCATION: "<LIEU>"
ORGANIZATION: "<ORGANISATION>"
DATE_TIME: "<DATE>"
MONEY: "<MONTANT>"
EMAIL_ADDRESS: "<EMAIL>"
IBAN: "<IBAN>"
BE_ENTERPRISE_NUMBER: "<NUM_ENTREPRISE_BE>"
BE_NATIONAL_REGISTER_NUMBER: "<NRN_BELGE>"
FR_SOCIAL_SECURITY_NUMBER: "<NUM_SECU_FR>"
BE_PHONE_NUMBER: "<TELEPHONE_BE>"
FLEXIBLE_DATE: "<DATE>"
BE_ADDRESS: "<ADRESSE_BELGE>"
BE_PRO_ID: "<ID_PROFESSIONNEL>"
IP_ADDRESS: "<ADRESSE_IP>"

30
conf/main.yaml Normal file
View File

@@ -0,0 +1,30 @@
# =======================
# CONFIGURATION PRESIDIO MODULAIRE
# =======================
# Langues supportées
supported_languages: [en, fr]
default_language: fr
# Inclusion des modules de configuration
includes:
# Configuration NLP (spaCy préservée)
- nlp/spacy_config.yaml
# Recognizers PII par dossier (garder uniquement les dossiers récents)
- recognizers/PII/belgian/*
- recognizers/PII/french/*
- recognizers/PII/generic/*
# Recognizers Business par dossier
- recognizers/Business/belgian/*
- recognizers/Business/french/*
# Configuration d'anonymisation
- anonymization/*
# Configuration globale simplifiée
global_settings:
version: "2.0.0"
cache_enabled: true
timeout_seconds: 30

View File

@@ -0,0 +1,33 @@
nlp_configuration:
nlp_engine_name: spacy
models:
- lang_code: en
model_name: en_core_web_lg
- lang_code: fr
model_name: fr_core_news_lg
# Configuration NER globale (sans confidence_thresholds)
ner_model_configuration:
model_to_presidio_entity_mapping:
PER: PERSON
PERSON: PERSON
ORG: ORGANIZATION
ORGANIZATION: ORGANIZATION
LOC: LOCATION
LOCATION: LOCATION
DATE: DATE_TIME
TIME: DATE_TIME
MISC: DATE_TIME
labels_to_ignore:
- LOCATION
- MISC
- CARDINAL
- EVENT
- LANGUAGE
- LAW
- ORDINAL
- PERCENT
- PRODUCT
- QUANTITY
- WORK_OF_ART
low_score_entity_names: []

View File

@@ -0,0 +1,24 @@
# Recognizer pour numéros d'entreprise belges
recognizer_registry:
recognizers:
- name: BelgianEnterpriseRecognizer
supported_language: fr
supported_entity: BE_ENTERPRISE_NUMBER
patterns:
- name: Numéro BCE avec deux points
regex: "(?<=\\bBCE\\s*:\\s*)((BE)?\\s?0\\d{3}[\\.\\s]?\\d{3}[\\.\\s]?\\d{3})\\b"
score: 1.0
- name: Numéro TVA avec deux points
regex: "(?<=\\bTVA\\s*:\\s*)(BE\\d{4}\\.\\d{3}\\.\\d{3})\\b"
score: 1.0
- name: Numéro d'entreprise général
regex: "(?<!(?:BCE|TVA)\\s*:\\s*)\\b(BE)?\\s?0\\d{3}[\\.\\s]?\\d{3}[\\.\\s]?\\d{3}\\b"
score: 0.9
- name: Numéro ONSS
regex: "\\bONSS\\s*:?\\s*\\d{7}\\b"
score: 0.95
- name: Numéro patronal
regex: "\\b(?:numéro\\s+)?patronal\\s*:?\\s*\\d{7}\\b"
score: 0.9
context:
["TVA", "intracommunautaire", "ONSS", "entreprise", "patronal"]

View File

@@ -0,0 +1,28 @@
# Recognizer pour noms d'organisations belges
recognizer_registry:
recognizers:
- name: SmartOrganizationRecognizer
supported_language: fr
supported_entity: ORGANIZATION
patterns:
# Noms avec suffixes typiques d'entreprise
- name: Noms entreprise avec suffixes
regex: "\\b([A-Z][a-zA-Zà-ÿ]+(?:Consult|Tech|Soft|Digital|Solutions|Services|Group|Corp|Company|Systems|Data|Cloud|Web|Net|Info|Cyber|Smart|Pro|Expert|Plus|Max|Global|International|Europe|Belgium|Brussels|Wallonie|Flandre))\\b(?!\\s*\\([^)]*(?:BCE|TVA)[^)]*\\))"
score: 0.9
# Formes légales complètes avec nom d'entreprise
- name: Formes légales complètes
regex: "\\b((?:SPRL|SRL|SA|ASBL|SCS|SNC)\\s+[A-Z][a-zA-Zà-ÿ]+(?:\\s+[A-Z][a-zA-Zà-ÿ]+)*)(?!\\s*\\([^)]*(?:BCE|TVA)[^)]*\\))"
score: 0.95
# Noms d'entreprise avec contexte spécifique (garder pour autres cas)
- name: Noms avec contexte entreprise
regex: "(?<=\\b(?:société|entreprise)\\s+)([A-Z][a-zA-Zà-ÿ]+(?:\\s+[A-Z][a-zA-Zà-ÿ]+)*)(?!\\s*\\([^)]*(?:BCE|TVA)[^)]*\\))"
score: 0.85
# Noms précédés de "gérant de la"
- name: Noms après gérant
regex: "(?<=gérant\\s+de\\s+la\\s+)([A-Z][a-zA-Zà-ÿ]+(?:\\s+[A-Z][a-zA-Zà-ÿ]+)*)(?!\\s*\\([^)]*(?:BCE|TVA)[^)]*\\))"
score: 0.8
context: ["société", "entreprise", "gérant de la", "administrateur"]

View File

@@ -0,0 +1,20 @@
# Recognizer pour identifiants professionnels belges
recognizer_registry:
recognizers:
- name: BelgianProfessionalIdRecognizer
supported_language: fr
supported_entity: BE_PROFESSIONAL_ID
patterns:
- name: Numéro IEC avec deux points
regex: "(?<=\\bIEC\\s*:\\s*)\\d{6}\\b"
score: 1.0
- name: Numéro IEC général
regex: "(?<!IEC\\s*:\\s*)\\b(?:n°\\s*)?IEC\\s*:?\\s*\\d{6}\\b"
score: 0.9
- name: Numéro d'avocat
regex: "\\b(?:avocat\\s+)?n°\\s*\\d{4,6}\\b"
score: 0.8
- name: Numéro de médecin
regex: "\\b(?:Dr\\.|médecin)\\s*n°\\s*\\d{5,7}\\b"
score: 0.85
context: ["expert-comptable", "IEC", "avocat", "médecin", "professionnel"]

View File

@@ -0,0 +1,17 @@
# Recognizer pour SIRET/SIREN français
recognizer_registry:
recognizers:
- name: FrenchSIRETRecognizer
supported_language: fr
supported_entity: FR_SIRET
patterns:
- name: SIRET complet
regex: "\\b[0-9]{3}\\s?[0-9]{3}\\s?[0-9]{3}\\s?[0-9]{5}\\b"
score: 0.9
- name: SIREN
regex: "\\b[0-9]{3}\\s?[0-9]{3}\\s?[0-9]{3}\\b"
score: 0.85
- name: SIRET avec espaces
regex: "\\bSIRET\\s*:?\\s*[0-9]{3}\\s[0-9]{3}\\s[0-9]{3}\\s[0-9]{5}\\b"
score: 0.95
context: ["SIRET", "SIREN", "établissement", "entreprise", "société"]

View File

@@ -0,0 +1,34 @@
# Recognizer pour parts de marché
recognizer_registry:
recognizers:
- name: MarketShareRecognizer
supported_language: fr
supported_entity: MARKET_SHARE
patterns:
# Pourcentages de marché
- name: Market Share Percentage
regex: "\\b(?:détient|possède|contrôle|représente)?\\s*(?:environ\\s+)?(?:\\d{1,2}(?:[,.]\\d{1,2})?%)\\s*(?:de\\s+(?:part\\s+de\\s+)?marché|du\\s+marché|de\\s+parts?)\\b"
score: 0.9
# Positions de marché
- name: Market Position
regex: "\\b(?:leader|numéro\\s+\\d+|\\d+(?:er|ème)\\s+acteur|position\\s+dominante|monopole)\\s+(?:du\\s+)?(?:marché|secteur)\\b"
score: 0.85
# Parts relatives
- name: Relative Market Share
regex: "\\b(?:majoritaire|minoritaire|principale|significative)\\s+(?:part\\s+de\\s+)?marché\\b"
score: 0.8
# Données de concentration
- name: Market Concentration
regex: "\\b(?:concentration|consolidation|fusion)\\s+(?:du\\s+)?marché\\b"
score: 0.75
# Chiffres d'affaires relatifs
- name: Revenue Share
regex: "\\b(?:\\d{1,2}(?:[,.]\\d{1,2})?%)\\s*(?:du\\s+)?(?:chiffre\\s+d'affaires|CA|revenus?)\\s+(?:du\\s+)?(?:marché|secteur)\\b"
score: 0.85
context:
["part de marché", "position concurrentielle", "leader", "concurrent", "secteur", "industrie", "chiffre d'affaires", "revenus", "concentration", "monopole", "oligopole"]

View File

@@ -0,0 +1,44 @@
# Recognizer pour adresses belges complètes
recognizer_registry:
recognizers:
- name: BelgianAddressRecognizer
supported_language: fr
supported_entity: BE_ADDRESS
patterns:
# Pattern principal : numéro + rue + code postal + ville (SANS contexte)
- name: Adresse complète avec numéro devant
regex: "\\b\\d{1,4}[A-Za-z]?\\s+(?:Avenue|Rue|Boulevard|Chaussée|Place|Quai|Impasse|Drève|Clos|Allée)\\s+(?:de\\s+la\\s+|de\\s+|du\\s+|des\\s+|d'|la\\s+|le\\s+)?[A-ZÀ-Ÿ][a-zà-ÿ'-]+(?:\\s+[A-ZÀ-Ÿ][a-zà-ÿ'-]+)*\\s*,\\s*[1-9]\\d{3}\\s+[A-ZÀ-Ÿ][a-zà-ÿ'-]+(?:\\s+[A-ZÀ-Ÿ][a-zà-ÿ'-]+)*"
score: 1.0
# Pattern avec lookbehind positif pour exclure "demeurant" de la capture
- name: Adresse après contexte demeurant
regex: "(?<=\\bdemeurant\\s)\\d{1,4}[A-Za-z]?\\s+(?:Avenue|Rue|Boulevard|Chaussée|Place|Quai|Impasse|Drève|Clos|Allée)\\s+(?:de\\s+la\\s+|de\\s+|du\\s+|des\\s+|d'|la\\s+|le\\s+)?[A-ZÀ-Ÿ][a-zà-ÿ'-]+(?:\\s+[A-ZÀ-Ÿ][a-zà-ÿ'-]+)*\\s*,\\s*[1-9]\\d{3}\\s+[A-ZÀ-Ÿ][a-zà-ÿ'-]+(?:\\s+[A-ZÀ-Ÿ][a-zà-ÿ'-]+)*"
score: 1.0
# Pattern avec lookbehind pour autres contextes
- name: Adresse après contexte résidant
regex: "(?<=\\b(?:résidant|domicilié|habite|situé)\\s)\\d{1,4}[A-Za-z]?\\s+(?:Avenue|Rue|Boulevard|Chaussée|Place|Quai|Impasse|Drève|Clos|Allée)\\s+(?:de\\s+la\\s+|de\\s+|du\\s+|des\\s+|d'|la\\s+|le\\s+)?[A-ZÀ-Ÿ][a-zà-ÿ'-]+(?:\\s+[A-ZÀ-Ÿ][a-zà-ÿ'-]+)*\\s*,\\s*[1-9]\\d{3}\\s+[A-ZÀ-Ÿ][a-zà-ÿ'-]+(?:\\s+[A-ZÀ-Ÿ][a-zà-ÿ'-]+)*"
score: 1.0
# Pattern avec lookbehind pour contexte bureaux
- name: Adresse après contexte bureaux
regex: "(?<=\\b(?:dans les bureaux situés|siège social situé)\\s)\\d{1,4}[A-Za-z]?\\s+(?:Avenue|Rue|Boulevard|Chaussée|Place|Quai|Impasse|Drève|Clos|Allée)\\s+(?:de\\s+la\\s+|de\\s+|du\\s+|des\\s+|d'|la\\s+|le\\s+)?[A-ZÀ-Ÿ][a-zà-ÿ'-]+(?:\\s+[A-ZÀ-Ÿ][a-zà-ÿ'-]+)*\\s*,\\s*[1-9]\\d{3}\\s+[A-ZÀ-Ÿ][a-zà-ÿ'-]+(?:\\s+[A-ZÀ-Ÿ][a-zà-ÿ'-]+)*"
score: 0.9
# Pattern alternatif : rue + numéro + ville (format classique)
- name: Adresse format classique
regex: "\\b(?:Avenue|Rue|Boulevard|Chaussée|Place|Quai|Impasse|Drève|Clos|Allée)\\s+(?:de\\s+la\\s+|de\\s+|du\\s+|des\\s+|d'|la\\s+|le\\s+)?[A-ZÀ-Ÿ][a-zà-ÿ'-]+(?:\\s+[A-ZÀ-Ÿ][a-zà-ÿ'-]+)*(?:\\s*,?\\s*\\d{1,4}[A-Za-z]?)?\\s*,\\s*[1-9]\\d{3}\\s+[A-ZÀ-Ÿ][a-zà-ÿ'-]+(?:\\s+[A-ZÀ-Ÿ][a-zà-ÿ'-]+)*"
score: 0.8
context:
[
"demeurant",
"résidant",
"domicilié",
"habite",
"situé au",
"sis à",
"dans les bureaux situés",
"siège social",
"adresse",
]

View File

@@ -0,0 +1,26 @@
# Recognizer pour documents belges
recognizer_registry:
recognizers:
- name: BelgianIDCardRecognizer
supported_language: fr
supported_entity: BE_ID_CARD
patterns:
- name: Carte d'identité belge
regex: "\\b[0-9]{3}\\-[0-9]{7}\\-[0-9]{2}\\b"
score: 0.95
- name: eID compact
regex: "\\b[0-9]{12}\\b"
score: 0.8
context: ["carte d'identité", "eID", "identiteitskaart", "pièce d'identité"]
- name: BelgianPassportRecognizer
supported_language: fr
supported_entity: BE_PASSPORT
patterns:
- name: Passeport belge
regex: "\\b[A-Z]{2}[0-9]{6}\\b"
score: 0.95
- name: Passeport avec espaces
regex: "\\b[A-Z]{2}\\s[0-9]{6}\\b"
score: 0.9
context: ["passeport", "passport", "paspoort", "document de voyage"]

View File

@@ -0,0 +1,25 @@
# Recognizer pour numéro de registre national belge
recognizer_registry:
recognizers:
- name: BelgianNRNRecognizer
supported_language: fr
supported_entity: BE_NATIONAL_REGISTER_NUMBER
patterns:
- name: NRN avec points et tiret
regex: "\\b[0-9]{2}\\.[0-9]{2}\\.[0-9]{2}-[0-9]{3}\\.[0-9]{2}\\b"
score: 1.0
- name: NRN compact
regex: "\\b[0-9]{11}\\b"
score: 0.7
- name: NRN avec espaces
regex: "\\b[0-9]{2}\\s[0-9]{2}\\s[0-9]{2}\\s[0-9]{3}\\s[0-9]{2}\\b"
score: 0.8
context:
[
"registre national",
"numéro national",
"NN",
"RN",
"identité",
"carte d'identité",
]

View File

@@ -0,0 +1,44 @@
# Recognizer pour numéros de téléphone belges
recognizer_registry:
recognizers:
- name: BelgianPhoneRecognizer
supported_language: fr
supported_entity: BE_PHONE_NUMBER
patterns:
# Patterns avec contexte Tel: et Tél:
- name: Téléphone fixe avec contexte Tel
regex: '(?<=Tel\s*:\s*)0[1-9](?:[./\s]?\d{2,3}){3}(?=\s|\)|$|[.,;])'
score: 0.99
- name: Téléphone fixe avec contexte Tél
regex: '(?<=Tél\s*:\s*)0[1-9](?:[./\s]?\d{2,3}){3}(?=\s|\)|$|[.,;])'
score: 0.99
- name: Mobile avec contexte Tel
regex: '(?<=Tel\s*:\s*)04[0-9]{2}[./\s]?[0-9]{2}[./\s]?[0-9]{2}[./\s]?[0-9]{2}(?=\s|\)|$|[.,;])'
score: 0.99
- name: Mobile avec contexte Tél
regex: '(?<=Tél\s*:\s*)04[0-9]{2}[./\s]?[0-9]{2}[./\s]?[0-9]{2}[./\s]?[0-9]{2}(?=\s|\)|$|[.,;])'
score: 0.99
# Patterns généraux (sans contexte spécifique)
- name: Téléphone fixe belge
regex: '(?<!BCE\s*:?\s*)\b0[1-9](?:[./\s]?\d{2,3}){3}(?=\b|\)|$|[.,;])(?!.*BCE)'
score: 0.95
- name: Mobile belge
regex: '\b04[0-9]{2}[./\s]?[0-9]{2}[./\s]?[0-9]{2}[./\s]?[0-9]{2}(?=\b|\)|$|[.,;])'
score: 0.98
- name: International belge
regex: '\+32\s?[1-9](?:[./\s]?\d{2,3}){3}(?=\b|\)|$|[.,;])'
score: 0.99
- name: Numéro vert belge
regex: '\b0800[./\s]?[0-9]{2}[./\s]?[0-9]{3}(?=\b|\)|$|[.,;])'
score: 0.9
context:
[
"Tel",
"Tél",
"téléphone",
"gsm",
"mobile",
"portable",
"appeler",
"joindre",
]

View File

@@ -0,0 +1,14 @@
# Recognizer pour adresses françaises
recognizer_registry:
recognizers:
- name: FrenchAddressRecognizer
supported_language: fr
supported_entity: FR_ADDRESS
patterns:
- name: Adresse française complète
regex: "\\b\\d{1,4}(?:bis|ter|quater)?\\s+(?:rue|avenue|boulevard|place|impasse|allée|chemin|route)\\s+[A-Za-zà-ÿ\\s'-]+,\\s*[0-9]{5}\\s+[A-Za-zà-ÿ\\s'-]+\\b"
score: 0.95
- name: Code postal français
regex: "\\b[0-9]{5}\\b"
score: 0.6
context: ["adresse", "domicile", "résidence", "siège social"]

View File

@@ -0,0 +1,39 @@
# Recognizer pour documents d'identité français
recognizer_registry:
recognizers:
- name: FrenchIDCardRecognizer
supported_language: fr
supported_entity: FR_ID_CARD
patterns:
- name: Numéro CNI nouveau format
regex: "\\b[0-9]{12}\\b"
score: 0.85
- name: Numéro CNI avec espaces
regex: "\\b[0-9]{4}\\s[0-9]{4}\\s[0-9]{4}\\b"
score: 0.9
context:
["carte d'identité", "CNI", "pièce d'identité", "numéro d'identité"]
- name: FrenchPassportRecognizer
supported_language: fr
supported_entity: FR_PASSPORT
patterns:
- name: Numéro de passeport français
regex: "\\b[0-9]{2}[A-Z]{2}[0-9]{5}\\b"
score: 0.95
- name: Passeport avec espaces
regex: "\\b[0-9]{2}\\s[A-Z]{2}\\s[0-9]{5}\\b"
score: 0.9
context: ["passeport", "passport", "document de voyage"]
- name: FrenchDriverLicenseRecognizer
supported_language: fr
supported_entity: FR_DRIVER_LICENSE
patterns:
- name: Permis de conduire français
regex: "\\b[0-9]{12}\\b"
score: 0.8
- name: Permis avec format
regex: "\\b(?:permis\\s+(?:de\\s+)?conduire\\s*:?\\s*)?[0-9]{4}\\s?[0-9]{4}\\s?[0-9]{4}\\b"
score: 0.9
context: ["permis de conduire", "permis", "conduire", "licence"]

View File

@@ -0,0 +1,26 @@
# Recognizer pour données financières françaises
recognizer_registry:
recognizers:
- name: FrenchTaxIDRecognizer
supported_language: fr
supported_entity: FR_TAX_ID
patterns:
- name: Numéro fiscal français
regex: "\\b[0-9]{13}\\b"
score: 0.85
- name: Référence fiscale
regex: "\\b(?:numéro\\s+fiscal\\s*:?\\s*)?[0-9]{4}\\s?[0-9]{4}\\s?[0-9]{5}\\b"
score: 0.9
context: ["numéro fiscal", "référence fiscale", "impôts", "SIP"]
- name: FrenchBankAccountRecognizer
supported_language: fr
supported_entity: FR_BANK_ACCOUNT
patterns:
- name: RIB français
regex: "\\b[0-9]{5}\\s[0-9]{5}\\s[0-9]{11}\\s[0-9]{2}\\b"
score: 0.95
- name: Numéro de compte
regex: "\\b(?:compte\\s*:?\\s*)?[0-9]{5}[0-9]{5}[0-9]{11}[0-9]{2}\\b"
score: 0.9
context: ["RIB", "compte bancaire", "numéro de compte", "relevé"]

View File

@@ -0,0 +1,18 @@
# Recognizer pour numéros INSEE français
recognizer_registry:
recognizers:
- name: FrenchINSEERecognizer
supported_language: fr
supported_entity: FR_SOCIAL_SECURITY_NUMBER
patterns:
- name: INSEE complet avec espaces
regex: "\\b[12]\\s*[0-9]{2}\\s*(?:0[1-9]|1[0-2])\\s*(?:2[ABab]|[0-9]{2})\\s*[0-9]{3}\\s*[0-9]{3}[\\s]?[0-9]{2}\\b"
score: 0.95
- name: NIR compact
regex: "\\b[12][0-9]{12}[0-9]{2}\\b"
score: 0.85
- name: INSEE avec tirets
regex: "\\b[12]-[0-9]{2}-[0-9]{2}-[0-9]{2}-[0-9]{3}-[0-9]{3}-[0-9]{2}\\b"
score: 0.9
context:
["sécurité sociale", "insee", "nir", "numéro de sécu", "carte vitale"]

View File

@@ -0,0 +1,20 @@
# Recognizer pour IBAN
recognizer_registry:
recognizers:
- name: IbanRecognizer
supported_language: fr
supported_entity: IBAN
patterns:
- name: IBAN avec espaces
regex: "\\b[A-Z]{2}[0-9]{2}(?:\\s[0-9A-Z]{4}){3,7}\\b"
score: 1.0
- name: IBAN compact
regex: "\\b[A-Z]{2}[0-9]{2}[0-9A-Z]{12,30}\\b"
score: 0.9
- name: IBAN belge spécifique
regex: "\\bBE[0-9]{2}\\s?[0-9]{4}\\s?[0-9]{4}\\s?[0-9]{4}\\b"
score: 0.95
- name: IBAN français spécifique
regex: "\\bFR[0-9]{2}\\s?[0-9]{4}\\s?[0-9]{4}\\s?[0-9]{4}\\s?[0-9]{4}\\s?[0-9]{3}\\b"
score: 0.95
context: ["iban", "compte", "bancaire", "virement", "RIB"]

View File

@@ -0,0 +1,14 @@
# Recognizer pour données biométriques
recognizer_registry:
recognizers:
- name: BiometricDataRecognizer
supported_language: fr
supported_entity: BIOMETRIC_DATA
patterns:
- name: Données biométriques
regex: "\\b(?:empreinte(?:s)?\\s+digitale(?:s)?|reconnaissance\\s+faciale|scan\\s+(?:iris|rétine)|biométrie|ADN|profil\\s+génétique)\\b"
score: 0.95
- name: Identifiants biométriques
regex: "\\b(?:template|hash)\\s+biométrique\\s*:?\\s*[A-F0-9]{32,}\\b"
score: 0.9
context: ["biométrie", "empreinte", "reconnaissance", "scan", "identification"]

View File

@@ -0,0 +1,74 @@
recognizer_registry:
recognizers:
- name: DateTimeRecognizer
supported_language: fr
supported_entity: DATE_TIME
patterns:
# Formats français standards avec différents séparateurs
- name: Date française DD/MM/YYYY
regex: "\\b(?:0?[1-9]|[12][0-9]|3[01])/(?:0?[1-9]|1[0-2])/(?:19|20)\\d{2}\\b"
score: 0.95
- name: Date française DD-MM-YYYY
regex: "\\b(?:0?[1-9]|[12][0-9]|3[01])-(?:0?[1-9]|1[0-2])-(?:19|20)\\d{2}\\b"
score: 0.95
- name: Date française DD MM YYYY (espaces)
regex: "\\b(?:0?[1-9]|[12][0-9]|3[01])\\s+(?:0?[1-9]|1[0-2])\\s+(?:19|20)\\d{2}\\b"
score: 0.9
- name: Date ISO YYYY-MM-DD
regex: "\\b(?:19|20)\\d{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])\\b"
score: 0.98
# Dates avec mois en lettres (joli format)
- name: Date avec mois en lettres
regex: "\\b(?:0?[1-9]|[12][0-9]|3[01])\\s+(?:janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)\\s+(?:19|20)\\d{2}\\b"
score: 0.99
# Format belge DD.MM.YYYY
- name: Date belge DD.MM.YYYY
regex: "\\b(?:0?[1-9]|[12][0-9]|3[01])\\.(?:0?[1-9]|1[0-2])\\.(?:19|20)\\d{2}\\b"
score: 0.95
# Heures (HH:MM et HH:MM:SS)
- name: Heure HH:MM(:SS)?
regex: "\\b(?:[01]?[0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9])?\\b"
score: 0.85
# Date et heure combinées (ex: 12/05/2023 14:30)
- name: Date et heure combinées
regex: "\\b(?:0?[1-9]|[12][0-9]|3[01])[/-](?:0?[1-9]|1[0-2])[/-](?:19|20)\\d{2}\\s+(?:[01]?[0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9])?\\b"
score: 0.97
# Années seules dans un contexte fort
- name: Année avec contexte
regex: "\\b(?:en|depuis|année|an|né en|décédé en)\\s+(?:19|20)\\d{2}\\b"
score: 0.8
context:
[
"date",
"né le",
"née le",
"naissance",
"décès",
"décédé le",
"le",
"du",
"au",
"depuis",
"jusqu'au",
"entre",
"avant",
"après",
"heure",
"horaire",
"rendez-vous",
"réunion",
"événement",
"signature",
"signé le",
"établi le",
"fait le",
]

View File

@@ -0,0 +1,18 @@
# Recognizer pour adresses email
recognizer_registry:
recognizers:
- name: EmailRecognizer
supported_language: fr
supported_entity: EMAIL_ADDRESS
patterns:
- name: Email standard
regex: "\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b"
score: 1.0
- name: Email obfusqué
regex: "\\b[A-Za-z0-9._%+-]+\\s*\\[at\\]\\s*[A-Za-z0-9.-]+\\s*\\[dot\\]\\s*[A-Z|a-z]{2,}\\b"
score: 0.8
- name: Email avec (at) et (point)
regex: "\\b[A-Za-z0-9._%+-]+\\s*\\(at\\)\\s*[A-Za-z0-9.-]+\\s*\\(point\\)\\s*[A-Z|a-z]{2,}\\b"
score: 0.7
context:
["email", "courriel", "mail", "@", "contact", "adresse électronique"]

View File

@@ -0,0 +1,17 @@
# Recognizer pour données financières RGPD
recognizer_registry:
recognizers:
- name: RGPDFinancialDataRecognizer
supported_language: fr
supported_entity: RGPD_FINANCIAL_DATA
patterns:
- name: Numéro de carte bancaire
regex: "\\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13})\\b"
score: 1.0
- name: Code de sécurité
regex: "\\b(?:CVV|CVC|cryptogramme)\\s*:?\\s*[0-9]{3,4}\\b"
score: 0.95
- name: Revenus
regex: "\\b(?:salaire|revenu|rémunération)\\s*:?\\s*[0-9]{1,3}(?:[\\s.,][0-9]{3})*\\s*€?\\b"
score: 0.8
context: ["financier", "bancaire", "carte", "paiement", "salaire"]

View File

@@ -0,0 +1,17 @@
# Recognizer pour données de santé
recognizer_registry:
recognizers:
- name: HealthDataRecognizer
supported_language: fr
supported_entity: HEALTH_DATA
patterns:
- name: Informations médicales
regex: "\\b(?:maladie|pathologie|diagnostic|traitement|médicament|hospitalisation|chirurgie|opération|allergie|antécédent|symptôme)\\b"
score: 0.85
- name: Données médicales sensibles
regex: "\\b(?:VIH|SIDA|cancer|diabète|dépression|schizophrénie|bipolarité|addiction)\\b"
score: 0.95
- name: Professionnels de santé
regex: "\\b(?:Dr|Docteur|Médecin|Infirmier|Psychiatre|Psychologue)\\s+[A-Z][a-z]+\\b"
score: 0.9
context: ["santé", "médical", "hôpital", "clinique", "patient", "dossier médical"]

View File

@@ -0,0 +1,17 @@
# Recognizer pour adresses IP
recognizer_registry:
recognizers:
- name: IpAddressRecognizer
supported_language: fr
supported_entity: IP_ADDRESS
patterns:
- name: IPv4
regex: "\\b(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\b"
score: 1.0
- name: IPv6
regex: "\\b([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\b"
score: 0.9
- name: IPv6 compressé
regex: "\\b([0-9a-fA-F]{1,4}:){1,7}:([0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}\\b"
score: 0.85
context: ["IP", "adresse", "serveur", "réseau", "connexion"]

View File

@@ -0,0 +1,11 @@
# Recognizer pour opinions politiques
recognizer_registry:
recognizers:
- name: PoliticalOpinionsRecognizer
supported_language: fr
supported_entity: POLITICAL_OPINIONS
patterns:
- name: Opinions politiques
regex: "\\b(?:vote|électeur|parti\\s+politique|opinion\\s+politique)\\b"
score: 0.7
context: ["données sensibles", "RGPD", "politique", "privé"]

View File

@@ -0,0 +1,11 @@
# Recognizer pour orientation sexuelle
recognizer_registry:
recognizers:
- name: SexualOrientationRecognizer
supported_language: fr
supported_entity: SEXUAL_ORIENTATION
patterns:
- name: Orientation sexuelle
regex: "\\b(?:homosexuel|hétérosexuel|bisexuel|orientation\\s+sexuelle)\\b"
score: 0.9
context: ["données sensibles", "RGPD", "orientation", "privé"]