goanon

package module
v0.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 15, 2026 License: GPL-3.0 Imports: 4 Imported by: 0

README

go-anon

Pipeline de reconnaissance d'entités nommées (NER) et d'anonymisation pour le français, l'anglais et l'espagnol.

Le cœur du pipeline NER (modèle CRF, features, tokenisation, anonymisation) est écrit en Go pur, sans dépendance externe. Le traitement des documents bureautiques (DOCX, PDF) et la détection automatique de langue s'appuient sur quelques bibliothèques tierces.

Fonctionnalités

  • Détection d'entités nommées (personnes, lieux, organisations) via un modèle CRF linéaire ;
  • Détection par expression régulière d'identifiants structurés (e-mail, IPv4/IPv6, IBAN, SIRET, SIREN, téléphone) et de secrets (JWT, clés OpenAI/AWS/GitHub/Slack/Stripe, Bearer) ;
  • Anonymisation configurable : remplacement par tag, caviardage, empreinte HMAC ou pseudonymes cohérents ;
  • Traitement de documents bureautiques : DOCX, ODT, CSV/TSV, PDF, avec sanitisation des surfaces cachées (métadonnées, commentaires, révisions) ;
  • Détection automatique de la langue (fr/en/es) et téléchargement automatique des modèles pré-entraînés depuis GitHub Releases ;
  • Vérification de la sortie et mode fail-closed : aucune sortie produite si une entité ou un identifiant structuré y reste détectable ;
  • Mapping de ré-identification chiffré (AES-256-GCM), avec rétention et effacement cryptographique ;
  • Serveur HTTP durci : isolation inter-requêtes sans état, plafonds de corps et de concurrence, logs limités aux métadonnées ;
  • Presets précision/rappel (balanced, high-recall) et métriques orientées conformité (rappel par type/langue, F2) ;
  • Vérification de signature Ed25519 (minisign) du manifeste des modèles.

Utilisation

go get github.com/bornholm/go-anon
import goanon "github.com/bornholm/go-anon"

// Charger un modèle
f, _ := os.Open("model_fr.crf.gz")
m, _ := goanon.LoadModel(f)

// Reconnaître des entités
r, _ := goanon.NewRecognizer(m, goanon.WithLanguage("fr"))
entities, _ := r.Recognize("Jean Dupont habite à Paris.")
// → [{Text:"Jean Dupont", Type:"PER"}, {Text:"Paris", Type:"LOC"}]

// Anonymiser
anon := goanon.NewAnonymizer(r, goanon.Config{Strategy: goanon.TagReplace})
result, _ := anon.Anonymize("Jean Dupont habite à Paris.")
// result.Text → "⟦PERSON_1_a3f9c2⟧ habite à ⟦LOCATION_1_a3f9c2⟧."

// Restaurer le texte original
restored, _ := goanon.Deanonymize(result.Text, result.Mapping)

// Mode fail-closed : aucune sortie si une entité subsiste dans le texte anonymisé
result, err := anon.Anonymize(texte, goanon.WithStrictVerification())

// Détection des identifiants structurés (e-mail, IP, IBAN…) et des secrets
r, _ = goanon.NewRecognizer(m,
    goanon.WithLanguage("fr"),
    goanon.WithBuiltinRegexPatterns(),
    goanon.WithBuiltinSecretPatterns(), // JWT, sk-, AKIA, ghp_, xox*, sk_live_, Bearer…
)

// Détecter automatiquement la langue avant de choisir le modèle
det := goanon.NewWhatlangDetector(goanon.SupportedLanguages()...)
res, _ := det.Detect("Jean Dupont habite à Paris.")
// res.Lang → "fr" (si res.Reliable)

En ligne de commande, la langue est détectée automatiquement par défaut :

# La langue est détectée à partir du contenu du document (-lang auto par défaut)
anon-doc -model auto -input rapport.docx -output rapport_anon.docx
# ou forcée explicitement
anon-doc -model auto -lang fr -input rapport.docx -output rapport_anon.docx

Garanties de traitement

La bibliothèque réalise une pseudonymisation au sens de l'art. 4(5) du RGPD, pas une anonymisation : le mapping de ré-identification est lui-même une donnée personnelle, et l'actif le plus sensible du système. Le protéger et le détruire après usage est ce qui rend la sortie anonyme de facto. Par défaut, la sortie est réversible (pseudonymisée), pas anonyme.

Ce que l'outil garantit

  • en mode strict : aucune forme de surface d'entité détectée ni identifiant structuré ne reste en clair, sinon échec sans sortie ;
  • les secrets (clés, JWT) n'entrent jamais dans le mapping ;
  • la stratégie hash n'est pas cassable par dictionnaire sans la clé (HMAC) ;
  • round-trip déterministe et total ;
  • purge des métadonnées/commentaires/révisions des documents ;
  • isolation inter-requêtes du serveur, logs sans contenu.

Ce que l'outil ne garantit pas

  • l'exhaustivité de la détection (un nom manqué par le modèle part en clair, préférer alors le preset haut rappel) ;
  • la couverture des quasi-identifiants combinables, paraphrases, inférences contextuelles, stylométrie ;
  • la zéroïsation mémoire (limite du langage) ni l'écrasement disque physique (l'effacement réel est cryptographique).

Modèle de menace complet, garanties mesurées et checklist de déploiement : docs/rgpd.md.

Documentation

Document Contenu
docs/anonymisation.md Secrets, placeholders, stratégies de remplacement (dont hash), vérification fail-closed, presets précision/rappel
docs/documents.md Formats bureautiques pris en charge et sanitisation des surfaces cachées
docs/deploiement.md Stockage chiffré du mapping, durcissement du serveur HTTP, authenticité des modèles
docs/rgpd.md Cadrage juridique, modèle de menace, garanties mesurées, checklist de déploiement
docs/tutoriel-modele.md Entraîner un modèle NER depuis les données WikiNER

Licence

GPL-3.0

Documentation

Overview

Package goanon fournit une API de haut niveau pour la reconnaissance d'entités nommées (NER) et l'anonymisation de texte en français, anglais et espagnol.

Usage minimal :

f, _ := os.Open("model.crf.gz")
m, err := goanon.LoadModel(f)
r, err := goanon.NewRecognizer(m, goanon.WithLanguage("fr"))
entities, err := r.Recognize("Jean Dupont habite à Paris.")

Le Recognizer applique par défaut la configuration d'inférence validée sur WikiNER : ponctuation conservée dans les séquences CRF et découpage aux seules fins de phrase (cf. WithPunctuationTokens, WithSentenceBoundaries). NewRecognizer propage automatiquement le schéma de features et la fenêtre de contexte enregistrés dans le modèle ; Recognizer.Warnings() signale tout écart entre la configuration du modèle et celle de l'inférence (gazetteers ou Brown clusters manquants, langue différente).

Anonymisation :

anon := goanon.NewAnonymizer(r, goanon.Config{Strategy: goanon.TagReplace})
result, err := anon.Anonymize("Jean Dupont habite à Paris.")
// result.Text == "[PERSON_1] habite à [LOCATION_1]."

Index

Constants

View Source
const (
	TypePER  = ner.TypePER
	TypeLOC  = ner.TypeLOC
	TypeORG  = ner.TypeORG
	TypeMISC = ner.TypeMISC

	TypeEMAIL = ner.TypeEMAIL
	TypeIPV4  = ner.TypeIPV4
	TypeIPV6  = ner.TypeIPV6
	TypeIBAN  = ner.TypeIBAN
	TypeSIRET = ner.TypeSIRET
	TypeSIREN = ner.TypeSIREN
	TypePHONE = ner.TypePHONE

	TypeAPIKey = ner.TypeAPIKey
	TypeJWT    = ner.TypeJWT
	TypeSecret = ner.TypeSecret
)
View Source
const (
	LeakKnownEntity               = anonymizer.LeakKnownEntity
	LeakRegexHit                  = anonymizer.LeakRegexHit
	LeakInvalidUTF8               = anonymizer.LeakInvalidUTF8
	LeakResidualPlaceholderSource = anonymizer.LeakResidualPlaceholderSource
)
View Source
const (
	TagReplace = anonymizer.TagReplace
	Redact     = anonymizer.Redact
	Hash       = anonymizer.Hash
	Consistent = anonymizer.Consistent
)
View Source
const (
	PresetBalanced   = ner.PresetBalanced
	PresetHighRecall = ner.PresetHighRecall
)
View Source
const HashKeyEnvVar = anonymizer.HashKeyEnvVar

HashKeyEnvVar nomme la variable d'environnement portant la clé HMAC.

Variables

View Source
var (
	ErrHashKeyRequired      = anonymizer.ErrHashKeyRequired
	ErrHashKeyTooShort      = anonymizer.ErrHashKeyTooShort
	ErrHashKeyNotSet        = anonymizer.ErrHashKeyNotSet
	ErrHashKeyFormat        = anonymizer.ErrHashKeyFormat
	ErrPlaceholderCollision = anonymizer.ErrPlaceholderCollision
	ErrIncompleteMapping    = anonymizer.ErrIncompleteMapping
	ErrVerificationFailed   = anonymizer.ErrVerificationFailed
	ErrSessionClosed        = anonymizer.ErrSessionClosed
	ErrSessionFull          = anonymizer.ErrSessionFull
)

Erreurs sentinelles de l'anonymiseur.

View Source
var Balanced = ner.Balanced

Balanced retourne les options du preset par défaut (compromis F1).

View Source
var BlocklistFilter = ner.BlocklistFilter
View Source
var BuiltinRegexPatterns = ner.BuiltinRegexPatterns
View Source
var ConsistencyPass = anonymizer.ConsistencyPass
View Source
var Deanonymize = anonymizer.Deanonymize

Deanonymize restaure le texte original depuis un mapping placeholder → original.

View Source
var DefaultSentenceBoundaries = ner.DefaultSentenceBoundaries
View Source
var DefaultVerifyPatterns = anonymizer.DefaultVerifyPatterns

DefaultVerifyPatterns liste les expressions régulières re-passées sur la sortie par défaut lors de la vérification.

View Source
var FirstNameDetectionFilter = ner.FirstNameDetectionFilter
View Source
var FirstNameReclassifyFilter = ner.FirstNameReclassifyFilter
View Source
var HashKeyFromEnv = anonymizer.HashKeyFromEnv

HashKeyFromEnv charge la clé HMAC depuis GOANON_HASH_KEY.

View Source
var HighRecall = ner.HighRecall

HighRecall retourne les options du preset « haut rappel » recommandé pour la conformité RGPD (à combiner avec WithStrictVerification).

View Source
var IsSecretType = ner.IsSecretType

IsSecretType identifie les types dont la valeur n'est jamais conservée dans un mapping ni ré-identifiable (clés d'API, JWT, mots de passe).

View Source
var LoadBrownClusters = features.LoadBrownClusters
View Source
var LoadGazetteer = features.LoadGazetteer
View Source
var LoadModel = ner.LoadModel

LoadModel charge un modèle CRF sérialisé depuis r (format gob+gzip).

View Source
var MaxTokensFilter = ner.MaxTokensFilter
View Source
var MergePass = ner.MergePass
View Source
var MinConfidenceFilter = ner.MinConfidenceFilter
View Source
var NameCompletionPass = ner.NameCompletionPass
View Source
var NewAnonymizer = anonymizer.New

NewAnonymizer crée un Anonymizer qui s'appuie sur le Recognizer donné.

View Source
var NewRecognizer = ner.New

NewRecognizer construit un Recognizer NER avec le modèle m et les options fournies. Voir WithLanguage, WithGazetteers, WithBrownClusters, WithPostFilters.

View Source
var NewSession = anonymizer.NewSession
View Source
var NewSessionFromState = anonymizer.NewSessionFromState

NewSessionFromState reconstruit une Session depuis son état sérialisé.

View Source
var NewWhatlangDetector = langdetect.NewWhatlangDetector

NewWhatlangDetector construit un détecteur de langue basé sur whatlanggo, restreint aux codes ISO 639-1 fournis.

View Source
var ParseHashKey = anonymizer.ParseHashKey

ParseHashKey décode une clé HMAC hexadécimale ou base64 (≥ 32 octets).

View Source
var PresetOptions = ner.PresetOptions

PresetOptions retourne les options associées à un preset nommé.

View Source
var RegexEntityFilter = ner.RegexEntityFilter
View Source
var SecretPatterns = ner.SecretPatterns
View Source
var SupportedLanguages = ner.SupportedLanguages

SupportedLanguages retourne les codes ISO 639-1 gérés par le pipeline (fr/en/es).

View Source
var SurnameCompletionPass = anonymizer.SurnameCompletionPass

Verify recontrôle une sortie anonymisée : formes de surface résiduelles, identifiants structurés re-détectables, corruption d'encodage.

View Source
var WithBrownClusters = ner.WithBrownClusters
View Source
var WithBuiltinRegexPatterns = ner.WithBuiltinRegexPatterns
View Source
var WithBuiltinSecretPatterns = ner.WithBuiltinSecretPatterns
View Source
var WithConfidenceScores = ner.WithConfidenceScores
View Source
var WithEscapeCollisions = anonymizer.WithEscapeCollisions
View Source
var WithExposeSecrets = anonymizer.WithExposeSecrets
View Source
var WithFirstNameDetectionPass = ner.WithFirstNameDetectionPass
View Source
var WithFirstNameReclassify = ner.WithFirstNameReclassify
View Source
var WithGazetteers = ner.WithGazetteers
View Source
var WithHashKey = anonymizer.WithHashKey
View Source
var WithHashScope = anonymizer.WithHashScope
View Source
var WithInsecureHash = anonymizer.WithInsecureHash
View Source
var WithLanguage = ner.WithLanguage
View Source
var WithLegacyPlaceholders = anonymizer.WithLegacyPlaceholders
View Source
var WithMergePass = ner.WithMergePass
View Source
var WithNameCompletionPass = ner.WithNameCompletionPass
View Source
var WithPostFilters = ner.WithPostFilters
View Source
var WithPunctuationTokens = ner.WithPunctuationTokens
View Source
var WithRegexPatterns = ner.WithRegexPatterns
View Source
var WithSentenceBoundaries = ner.WithSentenceBoundaries
View Source
var WithSession = anonymizer.WithSession
View Source
var WithStrictVerification = anonymizer.WithStrictVerification
View Source
var WithVerification = anonymizer.WithVerification
View Source
var WithVerifyPatterns = anonymizer.WithVerifyPatterns

Functions

This section is empty.

Types

type AnonymizeOption added in v0.1.1

type AnonymizeOption = anonymizer.AnonymizeOption

type AnonymizePass

type AnonymizePass = anonymizer.AnonymizePass

type BrownClusters

type BrownClusters = features.BrownClusters

type Config

type Config = anonymizer.Config

type Entity

type Entity = ner.Entity

type EntityFilter

type EntityFilter = ner.EntityFilter

type EntityType

type EntityType = ner.EntityType

type Gazetteer

type Gazetteer = features.Gazetteer

type HashKey added in v0.1.1

type HashKey = anonymizer.HashKey

type LanguageDetector added in v0.0.5

type LanguageDetector = langdetect.Detector

type LanguageResult added in v0.0.5

type LanguageResult = langdetect.Result

type Leak added in v0.1.1

type Leak = anonymizer.Leak

type LeakKind added in v0.1.1

type LeakKind = anonymizer.LeakKind

type Model

type Model = ner.Model

type Preset added in v0.1.1

type Preset = ner.Preset

Preset nomme un compromis précision/rappel (cf. Balanced, HighRecall).

type Recognizer

type Recognizer = anonymizer.Recognizer

type RecognizerOption

type RecognizerOption = ner.RecognizerOption

type RegexPattern

type RegexPattern = ner.RegexPattern

RegexPattern associe une expression régulière à un type d'entité.

type ReplacerFunc

type ReplacerFunc = anonymizer.ReplacerFunc

type Result

type Result = anonymizer.Result

type Session added in v0.1.1

type Session = anonymizer.Session

type SessionState added in v0.1.1

type SessionState = anonymizer.SessionState

type Strategy

type Strategy = anonymizer.Strategy

type VerificationError added in v0.1.1

type VerificationError = anonymizer.VerificationError

type VerificationReport added in v0.1.1

type VerificationReport = anonymizer.VerificationReport

Directories

Path Synopsis
cmd
anon-doc command
Commande anon-doc — anonymisation de documents bureautiques (DOCX, ...).
Commande anon-doc — anonymisation de documents bureautiques (DOCX, ...).
brown-cluster command
Commande brown-cluster — génère des Brown clusters depuis un corpus texte.
Commande brown-cluster — génère des Brown clusters depuis un corpus texte.
convert command
Commande convert — réécrire un modèle CRF existant au format v4 (flux), sans réentraînement et sans altérer les poids.
Commande convert — réécrire un modèle CRF existant au format v4 (flux), sans réentraînement et sans altérer les poids.
demo command
Commande demo — démonstration interactive du pipeline NER et anonymisation.
Commande demo — démonstration interactive du pipeline NER et anonymisation.
eval command
Commande eval — évalue un modèle CRF-NER sur un corpus annoté.
Commande eval — évalue un modèle CRF-NER sur un corpus annoté.
internal/cmdutil
Package cmdutil fournit des utilitaires partagés entre les commandes CLI.
Package cmdutil fournit des utilitaires partagés entre les commandes CLI.
mappings command
Commande mappings — administration du store de tables de ré-identification.
Commande mappings — administration du store de tables de ré-identification.
prune command
Commande prune — élaguer les poids d'un modèle CRF existant pour réduire son empreinte disque et mémoire, sans nécessiter de réentraînement.
Commande prune — élaguer les poids d'un modèle CRF existant pour réduire son empreinte disque et mémoire, sans nécessiter de réentraînement.
server command
synthcorpus command
Command synthcorpus génère, valide et décrit un corpus synthétique annoté.
Command synthcorpus génère, valide et décrit un corpus synthétique annoté.
train command
Commande train — entraîne un modèle CRF-NER sur un corpus annoté.
Commande train — entraîne un modèle CRF-NER sur un corpus annoté.
pkg
anonymizer/mappingstore
Package mappingstore conserve les tables de ré-identification produites par l'anonymiseur.
Package mappingstore conserve les tables de ré-identification produites par l'anonymiseur.
checksum
Package checksum implémente les clés de contrôle des identifiants reconnus par les patterns intégrés de pkg/ner (SIREN, SIRET, IBAN, NIR).
Package checksum implémente les clés de contrôle des identifiants reconnus par les patterns intégrés de pkg/ner (SIREN, SIRET, IBAN, NIR).
csv
langdetect
Package langdetect fournit une abstraction de détection automatique de la langue d'un texte, indépendante de l'implémentation sous-jacente.
Package langdetect fournit une abstraction de détection automatique de la langue d'un texte, indépendante de l'implémentation sous-jacente.
modelstore
Package modelstore provides automatic discovery, download, verification, and caching of NER models published on GitHub Releases.
Package modelstore provides automatic discovery, download, verification, and caching of NER models published on GitHub Releases.
ner
ocr
Package ocr définit l'abstraction de reconnaissance optique utilisée pour atteindre le contenu qu'aucune couche texte ne décrit : pages scannées, encarts bitmap, tampons, signatures.
Package ocr définit l'abstraction de reconnaissance optique utilisée pour atteindre le contenu qu'aucune couche texte ne décrit : pages scannées, encarts bitmap, tampons, signatures.
odt
pdf
synth/gazetteer
Package gazetteer charge et tire des valeurs dans des listes pondérées.
Package gazetteer charge et tire des valeurs dans des listes pondérées.
synth/generate
Package generate assemble les documents synthétiques : parcours de l'AST, tirage des valeurs, application du bruit, projection BIO.
Package generate assemble les documents synthétiques : parcours de l'AST, tirage des valeurs, application du bruit, projection BIO.
synth/render
Package render assemble un document synthétique sous forme de segments annotés, puis en dérive le texte et les spans.
Package render assemble un document synthétique sous forme de segments annotés, puis en dérive le texte et les spans.
synth/template
Package template analyse les templates de documents synthétiques.
Package template analyse les templates de documents synthétiques.
synth/value
Package value produit les valeurs insérées dans les documents synthétiques.
Package value produit les valeurs insérées dans les documents synthétiques.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL