goanon

package module
v0.1.0 Latest Latest
Warning

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

Go to latest
Published: May 14, 2026 License: GPL-3.0 Imports: 3 Imported by: 0

README

go-anon

Pipeline de reconnaissance d'entités nommées (NER) et d'anonymisation pour le français et l'anglais. Zéro dépendance externe — bibliothèque standard Go uniquement.

Installation

go get github.com/bornholm/go-anon

Utilisation rapide

import (
    "os"
    goanon "github.com/bornholm/go-anon"
)

// 1. Charger le modèle
f, err := os.Open("model_en.crf.gz")
if err != nil {
    log.Fatal(err)
}
defer f.Close()

m, err := goanon.LoadModel(f)
if err != nil {
    log.Fatal(err)
}

// 2. Construire le recognizer
r, err := goanon.NewRecognizer(m, goanon.WithLanguage("en"))
if err != nil {
    log.Fatal(err)
}

// 3. Détecter les entités
entities, err := r.Recognize("Marie Curie was born in Warsaw.")
// → [{Text:"Marie Curie", Type:"PER", Confidence:0.97}, {Text:"Warsaw", Type:"LOC", ...}]

// 4. Anonymiser
anon := goanon.NewAnonymizer(r, goanon.Config{Strategy: goanon.TagReplace})
result, err := anon.Anonymize("Marie Curie was born in Warsaw.")
// result.Text  → "[PERSON_1] was born in [LOCATION_1]."
// result.Mapping → {"[PERSON_1]": "Marie Curie", "[LOCATION_1]": "Warsaw"}

// 5. Dé-anonymiser
original, err := anon.Deanonymize(result.Text, result.Mapping)

Modèles

Les modèles ne sont pas inclus dans la librairie. Ils doivent être fournis explicitement via LoadModel. Utiliser cmd/train pour entraîner un modèle :

# Entraîner un modèle français
./bin/train \
  -train data/wikiner_fr_full.train.wikiner \
  -dev   data/wikiner_fr_full.dev.wikiner \
  -lang fr -format wikiner \
  -workers 1 -epochs 20 -lr 0.1 -l2 0.01 \
  -clusters data/brown_clusters_fr.txt \
  -prune-threshold 0.001 \
  -output model_fr.crf.gz
Langue Code WithLanguage
Français "fr"
Anglais "en"

Stratégies d'anonymisation

Constante Exemple Description
TagReplace [PERSON_1] Remplacement par tag typé (défaut)
Redact ████ Caviardage caractère par caractère
Hash [PER_a1b2c3] Empreinte SHA-256 (6 hex)
Consistent [PERSON_1] Même entité → même placeholder

Filtres post-NER

r, _ := goanon.NewRecognizer(
    goanon.WithLanguage("fr"),
    goanon.WithPostFilters(
        goanon.MinConfidenceFilter(0.7),   // supprimer < 70 % de confiance
        goanon.MaxTokensFilter(5),          // supprimer les spans > 5 tokens
        goanon.BlocklistFilter(goanon.TypePER, "Monsieur", "Madame"),
    ),
)

Gazetteers et Brown clusters

import "os"

f, _ := os.Open("data/villes.txt")
gaz, _ := goanon.LoadGazetteer("cities", f)

fc, _ := os.Open("data/brown_clusters_fr.txt")
clusters, _ := goanon.LoadBrownClusters(fc)

r, _ := goanon.NewRecognizer(
    goanon.WithLanguage("fr"),
    goanon.WithGazetteers(map[string]*goanon.Gazetteer{"cities": gaz}),
    goanon.WithBrownClusters(clusters),
)

Outils en ligne de commande

go build -o bin/train        ./cmd/train/
go build -o bin/eval         ./cmd/eval/
go build -o bin/demo         ./cmd/demo/
go build -o bin/prune        ./cmd/prune/
go build -o bin/brown-cluster ./cmd/brown-cluster/
Outil Description
train Entraîner un modèle CRF sur un corpus CoNLL ou WikiNER
eval Évaluer le F1 (strict type + span) sur un corpus de test
demo Démo interactive / anonymisation depuis stdin
prune Réduire un modèle existant sans ré-entraînement
brown-cluster Générer des Brown clusters depuis un corpus
# Démo rapide (-model est obligatoire)
echo "Jean Dupont habite à Paris." | ./bin/demo -model model_fr.crf.gz -lang fr -anonymize

# Évaluation
./bin/eval -model model_fr.crf.gz -lang fr \
  -test data/wikiner_fr.test.conll -format conll

Architecture

texte brut
  → UnicodeTokenizer     (pkg/tokenizer)  — segmentation rune-par-rune, offsets byte-accurate
  → FeatureExtractor     (pkg/features)   — ~40-60 features/token : morpho, shape, contexte, clusters
  → CRF Viterbi          (pkg/model)      — décodage optimal en BIO
  → decodeEntities       (pkg/ner)        — reconstruction des spans avec scores de confiance
  → EntityFilter[]       (pkg/ner)        — post-filtres chaînables
  → Anonymizer           (pkg/anonymizer) — remplacement en ordre inverse des offsets
Packages
Package Rôle
pkg/model CRF linéaire : poids, Viterbi, forward-backward, SGD/Adam
pkg/features Features : morphologie, shape, Brown clusters, gazetteers
pkg/ner Orchestration NER, décodage BIO→entités, filtres
pkg/anonymizer Remplacement et restauration des entités
pkg/corpus Lecture CoNLL et WikiNER, conversion BIO/BIOES
pkg/tokenizer UnicodeTokenizer — offsets byte-précis, FR/EN
pkg/lang Profils linguistiques : stop-words, préfixes, abréviations

Points de vigilance

  • Les offsets Start/End sont des positions byte UTF-8, pas des indices de caractères. Les caractères accentués (é, à) occupent 2 octets.
  • workers > 1 avec peu de phrases cause une divergence Hogwild! — utiliser -workers 1 sur les petits corpus.
  • Le modèle FR de production recommandé est entraîné avec prune-threshold 0.001 (F1 ≈ 82,4 % sur WikiNER).

Licence

Voir LICENSE.

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 et en anglais.

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.")

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
)
View Source
const (
	TagReplace = anonymizer.TagReplace
	Redact     = anonymizer.Redact
	Hash       = anonymizer.Hash
	Consistent = anonymizer.Consistent
)

Variables

View Source
var BlocklistFilter = ner.BlocklistFilter
View Source
var BuiltinRegexPatterns = ner.BuiltinRegexPatterns
View Source
var ConsistencyPass = anonymizer.ConsistencyPass
View Source
var DefaultSentenceBoundaries = ner.DefaultSentenceBoundaries
View Source
var FirstNameDetectionFilter = ner.FirstNameDetectionFilter
View Source
var FirstNameReclassifyFilter = ner.FirstNameReclassifyFilter
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 RegexEntityFilter = ner.RegexEntityFilter
View Source
var SurnameCompletionPass = anonymizer.SurnameCompletionPass
View Source
var WithBrownClusters = ner.WithBrownClusters
View Source
var WithBuiltinRegexPatterns = ner.WithBuiltinRegexPatterns
View Source
var WithFirstNameDetectionPass = ner.WithFirstNameDetectionPass
View Source
var WithFirstNameReclassify = ner.WithFirstNameReclassify
View Source
var WithGazetteers = ner.WithGazetteers
View Source
var WithLanguage = ner.WithLanguage
View Source
var WithMergePass = ner.WithMergePass
View Source
var WithNameCompletionPass = ner.WithNameCompletionPass
View Source
var WithPostFilters = ner.WithPostFilters
View Source
var WithRegexPatterns = ner.WithRegexPatterns
View Source
var WithSentenceBoundaries = ner.WithSentenceBoundaries

Functions

This section is empty.

Types

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 Model

type Model = ner.Model

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 Strategy

type Strategy = anonymizer.Strategy

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.
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.
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
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
csv
ner
odt
pdf

Jump to

Keyboard shortcuts

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