The text beside the image,
measured end to end

Medical images are released with the free text that describes them, and protecting the image does not protect the report. This study measures the text component of such releases — detection, downstream utility and residual identity leakage, on the same documents, with the pseudonymisation policy as the variable under test. Four corpora — clinical letters, legal judgments, news, e-mail — in German, English, Chinese and Arabic.

This page carries what the eight-page paper had no room for. Every number is generated from the result files, not transcribed.

Frequency matching recovers
1 of 32
prior-sweep cells yield a single identity between them, across three orders of magnitude of adversary knowledge
Linkage on unmodified e-mail
0.720
falls to 0.0093 after the recommended release, against a 1/3,697 chance rate
Telling the attacker the scheme
0.110 → 0.165
on a surrogate release, without altering one character of the published text

01Detection

What an ensemble catches, what it wrongly catches, and what it costs.

The release under study is the 13-detector ensemble combined by union, which is that ensemble's maximum-sensitivity configuration — no other rule over the same members can find more. Every leakage, exposure and language figure on this page describes that one release.

Three rates, three denominators, never interchangeable. Sensitivity is the share of identifier tokens found, over the types condition B replaces; dates, quantities and miscellaneous spans pass through by design and are not in it. Person sensitivity is the same rate over PERSON alone, which is what the attacks act on. Specificity is the share of non-identifier tokens left alone. Sensitivity without specificity is unreadable — an ensemble that replaces every token scores a perfect 1.0 and destroys the text — so both are given throughout. Precision mixes the two denominators and is reported beside them, never optimised for.

The cost–quality front, in full

CorpusOperating pointRuleSens.Spec.Prec.IW prec.Cost ∥ (s)Cost Σ (s)Members
CARDIO:DEmax sensitivityunion0.9920.96700.8190.79057.63378.2223
fast sensitivityunion0.8950.97690.8660.8270.3010.5642
max specificityvote0.5230.99970.9800.982116.875117.5933
fast specificitysingle0.7810.98620.9120.8810.2630.2631
TABmax sensitivityunion0.9250.89860.6300.69714.21014.6403
fast sensitivityunion0.8930.92420.6760.7350.2190.4963
max specificityvote0.5010.99590.9650.96898.11098.3873
fast specificitysingle0.5200.99340.9450.9390.1170.1171
OntoNotesmax sensitivityunion0.7470.97630.8220.8459.4509.6513
fast sensitivityunion0.6840.97310.8000.8265.3765.5783
max specificityunion0.5030.99600.9420.9460.1030.2022
fast specificityunion0.5030.99600.9420.9460.1030.2022
Enronmax sensitivityunion0.9970.77450.5760.50825.55725.6623
fast sensitivityunion0.9220.74200.5240.4990.0570.1343
max specificityintersection0.5290.94480.7470.67220.93135.7823
fast specificitysingle0.6920.87810.6360.5850.0260.0261

Cost ∥ is the slowest member, which is what a parallel run pays; Cost Σ is the sum, which is what a serial one pays. The paper reports only the first. Information-weighted precision scales each masked token by how poorly its context predicts it. This search covers singles, pairs and triples only, so the recommended 13-detector ensemble lies outside it and exceeds the “maximum” row on every corpus — CARDIO:DE 0.998 against 0.992; TAB 0.961 against 0.925; OntoNotes 0.801 against 0.747; Enron 0.998 against 0.997. Enron's four rows are re-scored against the corrected gold described under the next table. The selection was not re-run: these triples were chosen by the 1,743-source sweep as it scored on the superseded gold, so a fresh sweep could pick different members. The rows say what these ensembles achieve now, not that they would still win. Every column, the weighted one included, is re-scored under the sweep's own weight model (unigram:enron).

The fast cell is usually not the worse cell. On CARDIO:DE the fast sensitivity point gives up 0.097 of sensitivity but is more specific than the maximum — 0.9769 against 0.9670 — and 191× cheaper. Catching the last identifiers means over-detecting, and over-detection has its own price — which only the second column shows.

The recommended ensemble under every combining rule

CorpusRuleSensitivitySpecificityPerson sensitivityPrecisionReplacements
CARDIO:DEunion (max. sensitivity)0.99780.86860.99980.54668,869
vote 20.65170.98560.57830.90930,276
vote 30.62340.99630.56260.97426,226
intersection0.00121.00000.00451.00022
TABunion (max. sensitivity)0.96140.85040.99580.544162,285
vote 20.85380.93390.96020.703130,663
vote 30.77110.98030.94810.87985,093
intersection0.00591.00000.01970.993729
OntoNotesunion (max. sensitivity)0.80110.93180.93520.662291,493
vote 20.61540.98210.86360.837178,224
vote 30.49940.99260.78250.903129,934
intersection0.00311.00000.01330.9911,259
Enronunion (max. sensitivity)0.99810.62350.99060.4491,487,379
vote 20.89090.81200.83100.5931,319,373
vote 30.78270.85570.82240.6251,146,795
intersection0.00800.99950.04430.83734,402

The 13 detectors under each combining rule, both error rates together. Union is the maximum-sensitivity configuration of this ensemble: no other rule over the same members can find more, and every leakage figure on this page describes that release. The rows beneath it price the alternative — agreement buys specificity and pays for it in sensitivity. Precision mixes the two denominators and is reported beside them, never optimised for.

Enron's gold layer was corrected on 2026-09-25. Every Enron figure on this page, the cost–quality front above included, is read against the corrected version. The corpus adapter matched a correspondent's display name as an unanchored substring, so a short mailbox name was found inside ordinary English words and role accounts — info@, questions@, news@ — entered the gold as people whose mentions were common nouns. Word-boundary anchoring and a role-account filter remove them: 794,100 person identifier tokens become 661,699, and person sensitivity rises from 0.8898 to 0.9906. The document text is byte-identical under the fix, so nothing was re-detected and both published patch sets are unchanged.

Specificity does not move: 0.6236 before, 0.6235 after. It is read over the non-identifier tokens, which the defect barely touched, so Enron's over-replacement is a property of this ensemble on this corpus and not an artefact of the gold. The same correction lifts person sensitivity in the message body from 0.7295 to 0.9817, so the earlier reading that detection fails on prose and succeeds only on headers was a reading of the defect.

The 13 detectors

Two further large language models were run as single detectors and excluded from the recommended ensemble: preliminary runs made them one to two orders of magnitude slower per document without improving detection.

02By language

A pooled score describes no language in particular. Scripts differ in how many subword tokens they need, annotation differs in what it marks, and the detectors were not trained evenly across the four.

LanguageSourceDocsSensitivitySpecificityPerson sensitivityPrecisionIdentifier tokensTokens
GermanCARDIO:DE4000.9980.86861.0000.54618,468885,059
EnglishTAB1,2680.9610.85040.9960.544163,8401,844,804
Enron58,6360.9980.62350.9910.4493,648,25615,507,925
OntoNotes (english)3,6370.9890.93590.9910.715191,1692,192,105
ChineseOntoNotes (chinese)1,9110.8680.91370.9320.51868,096996,930
ArabicOntoNotes (arabic)4460.6140.93840.8780.664215,9651,537,559

The 13-detector union throughout, so every row describes the release the attacks were run against. Only OntoNotes is multilingual; German, and the English of TAB and Enron, are whole corpora. Sensitivity and specificity are read against their own denominators — identifier tokens and everything else — so neither can be judged without the other.

OntoNotes, split three ways

LanguageRuleSensitivitySpecificityPerson sensitivityPrecisionDocs
Englishunion (max. sens.)0.9890.93590.9910.7153,637
vote-20.8670.97630.9490.8333,637
vote-30.8080.98890.9360.8973,637
intersection0.0081.00000.0310.9913,637
Chineseunion (max. sens.)0.8680.91370.9320.5181,911
vote-20.6280.98150.8390.7701,911
vote-30.4340.99450.6510.8811,911
intersection0.0001.00000.000—1,911
Arabicunion (max. sens.)0.6140.93840.8780.664446
vote-20.3880.99110.7830.891446
vote-30.2470.99690.6690.935446
intersection0.0001.00000.000—446

What the combining rule costs, language by language. The gap between sensitivity and person sensitivity is the point: the three languages differ far more on the full identifier set than on people, and people are what the attacks recover.

The spread is in the other identifier classes, not in finding people. Sensitivity over the whole identifier set runs 0.989 on English down to 0.614 on Arabic; person sensitivity runs 0.991 down to 0.878. That matters because the attacks recover people, so the alarming figure and the figure that bounds leakage are not the same number — and specificity moves only from 0.9359 to 0.9384 across the three, so the spread is not over-replacement either.

03Utility

Frozen models read all three conditions. The question is not whether the text changed but whether the task survives, so every comparison is paired per document and carries the original-text score beside it. Entity agreement was measured on all four corpora; the clinical information-extraction and section tasks exist only for the clinical letters.

Entity agreement, all four corpora

CorpusRuleA — originalB — surrogatesC — placeholdersDocs
CARDIO:DEpermissive (union of 15)1.000 ± 0.0000.611 ± 0.0820.004 ± 0.008400
precise (8 of 15)1.000 ± 0.0000.973 ± 0.0190.674 ± 0.082400
TABpermissive (union of 15)1.000 ± 0.0000.478 ± 0.0970.003 ± 0.0111,268
precise (8 of 15)1.000 ± 0.0000.898 ± 0.0500.634 ± 0.1031,268
OntoNotespermissive (union of 15)1.000 ± 0.0000.295 ± 0.2420.015 ± 0.1065,994
precise (8 of 15)1.000 ± 0.0000.888 ± 0.1560.788 ± 0.2195,994
Enronpermissive (union of 15)1.000 ± 0.0000.330 ± 0.1720.034 ± 0.08858,636
precise (8 of 15)1.000 ± 0.0000.754 ± 0.1600.714 ± 0.17958,636

Mean ± one standard deviation over documents, every document of each corpus. Column A is 1.000 everywhere by construction and is not a result: ner_agreement scores the frozen recogniser against its own output on the unmodified text, so A is the definition of perfect agreement, not a measurement of it. It is printed because the paired design requires the original-text score beside every condition. Read B and C down the two rules of one corpus, never across corpora: the genres differ in how much of a document is a name.

Detector precision governs utility on all four corpora, not only the clinical one. Under the permissive union the same frozen recogniser agrees with itself on only 0.295–0.611 of its original findings; requiring a majority of the same fifteen detectors recovers 0.754–0.973. Same policy, same surrogates, same documents — only which spans were replaced changed.

CARDIO:DE, every task

TaskRuleA — originalB — surrogatesC — placeholdersDocs
medication_iepermissive (union of 15)0.367 ± 0.1810.346 ± 0.1800.314 ± 0.199390
precise (8 of 15)0.371 ± 0.1820.364 ± 0.1890.381 ± 0.186390
medication_ie:in_narrativepermissive (union of 15)0.036 ± 0.0660.030 ± 0.0570.016 ± 0.039328
precise (8 of 15)0.041 ± 0.0730.036 ± 0.0690.039 ± 0.071328
medication_ie:listedpermissive (union of 15)0.376 ± 0.1900.357 ± 0.1890.331 ± 0.207389
precise (8 of 15)0.379 ± 0.1890.373 ± 0.1980.390 ± 0.195389
ner_agreementpermissive (union of 15)1.000 ± 0.0000.611 ± 0.0820.004 ± 0.008400
precise (8 of 15)1.000 ± 0.0000.973 ± 0.0190.674 ± 0.082400
section_classificationpermissive (union of 15)0.749 ± 0.0930.677 ± 0.0970.711 ± 0.103400
precise (8 of 15)0.752 ± 0.0900.709 ± 0.0890.718 ± 0.090400

Mean ± one standard deviation over documents, on CARDIO:DE, which is the only corpus carrying the clinical tasks. ner_agreement is 1.000 on A by construction: it scores the frozen recogniser against its own output on the original text. medication_ie:in_narrative is retained here but excluded from the paper's conclusions, because the frozen model is near chance on the original text and so cannot measure a loss.

The paired tests in full

TaskRulePairnTestReferenceConditionDifferenceqSig.Effect
medication_iepermissiveA → B390wilcoxon0.367 ± 0.1820.346 ± 0.181-0.020 ± 0.1820.00556yes-0.166
medication_iepermissiveA → C390wilcoxon0.367 ± 0.1820.314 ± 0.200-0.053 ± 0.2055.71e-07yes-0.306
medication_ie:listedpermissiveA → B389wilcoxon0.376 ± 0.1900.357 ± 0.189-0.020 ± 0.1910.0147yes-0.147
medication_ie:listedpermissiveA → C389wilcoxon0.376 ± 0.1900.331 ± 0.207-0.045 ± 0.2147.07e-05yes-0.249
ner_agreementpermissiveA → B400wilcoxon1.000 ± 0.0000.611 ± 0.082-0.389 ± 0.0822.73e-67yes-1.000
ner_agreementpermissiveA → C400wilcoxon1.000 ± 0.0000.004 ± 0.008-0.996 ± 0.0083.03e-73yes-1.000
section_classificationpermissiveA → B400wilcoxon0.749 ± 0.0930.677 ± 0.097-0.072 ± 0.0861.58e-37yes-0.846
section_classificationpermissiveA → C400wilcoxon0.749 ± 0.0930.711 ± 0.104-0.038 ± 0.0892.57e-14yes-0.531
medication_iepreciseA → B390wilcoxon0.371 ± 0.1820.364 ± 0.189-0.008 ± 0.1780.798no-0.015
medication_iepreciseA → C390wilcoxon0.371 ± 0.1820.381 ± 0.187+0.010 ± 0.1750.235no0.095
medication_ie:listedpreciseA → B389wilcoxon0.379 ± 0.1900.373 ± 0.198-0.006 ± 0.1830.947no0.004
medication_ie:listedpreciseA → C389wilcoxon0.379 ± 0.1900.390 ± 0.195+0.012 ± 0.1830.185no0.102
ner_agreementpreciseA → B400wilcoxon1.000 ± 0.0000.973 ± 0.019-0.027 ± 0.0191.79e-66yes-1.000
ner_agreementpreciseA → C400wilcoxon1.000 ± 0.0000.674 ± 0.082-0.326 ± 0.0825.46e-67yes-1.000
section_classificationpreciseA → B400wilcoxon0.752 ± 0.0910.709 ± 0.090-0.043 ± 0.0684.36e-25yes-0.746
section_classificationpreciseA → C400wilcoxon0.752 ± 0.0910.718 ± 0.090-0.035 ± 0.0782.29e-16yes-0.588

Wilcoxon signed-rank on paired documents of CARDIO:DE, Benjamini–Hochberg corrected within task families. Effect is the rank-biserial correlation. A rank-biserial of −1.000 means every document lost, not merely the average.

The placeholder column is partly an artefact and is labelled as one: the frozen recogniser never tags [PERSON] as a name, so every replaced mention counts as a disagreement. Read that column between rules, not between forms.

04Leakage

Three attacks against the released text, all scored over the full denominator with collisions counted rather than dropped, because an attacker has no ground truth to drop them with.

The finding that reorganised the paper. Conditions B and C replace identical spans, so overwriting each replaced span of the surrogate release with [PERSON] reproduces the placeholder release character for character — verified on all 1,268 TAB and all 5,994 OntoNotes documents.

A release cannot be safer than a text anyone can compute from it. So when a candidate-ranking model scores 0.110 on the TAB surrogate release against 0.340 on the placeholder one, that is not protection: it is the ranker believing the surrogate. Tell it the scheme and it reaches 0.165 on exactly the same published bytes. The earlier 15-detector pool orders the same way, 0.085 / 0.290 / 0.205.

Candidate ranking, every cell

CorpusConditionAux. contextRank-1Rank-5mAP× chanceQueriesEnsemble
CARDIO:DEB — surrogatesno0.0850.3550.2510.8×200recommended 13
C — typed placeholdersno0.1200.5500.3221.2×200recommended 13
A — unmodifiedno1.0001.0001.00010.0×20015-detector pool
A — unmodifiedyes0.9951.0000.9969.9×20015-detector pool
B — surrogatesno0.0900.5100.2750.9×20015-detector pool
B — surrogatesyes0.1600.5500.3401.6×20015-detector pool
C — typed placeholdersno0.1350.5850.3361.4×20015-detector pool
C — typed placeholdersyes0.2200.6900.4222.2×20015-detector pool
TABB — surrogatesno0.1100.5750.3171.1×200recommended 13
B — surrogatesyes0.1050.5650.3201.0×200recommended 13
B — attacker told the schemeno0.1650.6050.3601.6×200recommended 13
B — attacker masks namesno0.1450.6500.3741.4×200recommended 13
C — typed placeholdersno0.3400.8450.5473.4×200recommended 13
C — typed placeholdersyes0.3000.7350.4703.0×200recommended 13
A — unmodifiedno0.9951.0000.9969.9×20015-detector pool
A — unmodifiedyes1.0001.0001.00010.0×20015-detector pool
B — surrogatesno0.0850.5000.2850.8×20015-detector pool
B — surrogatesyes0.1200.5100.3021.2×20015-detector pool
B — attacker told the schemeno0.2050.6550.4082.0×20015-detector pool
B — attacker masks namesno0.2150.7600.4382.1×20015-detector pool
C — typed placeholdersno0.2900.8500.5142.9×20015-detector pool
C — typed placeholdersyes0.3100.7150.4893.1×20015-detector pool
OntoNotesB — surrogatesno0.2900.8600.5232.9×200recommended 13
C — typed placeholdersno0.6300.9100.7496.3×200recommended 13
A — unmodifiedno0.9900.9950.9939.9×20015-detector pool
A — unmodifiedyes0.9850.9950.9919.8×20015-detector pool
B — surrogatesno0.3100.9000.5483.1×20015-detector pool
B — surrogatesyes0.3650.9150.5903.6×20015-detector pool
C — typed placeholdersno0.5900.9000.7335.9×20015-detector pool
C — typed placeholdersyes0.6600.9250.7806.6×20015-detector pool

Ten candidates per query, so chance is Rank-1 0.100 and Rank-5 0.500. The recommended 13-detector release is listed first for each corpus; the 15-detector rows are the earlier run over the full pool, kept because they show the finding does not depend on the ensemble. The two attacker rows are the same surrogate release read by an adversary who knows it is pseudonymised: one simply told so, one replacing name-like spans it finds with a public name list. Neither changes what the defender published.

Frequency matching

CorpusSurfaces observedAligned — oracle priorAligned — public priorRead in clearPublic priorPrior sizeChancec@1ρ
CARDIO:DE25,677107German surnames54,8301.82e-050.000270.898
TAB20,1471095US Census 2010 surnames162,2406.16e-060.004720.849
OntoNotes28,15310166US Census 2010 surnames162,2406.16e-060.005900.789
Enron106,58700152US Census 2010 surnames162,2406.16e-060.001430.730

Aligned counts identities recovered by matching frequencies, which is the attack. Read in clear counts names the detector missed, which the release simply printed: the attacker recovers those by reading, not by inferring, and the two must never be added into one rate. The oracle prior is the corpus's own distribution, which no real adversary holds. ρ is Spearman's correlation between the surrogate and real frequency orders.

Prior quality: the adversary-knowledge sweep

CorpusPriorSizeVintageAlignedRead in clear
CARDIO:DEGerman surnames top-100100201007
German surnames top-1,0001,000201007
German surnames top-10,00010,000201007
German surnames54,830201007
German given names (male) top-1001001930-196907
German given names (male)5481930-196907
German given names (female) top-1001001930-196907
German given names (female)5971930-196907
TABUS Census 2010 surnames top-1001002010095
US Census 2010 surnames top-1,0001,0002010095
US Census 2010 surnames top-10,00010,0002010095
US Census 2010 surnames162,2402010095
UCI given names top-1001001880-2019095
UCI given names top-1,0001,0001880-2019095
UCI given names top-10,00010,0001880-2019095
UCI given names133,6731880-2019095
OntoNotesUS Census 2010 surnames top-10010020100166
US Census 2010 surnames top-1,0001,00020101166
US Census 2010 surnames top-10,00010,00020100166
US Census 2010 surnames162,24020100166
UCI given names top-1001001880-20190166
UCI given names top-1,0001,0001880-20190166
UCI given names top-10,00010,0001880-20190166
UCI given names133,6731880-20190166
EnronUS Census 2010 surnames top-10010020100152
US Census 2010 surnames top-1,0001,00020100152
US Census 2010 surnames top-10,00010,00020100152
US Census 2010 surnames162,24020100152
UCI given names top-1001001880-20190152
UCI given names top-1,0001,0001880-20190152
UCI given names top-10,00010,0001880-20190152
UCI given names133,6731880-20190152

The prior-quality sweep Bindschaedler et al. prescribe: vary what the adversary knows, along size and along age, and report accuracy per cell. Across all 32 cells, spanning three orders of magnitude of prior size, frequency alignment recovers 1 identity in total. Better knowledge buys the attack nothing here, which is the point of running the sweep rather than asserting a single prior is representative.

Abstention

CorpusPriorφAnsweredAbstainedAccuracy (answered)c@1
CARDIO:DEcorpus-internal0.0025,67700.000310.00031
corpus-internal0.05025,6770.000000.00000
corpus-internal0.25025,6770.000000.00000
corpus-internal1.50025,6770.000000.00000
German surnames0.0025,67700.000270.00027
German surnames0.051125,6660.000000.00000
German surnames0.25025,6770.000000.00000
German surnames1.50025,6770.000000.00000
German given names (male)0.0025,67700.000270.00027
German given names (male)0.05025,6770.000000.00000
German given names (male)0.25025,6770.000000.00000
German given names (male)1.50025,6770.000000.00000
German given names (female)0.0025,67700.000270.00027
German given names (female)0.05025,6770.000000.00000
German given names (female)0.25025,6770.000000.00000
German given names (female)1.50025,6770.000000.00000
TABcorpus-internal0.0020,14700.004760.00476
corpus-internal0.05020,1470.000000.00000
corpus-internal0.25020,1470.000000.00000
corpus-internal1.50020,1470.000000.00000
US Census 2010 surnames0.0020,14700.004720.00472
US Census 2010 surnames0.053420,1130.029410.00010
US Census 2010 surnames0.252720,1200.037040.00010
US Census 2010 surnames1.50020,1470.000000.00000
UCI given names0.0020,14700.004720.00472
UCI given names0.05720,1400.000000.00000
UCI given names0.25020,1470.000000.00000
UCI given names1.50020,1470.000000.00000
OntoNotescorpus-internal0.0028,15300.005930.00593
corpus-internal0.05028,1530.000000.00000
corpus-internal0.25028,1530.000000.00000
corpus-internal1.50028,1530.000000.00000
US Census 2010 surnames0.0028,15300.005900.00590
US Census 2010 surnames0.051728,1360.000000.00000
US Census 2010 surnames0.251228,1410.000000.00000
US Census 2010 surnames1.50028,1530.000000.00000
UCI given names0.0028,15300.005900.00590
UCI given names0.05728,1460.000000.00000
UCI given names0.25028,1530.000000.00000
UCI given names1.50028,1530.000000.00000
Enroncorpus-internal0.00106,58700.001430.00143
corpus-internal0.050106,5870.000000.00000
corpus-internal0.250106,5870.000000.00000
corpus-internal1.500106,5870.000000.00000
US Census 2010 surnames0.00106,58700.001430.00143
US Census 2010 surnames0.0515106,5720.000000.00000
US Census 2010 surnames0.258106,5790.000000.00000
US Census 2010 surnames1.500106,5870.000000.00000
UCI given names0.00106,58700.001430.00143
UCI given names0.054106,5830.000000.00000
UCI given names0.250106,5870.000000.00000
UCI given names1.500106,5870.000000.00000

Abstention follows Narayanan and Shmatikov's eccentricity rule: the attacker declines when (max − max₂)/σ falls below φ, computed from its own scores and never from the truth. c@1 credits a warranted abstention at the rate the attacker achieves where it does answer. Above φ = 0 the attack abstains on almost everything, which is the attack telling us it cannot tell which of its answers to trust.

Context and learned linkage

CorpusRulePerson sens.SpecificityContext linkage (Rank-1)Learned linkage (Rank-1)Learned (Rank-5)Ceiling on AGalleryQueriesChance
CARDIO:DEunion1.0000.86860.0000 ± 0.00000.0071 ± 0.01600.0508 ± 0.07050.0272071384.83e-03
vote 20.5780.98560.0400 ± 0.05960.0400 ± 0.05960.1476 ± 0.14390.027207734.83e-03
vote 30.5630.99630.0267 ± 0.03650.0400 ± 0.03650.1600 ± 0.07600.027207754.83e-03
intersection0.0051.00000.0000 ± 0.00000.0000 ± 0.00000.1000 ± 0.22360.02720764.83e-03
TABunion0.9960.8504no PERSON identity appears in both the gallery and the query half of the document-disjoint split (4160 and 4541 identities, 0 shared) — co-reference in this corpus is document-scoped, so a cross-document linkage attack has no true match to find
OntoNotesunion0.9350.9318no PERSON identity appears in both the gallery and the query half of the document-disjoint split (6661 and 6569 identities, 0 shared) — co-reference in this corpus is document-scoped, so a cross-document linkage attack has no true match to find
Enronunion0.9910.62350.0093 ± 0.00100.0394 ± 0.00300.0698 ± 0.00270.7203,69719,0592.70e-04
vote 20.8310.81200.0509 ± 0.00290.0954 ± 0.00750.1572 ± 0.00670.7203,6979,3552.70e-04
vote 30.8220.85570.0660 ± 0.00700.1120 ± 0.00810.1801 ± 0.00830.7203,6979,4082.70e-04
intersection0.0440.99950.2551 ± 0.03620.2875 ± 0.03390.4758 ± 0.05790.7203,6974942.70e-04

Five-fold cross-validation, mean ± one standard deviation over folds. Folds withhold labels, never candidates: a held-out person stays in the complete candidate list with every distractor, so the attacker is never told that a query has a match. Ceiling on A is the same attack against unmodified text, which is what gives the protected numbers a scale.

05Exposure

A corpus-level token rate is the least informative way to state what a pseudonymisation run left behind. Data-protection officers release documents and cases, and one unchanged mention puts a person back in the clear however many others were replaced.

CorpusPeople with a name in the clearEntity–document pairsDocumentsCasesMentions never foundMentions clipped
CARDIO:DE27 / 308 (8.8%)28 / 1,957 (1.4%)17 / 400 (4.2%)17 / 270 cases322
TAB139 / 8,701 (1.6%)139 / 8,701 (1.6%)90 / 1,268 (7.1%)90 / 1,268 documents91129
OntoNotes1,577 / 13,852 (11.4%)2,707 / 39,240 (6.9%)1,156 / 5,994 (19.3%)1,156 / 5,994 documents2,544672
Enron434 / 3,886 (11.2%)5,737 / 216,342 (2.7%)4,810 / 58,636 (8.2%)15 / 16 cases2,4424,022

Route one: the released patch sets, which is what the reader of the release sees, rather than the union of detected spans. The two differ because the engine writes one span of any overlapping group and skips the rest — 16.5% of resolved detections on CARDIO:DE and 46.0% on Enron, so where a short span wins over a longer one the rest of the name is published. Those are the clipped mentions, and no measure computed on detected spans can see them. The two person denominators are also kept apart: someone appearing in forty Enron messages is one person and forty entity–document pairs. The paper's leakage table uses the pair denominator, but on the other route — the next table.

The same exposure, measured on the detected spans

CorpusPeople with a name in the clearEntity–document pairsDocumentsMentions
CARDIO:DE1 / 308 (0.32%)1 / 1,957 (0.05%)1 / 400 (0.25%)1 / 2,800
TAB72 / 8,701 (0.83%)72 / 8,701 (0.83%)47 / 1,268 (3.7%)145 / 15,955
OntoNotes1,278 / 13,852 (9.2%)2,132 / 39,240 (5.4%)790 / 5,994 (13.2%)2,638 / 47,713
Enron125 / 3,886 (3.2%)3,469 / 216,342 (1.6%)3,265 / 58,636 (5.6%)4,097 / 272,503

Route two: the union of detected spans. A mention counts as exposed only when no detector covered it, so a name that was found and then clipped by the overlap rule is counted as protected here and as exposed above. Both questions are legitimate and the answers are not interchangeable: this route measures the detectors, the route above measures the release. The entity–document-pair column is the paper's Exp. column — the risk that a person is still named in a given document after processing, not the share of people, which is the column beside it.

Where the residue is

CorpusEntities with something in the clearDocumentsMentions never foundMentions clipped
CARDIO:DE211 / 7,209 (2.9%)155 / 400 (38.8%)125102
TAB2,648 / 30,468 (8.7%)879 / 1,268 (69.3%)2,5261,601
OntoNotes5,402 / 30,267 (17.8%)2,584 / 5,994 (43.1%)14,8864,398
Enron2,284 / 20,018 (11.4%)18,425 / 58,636 (31.4%)2,59123,343

The same accounting over every identifier class the conditions replace, not people alone, and on route one. Dates, quantities and miscellaneous spans are passed through by design and are in neither denominator.

On Enron the residue is now almost entirely clipping. Mentions the ensemble never found fall from 85,330 to 2,442 once the gold no longer counts ordinary words and role accounts as names. Mentions that were found and then truncated barely move — 4,104 to 4,022 — and are now 4,022 of the 6,464 person mentions the release leaves in the clear, 62.2% of them.

The dominant residual failure on this corpus is therefore not a detector missing a name. It is the engine resolving overlapping spans and writing a shorter one, so the rest of the name is published — a failure no measure computed on detected spans can see.

06Stability

A keyed pseudonym is only useful if it is stable, and only safe if it is not too stable. These are the ways the mapping fails.

CorpusRuleTypeScopeChainsCollisionFragmentationDrift
CARDIO:DEunionPERSONwithin document1,54910.11%1.48%—
CARDIO:DEunionPERSONcross-document1,27710.11%1.48%5.01%
CARDIO:DEunionLOCwithin document1,6520.00%1.09%—
CARDIO:DEunionLOCcross-document1,5480.00%1.09%0.65%
CARDIO:DEunionORGwithin document9440.95%1.91%—
CARDIO:DEunionORGcross-document8120.95%1.91%2.96%
CARDIO:DEvotePERSONwithin document1,3479.38%0.67%—
CARDIO:DEvotePERSONcross-document1,0569.38%0.67%4.07%
CARDIO:DEvoteLOCwithin document4740.00%0.00%—
CARDIO:DEvoteLOCcross-document4730.00%0.00%0.21%
CARDIO:DEvoteORGwithin document4490.00%0.00%—
CARDIO:DEvoteORGcross-document4300.00%0.00%0.47%
EnronunionPERSONwithin document290,8930.07%35.96%—
EnronunionPERSONcross-document12,6240.07%35.96%37.66%
EnronunionLOCwithin document3,7970.17%6.35%—
EnronunionLOCcross-document4170.17%6.35%23.74%
EnronunionORGwithin document64,82717.31%28.49%—
EnronunionORGcross-document2,89417.31%28.49%48.62%
EnronvotePERSONwithin document199,5360.43%8.23%—
EnronvotePERSONcross-document5,3190.43%8.23%44.59%
EnronvoteLOCwithin document2310.00%8.66%—
EnronvoteLOCcross-document160.00%8.66%62.50%
EnronvoteORGwithin document2,4290.04%9.51%—
EnronvoteORGcross-document1440.04%9.51%45.83%
OntoNotesunionPERSONwithin document12,07613.70%11.51%—
OntoNotesunionLOCwithin document9,84616.01%13.84%—
OntoNotesunionORGwithin document6,7097.65%16.96%—
OntoNotesvotePERSONwithin document6,8706.65%3.62%—
OntoNotesvoteLOCwithin document2,6712.51%2.77%—
OntoNotesvoteORGwithin document1,8602.15%2.96%—
TABunionPERSONwithin document9,0702.30%14.62%—
TABunionLOCwithin document5,7032.68%13.10%—
TABunionORGwithin document11,2221.34%22.13%—
TABvotePERSONwithin document8,1551.52%6.22%—
TABvoteLOCwithin document3,7561.94%0.72%—
TABvoteORGwithin document5,3351.19%1.87%—

A collision gives two distinct people one surrogate, fragmentation gives one person several inside a document, and drift changes a person's surrogate between documents. All three are properties of the keyed mapping in condition B; typed placeholders merge every entity of a type by design and have none of them. The paper reports three of these numbers; this is the grid they come from.

07About these numbers

Every experiment is driven by a config plus a seed, and each result records the library versions, model ids and commit hash that produced it. The page is generated from one JSON export of those result files by docs/build_site.py, so it cannot drift from the measurements the way a hand-maintained table does.

Text, and only text. The motivation is multimodal — a radiograph travels with its report, a cardiology study with its discharge letter, and releasing either half requires both to be protected — but the study itself is not. Nothing here is an image experiment: no scan is defaced, no burned-in pixel text is read, and no claim is made about what image de-identification costs. Every measurement on this page is made on written documents, which is the half of such a release that identifier replacement has to carry.

Corpora are not redistributed here. Several are bound by a data-use agreement, licensed, or contain real personal data. This export carries aggregates only: no corpus text, no surface form, no identity. CARDIO:DE in particular is single-user under its agreement with Heidelberg, and its gold names were inserted into an already de-identified release, which makes its name distribution synthetic and its clinical realism partial.

Enron is used deliberately rather than silently: it is the only public e-mail corpus with real names in a natural frequency distribution, and excluding it would have protected nobody who is not already in every copy of the corpus.

What the attacks do not show. Frequency alignment failing on these data does not establish safety against other adversaries. Linkage is measurable only where identity crosses documents, so TAB and OntoNotes figures understate rather than bound their risk. Candidate ranking presents ten names, which bounds an adversary holding a shortlist, not one searching a population. Every number describes one release under one key.