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.
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.
| Corpus | Operating point | Rule | Sens. | Spec. | Prec. | IW prec. | Cost ∥ (s) | Cost Σ (s) | Members |
|---|---|---|---|---|---|---|---|---|---|
| CARDIO:DE | max sensitivity | union | 0.992 | 0.9670 | 0.819 | 0.790 | 57.633 | 78.222 | 3 |
| fast sensitivity | union | 0.895 | 0.9769 | 0.866 | 0.827 | 0.301 | 0.564 | 2 | |
| max specificity | vote | 0.523 | 0.9997 | 0.980 | 0.982 | 116.875 | 117.593 | 3 | |
| fast specificity | single | 0.781 | 0.9862 | 0.912 | 0.881 | 0.263 | 0.263 | 1 | |
| TAB | max sensitivity | union | 0.925 | 0.8986 | 0.630 | 0.697 | 14.210 | 14.640 | 3 |
| fast sensitivity | union | 0.893 | 0.9242 | 0.676 | 0.735 | 0.219 | 0.496 | 3 | |
| max specificity | vote | 0.501 | 0.9959 | 0.965 | 0.968 | 98.110 | 98.387 | 3 | |
| fast specificity | single | 0.520 | 0.9934 | 0.945 | 0.939 | 0.117 | 0.117 | 1 | |
| OntoNotes | max sensitivity | union | 0.747 | 0.9763 | 0.822 | 0.845 | 9.450 | 9.651 | 3 |
| fast sensitivity | union | 0.684 | 0.9731 | 0.800 | 0.826 | 5.376 | 5.578 | 3 | |
| max specificity | union | 0.503 | 0.9960 | 0.942 | 0.946 | 0.103 | 0.202 | 2 | |
| fast specificity | union | 0.503 | 0.9960 | 0.942 | 0.946 | 0.103 | 0.202 | 2 | |
| Enron | max sensitivity | union | 0.997 | 0.7745 | 0.576 | 0.508 | 25.557 | 25.662 | 3 |
| fast sensitivity | union | 0.922 | 0.7420 | 0.524 | 0.499 | 0.057 | 0.134 | 3 | |
| max specificity | intersection | 0.529 | 0.9448 | 0.747 | 0.672 | 20.931 | 35.782 | 3 | |
| fast specificity | single | 0.692 | 0.8781 | 0.636 | 0.585 | 0.026 | 0.026 | 1 |
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.
| Corpus | Rule | Sensitivity | Specificity | Person sensitivity | Precision | Replacements |
|---|---|---|---|---|---|---|
| CARDIO:DE | union (max. sensitivity) | 0.9978 | 0.8686 | 0.9998 | 0.546 | 68,869 |
| vote 2 | 0.6517 | 0.9856 | 0.5783 | 0.909 | 30,276 | |
| vote 3 | 0.6234 | 0.9963 | 0.5626 | 0.974 | 26,226 | |
| intersection | 0.0012 | 1.0000 | 0.0045 | 1.000 | 22 | |
| TAB | union (max. sensitivity) | 0.9614 | 0.8504 | 0.9958 | 0.544 | 162,285 |
| vote 2 | 0.8538 | 0.9339 | 0.9602 | 0.703 | 130,663 | |
| vote 3 | 0.7711 | 0.9803 | 0.9481 | 0.879 | 85,093 | |
| intersection | 0.0059 | 1.0000 | 0.0197 | 0.993 | 729 | |
| OntoNotes | union (max. sensitivity) | 0.8011 | 0.9318 | 0.9352 | 0.662 | 291,493 |
| vote 2 | 0.6154 | 0.9821 | 0.8636 | 0.837 | 178,224 | |
| vote 3 | 0.4994 | 0.9926 | 0.7825 | 0.903 | 129,934 | |
| intersection | 0.0031 | 1.0000 | 0.0133 | 0.991 | 1,259 | |
| Enron | union (max. sensitivity) | 0.9981 | 0.6235 | 0.9906 | 0.449 | 1,487,379 |
| vote 2 | 0.8909 | 0.8120 | 0.8310 | 0.593 | 1,319,373 | |
| vote 3 | 0.7827 | 0.8557 | 0.8224 | 0.625 | 1,146,795 | |
| intersection | 0.0080 | 0.9995 | 0.0443 | 0.837 | 34,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.
gliner:urchade/gliner_multi-v2.1gliner:urchade/gliner_multi_pii-v1hf:Davlan/xlm-roberta-large-ner-hrlhf:StanfordAIMI/stanford-deidentifier-basehf:obi/deid_roberta_i2b2llm:GaleneAI/Magistral-Small-2509-FP8-Dynamicllm:Microsoft/Phi-4-mini-instructllm:RedHatAI/Mistral-Small-3.2-24B-Instruct-2506-FP8llm:RedHatAI/gemma-4-31B-it-FP8-blockllm:google/gemma-4-E4B-itllm:ibm-granite/granite-4.1-3bpresidioprivacy_taggerTwo 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.
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.
| Language | Source | Docs | Sensitivity | Specificity | Person sensitivity | Precision | Identifier tokens | Tokens |
|---|---|---|---|---|---|---|---|---|
| German | CARDIO:DE | 400 | 0.998 | 0.8686 | 1.000 | 0.546 | 18,468 | 885,059 |
| English | TAB | 1,268 | 0.961 | 0.8504 | 0.996 | 0.544 | 163,840 | 1,844,804 |
| Enron | 58,636 | 0.998 | 0.6235 | 0.991 | 0.449 | 3,648,256 | 15,507,925 | |
| OntoNotes (english) | 3,637 | 0.989 | 0.9359 | 0.991 | 0.715 | 191,169 | 2,192,105 | |
| Chinese | OntoNotes (chinese) | 1,911 | 0.868 | 0.9137 | 0.932 | 0.518 | 68,096 | 996,930 |
| Arabic | OntoNotes (arabic) | 446 | 0.614 | 0.9384 | 0.878 | 0.664 | 215,965 | 1,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.
| Language | Rule | Sensitivity | Specificity | Person sensitivity | Precision | Docs |
|---|---|---|---|---|---|---|
| English | union (max. sens.) | 0.989 | 0.9359 | 0.991 | 0.715 | 3,637 |
| vote-2 | 0.867 | 0.9763 | 0.949 | 0.833 | 3,637 | |
| vote-3 | 0.808 | 0.9889 | 0.936 | 0.897 | 3,637 | |
| intersection | 0.008 | 1.0000 | 0.031 | 0.991 | 3,637 | |
| Chinese | union (max. sens.) | 0.868 | 0.9137 | 0.932 | 0.518 | 1,911 |
| vote-2 | 0.628 | 0.9815 | 0.839 | 0.770 | 1,911 | |
| vote-3 | 0.434 | 0.9945 | 0.651 | 0.881 | 1,911 | |
| intersection | 0.000 | 1.0000 | 0.000 | — | 1,911 | |
| Arabic | union (max. sens.) | 0.614 | 0.9384 | 0.878 | 0.664 | 446 |
| vote-2 | 0.388 | 0.9911 | 0.783 | 0.891 | 446 | |
| vote-3 | 0.247 | 0.9969 | 0.669 | 0.935 | 446 | |
| intersection | 0.000 | 1.0000 | 0.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.
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.
| Corpus | Rule | A — original | B — surrogates | C — placeholders | Docs |
|---|---|---|---|---|---|
| CARDIO:DE | permissive (union of 15) | 1.000 ± 0.000 | 0.611 ± 0.082 | 0.004 ± 0.008 | 400 |
| precise (8 of 15) | 1.000 ± 0.000 | 0.973 ± 0.019 | 0.674 ± 0.082 | 400 | |
| TAB | permissive (union of 15) | 1.000 ± 0.000 | 0.478 ± 0.097 | 0.003 ± 0.011 | 1,268 |
| precise (8 of 15) | 1.000 ± 0.000 | 0.898 ± 0.050 | 0.634 ± 0.103 | 1,268 | |
| OntoNotes | permissive (union of 15) | 1.000 ± 0.000 | 0.295 ± 0.242 | 0.015 ± 0.106 | 5,994 |
| precise (8 of 15) | 1.000 ± 0.000 | 0.888 ± 0.156 | 0.788 ± 0.219 | 5,994 | |
| Enron | permissive (union of 15) | 1.000 ± 0.000 | 0.330 ± 0.172 | 0.034 ± 0.088 | 58,636 |
| precise (8 of 15) | 1.000 ± 0.000 | 0.754 ± 0.160 | 0.714 ± 0.179 | 58,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.
| Task | Rule | A — original | B — surrogates | C — placeholders | Docs |
|---|---|---|---|---|---|
medication_ie | permissive (union of 15) | 0.367 ± 0.181 | 0.346 ± 0.180 | 0.314 ± 0.199 | 390 |
| precise (8 of 15) | 0.371 ± 0.182 | 0.364 ± 0.189 | 0.381 ± 0.186 | 390 | |
medication_ie:in_narrative | permissive (union of 15) | 0.036 ± 0.066 | 0.030 ± 0.057 | 0.016 ± 0.039 | 328 |
| precise (8 of 15) | 0.041 ± 0.073 | 0.036 ± 0.069 | 0.039 ± 0.071 | 328 | |
medication_ie:listed | permissive (union of 15) | 0.376 ± 0.190 | 0.357 ± 0.189 | 0.331 ± 0.207 | 389 |
| precise (8 of 15) | 0.379 ± 0.189 | 0.373 ± 0.198 | 0.390 ± 0.195 | 389 | |
ner_agreement | permissive (union of 15) | 1.000 ± 0.000 | 0.611 ± 0.082 | 0.004 ± 0.008 | 400 |
| precise (8 of 15) | 1.000 ± 0.000 | 0.973 ± 0.019 | 0.674 ± 0.082 | 400 | |
section_classification | permissive (union of 15) | 0.749 ± 0.093 | 0.677 ± 0.097 | 0.711 ± 0.103 | 400 |
| precise (8 of 15) | 0.752 ± 0.090 | 0.709 ± 0.089 | 0.718 ± 0.090 | 400 |
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.
| Task | Rule | Pair | n | Test | Reference | Condition | Difference | q | Sig. | Effect |
|---|---|---|---|---|---|---|---|---|---|---|
medication_ie | permissive | A → B | 390 | wilcoxon | 0.367 ± 0.182 | 0.346 ± 0.181 | -0.020 ± 0.182 | 0.00556 | yes | -0.166 |
medication_ie | permissive | A → C | 390 | wilcoxon | 0.367 ± 0.182 | 0.314 ± 0.200 | -0.053 ± 0.205 | 5.71e-07 | yes | -0.306 |
medication_ie:listed | permissive | A → B | 389 | wilcoxon | 0.376 ± 0.190 | 0.357 ± 0.189 | -0.020 ± 0.191 | 0.0147 | yes | -0.147 |
medication_ie:listed | permissive | A → C | 389 | wilcoxon | 0.376 ± 0.190 | 0.331 ± 0.207 | -0.045 ± 0.214 | 7.07e-05 | yes | -0.249 |
ner_agreement | permissive | A → B | 400 | wilcoxon | 1.000 ± 0.000 | 0.611 ± 0.082 | -0.389 ± 0.082 | 2.73e-67 | yes | -1.000 |
ner_agreement | permissive | A → C | 400 | wilcoxon | 1.000 ± 0.000 | 0.004 ± 0.008 | -0.996 ± 0.008 | 3.03e-73 | yes | -1.000 |
section_classification | permissive | A → B | 400 | wilcoxon | 0.749 ± 0.093 | 0.677 ± 0.097 | -0.072 ± 0.086 | 1.58e-37 | yes | -0.846 |
section_classification | permissive | A → C | 400 | wilcoxon | 0.749 ± 0.093 | 0.711 ± 0.104 | -0.038 ± 0.089 | 2.57e-14 | yes | -0.531 |
medication_ie | precise | A → B | 390 | wilcoxon | 0.371 ± 0.182 | 0.364 ± 0.189 | -0.008 ± 0.178 | 0.798 | no | -0.015 |
medication_ie | precise | A → C | 390 | wilcoxon | 0.371 ± 0.182 | 0.381 ± 0.187 | +0.010 ± 0.175 | 0.235 | no | 0.095 |
medication_ie:listed | precise | A → B | 389 | wilcoxon | 0.379 ± 0.190 | 0.373 ± 0.198 | -0.006 ± 0.183 | 0.947 | no | 0.004 |
medication_ie:listed | precise | A → C | 389 | wilcoxon | 0.379 ± 0.190 | 0.390 ± 0.195 | +0.012 ± 0.183 | 0.185 | no | 0.102 |
ner_agreement | precise | A → B | 400 | wilcoxon | 1.000 ± 0.000 | 0.973 ± 0.019 | -0.027 ± 0.019 | 1.79e-66 | yes | -1.000 |
ner_agreement | precise | A → C | 400 | wilcoxon | 1.000 ± 0.000 | 0.674 ± 0.082 | -0.326 ± 0.082 | 5.46e-67 | yes | -1.000 |
section_classification | precise | A → B | 400 | wilcoxon | 0.752 ± 0.091 | 0.709 ± 0.090 | -0.043 ± 0.068 | 4.36e-25 | yes | -0.746 |
section_classification | precise | A → C | 400 | wilcoxon | 0.752 ± 0.091 | 0.718 ± 0.090 | -0.035 ± 0.078 | 2.29e-16 | yes | -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.
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.
| Corpus | Condition | Aux. context | Rank-1 | Rank-5 | mAP | × chance | Queries | Ensemble |
|---|---|---|---|---|---|---|---|---|
| CARDIO:DE | B — surrogates | no | 0.085 | 0.355 | 0.251 | 0.8× | 200 | recommended 13 |
| C — typed placeholders | no | 0.120 | 0.550 | 0.322 | 1.2× | 200 | recommended 13 | |
| A — unmodified | no | 1.000 | 1.000 | 1.000 | 10.0× | 200 | 15-detector pool | |
| A — unmodified | yes | 0.995 | 1.000 | 0.996 | 9.9× | 200 | 15-detector pool | |
| B — surrogates | no | 0.090 | 0.510 | 0.275 | 0.9× | 200 | 15-detector pool | |
| B — surrogates | yes | 0.160 | 0.550 | 0.340 | 1.6× | 200 | 15-detector pool | |
| C — typed placeholders | no | 0.135 | 0.585 | 0.336 | 1.4× | 200 | 15-detector pool | |
| C — typed placeholders | yes | 0.220 | 0.690 | 0.422 | 2.2× | 200 | 15-detector pool | |
| TAB | B — surrogates | no | 0.110 | 0.575 | 0.317 | 1.1× | 200 | recommended 13 |
| B — surrogates | yes | 0.105 | 0.565 | 0.320 | 1.0× | 200 | recommended 13 | |
| B — attacker told the scheme | no | 0.165 | 0.605 | 0.360 | 1.6× | 200 | recommended 13 | |
| B — attacker masks names | no | 0.145 | 0.650 | 0.374 | 1.4× | 200 | recommended 13 | |
| C — typed placeholders | no | 0.340 | 0.845 | 0.547 | 3.4× | 200 | recommended 13 | |
| C — typed placeholders | yes | 0.300 | 0.735 | 0.470 | 3.0× | 200 | recommended 13 | |
| A — unmodified | no | 0.995 | 1.000 | 0.996 | 9.9× | 200 | 15-detector pool | |
| A — unmodified | yes | 1.000 | 1.000 | 1.000 | 10.0× | 200 | 15-detector pool | |
| B — surrogates | no | 0.085 | 0.500 | 0.285 | 0.8× | 200 | 15-detector pool | |
| B — surrogates | yes | 0.120 | 0.510 | 0.302 | 1.2× | 200 | 15-detector pool | |
| B — attacker told the scheme | no | 0.205 | 0.655 | 0.408 | 2.0× | 200 | 15-detector pool | |
| B — attacker masks names | no | 0.215 | 0.760 | 0.438 | 2.1× | 200 | 15-detector pool | |
| C — typed placeholders | no | 0.290 | 0.850 | 0.514 | 2.9× | 200 | 15-detector pool | |
| C — typed placeholders | yes | 0.310 | 0.715 | 0.489 | 3.1× | 200 | 15-detector pool | |
| OntoNotes | B — surrogates | no | 0.290 | 0.860 | 0.523 | 2.9× | 200 | recommended 13 |
| C — typed placeholders | no | 0.630 | 0.910 | 0.749 | 6.3× | 200 | recommended 13 | |
| A — unmodified | no | 0.990 | 0.995 | 0.993 | 9.9× | 200 | 15-detector pool | |
| A — unmodified | yes | 0.985 | 0.995 | 0.991 | 9.8× | 200 | 15-detector pool | |
| B — surrogates | no | 0.310 | 0.900 | 0.548 | 3.1× | 200 | 15-detector pool | |
| B — surrogates | yes | 0.365 | 0.915 | 0.590 | 3.6× | 200 | 15-detector pool | |
| C — typed placeholders | no | 0.590 | 0.900 | 0.733 | 5.9× | 200 | 15-detector pool | |
| C — typed placeholders | yes | 0.660 | 0.925 | 0.780 | 6.6× | 200 | 15-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.
| Corpus | Surfaces observed | Aligned — oracle prior | Aligned — public prior | Read in clear | Public prior | Prior size | Chance | c@1 | ρ |
|---|---|---|---|---|---|---|---|---|---|
| CARDIO:DE | 25,677 | 1 | 0 | 7 | German surnames | 54,830 | 1.82e-05 | 0.00027 | 0.898 |
| TAB | 20,147 | 1 | 0 | 95 | US Census 2010 surnames | 162,240 | 6.16e-06 | 0.00472 | 0.849 |
| OntoNotes | 28,153 | 1 | 0 | 166 | US Census 2010 surnames | 162,240 | 6.16e-06 | 0.00590 | 0.789 |
| Enron | 106,587 | 0 | 0 | 152 | US Census 2010 surnames | 162,240 | 6.16e-06 | 0.00143 | 0.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.
| Corpus | Prior | Size | Vintage | Aligned | Read in clear |
|---|---|---|---|---|---|
| CARDIO:DE | German surnames top-100 | 100 | 2010 | 0 | 7 |
| German surnames top-1,000 | 1,000 | 2010 | 0 | 7 | |
| German surnames top-10,000 | 10,000 | 2010 | 0 | 7 | |
| German surnames | 54,830 | 2010 | 0 | 7 | |
| German given names (male) top-100 | 100 | 1930-1969 | 0 | 7 | |
| German given names (male) | 548 | 1930-1969 | 0 | 7 | |
| German given names (female) top-100 | 100 | 1930-1969 | 0 | 7 | |
| German given names (female) | 597 | 1930-1969 | 0 | 7 | |
| TAB | US Census 2010 surnames top-100 | 100 | 2010 | 0 | 95 |
| US Census 2010 surnames top-1,000 | 1,000 | 2010 | 0 | 95 | |
| US Census 2010 surnames top-10,000 | 10,000 | 2010 | 0 | 95 | |
| US Census 2010 surnames | 162,240 | 2010 | 0 | 95 | |
| UCI given names top-100 | 100 | 1880-2019 | 0 | 95 | |
| UCI given names top-1,000 | 1,000 | 1880-2019 | 0 | 95 | |
| UCI given names top-10,000 | 10,000 | 1880-2019 | 0 | 95 | |
| UCI given names | 133,673 | 1880-2019 | 0 | 95 | |
| OntoNotes | US Census 2010 surnames top-100 | 100 | 2010 | 0 | 166 |
| US Census 2010 surnames top-1,000 | 1,000 | 2010 | 1 | 166 | |
| US Census 2010 surnames top-10,000 | 10,000 | 2010 | 0 | 166 | |
| US Census 2010 surnames | 162,240 | 2010 | 0 | 166 | |
| UCI given names top-100 | 100 | 1880-2019 | 0 | 166 | |
| UCI given names top-1,000 | 1,000 | 1880-2019 | 0 | 166 | |
| UCI given names top-10,000 | 10,000 | 1880-2019 | 0 | 166 | |
| UCI given names | 133,673 | 1880-2019 | 0 | 166 | |
| Enron | US Census 2010 surnames top-100 | 100 | 2010 | 0 | 152 |
| US Census 2010 surnames top-1,000 | 1,000 | 2010 | 0 | 152 | |
| US Census 2010 surnames top-10,000 | 10,000 | 2010 | 0 | 152 | |
| US Census 2010 surnames | 162,240 | 2010 | 0 | 152 | |
| UCI given names top-100 | 100 | 1880-2019 | 0 | 152 | |
| UCI given names top-1,000 | 1,000 | 1880-2019 | 0 | 152 | |
| UCI given names top-10,000 | 10,000 | 1880-2019 | 0 | 152 | |
| UCI given names | 133,673 | 1880-2019 | 0 | 152 |
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.
| Corpus | Prior | φ | Answered | Abstained | Accuracy (answered) | c@1 |
|---|---|---|---|---|---|---|
| CARDIO:DE | corpus-internal | 0.00 | 25,677 | 0 | 0.00031 | 0.00031 |
| corpus-internal | 0.05 | 0 | 25,677 | 0.00000 | 0.00000 | |
| corpus-internal | 0.25 | 0 | 25,677 | 0.00000 | 0.00000 | |
| corpus-internal | 1.50 | 0 | 25,677 | 0.00000 | 0.00000 | |
| German surnames | 0.00 | 25,677 | 0 | 0.00027 | 0.00027 | |
| German surnames | 0.05 | 11 | 25,666 | 0.00000 | 0.00000 | |
| German surnames | 0.25 | 0 | 25,677 | 0.00000 | 0.00000 | |
| German surnames | 1.50 | 0 | 25,677 | 0.00000 | 0.00000 | |
| German given names (male) | 0.00 | 25,677 | 0 | 0.00027 | 0.00027 | |
| German given names (male) | 0.05 | 0 | 25,677 | 0.00000 | 0.00000 | |
| German given names (male) | 0.25 | 0 | 25,677 | 0.00000 | 0.00000 | |
| German given names (male) | 1.50 | 0 | 25,677 | 0.00000 | 0.00000 | |
| German given names (female) | 0.00 | 25,677 | 0 | 0.00027 | 0.00027 | |
| German given names (female) | 0.05 | 0 | 25,677 | 0.00000 | 0.00000 | |
| German given names (female) | 0.25 | 0 | 25,677 | 0.00000 | 0.00000 | |
| German given names (female) | 1.50 | 0 | 25,677 | 0.00000 | 0.00000 | |
| TAB | corpus-internal | 0.00 | 20,147 | 0 | 0.00476 | 0.00476 |
| corpus-internal | 0.05 | 0 | 20,147 | 0.00000 | 0.00000 | |
| corpus-internal | 0.25 | 0 | 20,147 | 0.00000 | 0.00000 | |
| corpus-internal | 1.50 | 0 | 20,147 | 0.00000 | 0.00000 | |
| US Census 2010 surnames | 0.00 | 20,147 | 0 | 0.00472 | 0.00472 | |
| US Census 2010 surnames | 0.05 | 34 | 20,113 | 0.02941 | 0.00010 | |
| US Census 2010 surnames | 0.25 | 27 | 20,120 | 0.03704 | 0.00010 | |
| US Census 2010 surnames | 1.50 | 0 | 20,147 | 0.00000 | 0.00000 | |
| UCI given names | 0.00 | 20,147 | 0 | 0.00472 | 0.00472 | |
| UCI given names | 0.05 | 7 | 20,140 | 0.00000 | 0.00000 | |
| UCI given names | 0.25 | 0 | 20,147 | 0.00000 | 0.00000 | |
| UCI given names | 1.50 | 0 | 20,147 | 0.00000 | 0.00000 | |
| OntoNotes | corpus-internal | 0.00 | 28,153 | 0 | 0.00593 | 0.00593 |
| corpus-internal | 0.05 | 0 | 28,153 | 0.00000 | 0.00000 | |
| corpus-internal | 0.25 | 0 | 28,153 | 0.00000 | 0.00000 | |
| corpus-internal | 1.50 | 0 | 28,153 | 0.00000 | 0.00000 | |
| US Census 2010 surnames | 0.00 | 28,153 | 0 | 0.00590 | 0.00590 | |
| US Census 2010 surnames | 0.05 | 17 | 28,136 | 0.00000 | 0.00000 | |
| US Census 2010 surnames | 0.25 | 12 | 28,141 | 0.00000 | 0.00000 | |
| US Census 2010 surnames | 1.50 | 0 | 28,153 | 0.00000 | 0.00000 | |
| UCI given names | 0.00 | 28,153 | 0 | 0.00590 | 0.00590 | |
| UCI given names | 0.05 | 7 | 28,146 | 0.00000 | 0.00000 | |
| UCI given names | 0.25 | 0 | 28,153 | 0.00000 | 0.00000 | |
| UCI given names | 1.50 | 0 | 28,153 | 0.00000 | 0.00000 | |
| Enron | corpus-internal | 0.00 | 106,587 | 0 | 0.00143 | 0.00143 |
| corpus-internal | 0.05 | 0 | 106,587 | 0.00000 | 0.00000 | |
| corpus-internal | 0.25 | 0 | 106,587 | 0.00000 | 0.00000 | |
| corpus-internal | 1.50 | 0 | 106,587 | 0.00000 | 0.00000 | |
| US Census 2010 surnames | 0.00 | 106,587 | 0 | 0.00143 | 0.00143 | |
| US Census 2010 surnames | 0.05 | 15 | 106,572 | 0.00000 | 0.00000 | |
| US Census 2010 surnames | 0.25 | 8 | 106,579 | 0.00000 | 0.00000 | |
| US Census 2010 surnames | 1.50 | 0 | 106,587 | 0.00000 | 0.00000 | |
| UCI given names | 0.00 | 106,587 | 0 | 0.00143 | 0.00143 | |
| UCI given names | 0.05 | 4 | 106,583 | 0.00000 | 0.00000 | |
| UCI given names | 0.25 | 0 | 106,587 | 0.00000 | 0.00000 | |
| UCI given names | 1.50 | 0 | 106,587 | 0.00000 | 0.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.
| Corpus | Rule | Person sens. | Specificity | Context linkage (Rank-1) | Learned linkage (Rank-1) | Learned (Rank-5) | Ceiling on A | Gallery | Queries | Chance |
|---|---|---|---|---|---|---|---|---|---|---|
| CARDIO:DE | union | 1.000 | 0.8686 | 0.0000 ± 0.0000 | 0.0071 ± 0.0160 | 0.0508 ± 0.0705 | 0.027 | 207 | 138 | 4.83e-03 |
| vote 2 | 0.578 | 0.9856 | 0.0400 ± 0.0596 | 0.0400 ± 0.0596 | 0.1476 ± 0.1439 | 0.027 | 207 | 73 | 4.83e-03 | |
| vote 3 | 0.563 | 0.9963 | 0.0267 ± 0.0365 | 0.0400 ± 0.0365 | 0.1600 ± 0.0760 | 0.027 | 207 | 75 | 4.83e-03 | |
| intersection | 0.005 | 1.0000 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 0.1000 ± 0.2236 | 0.027 | 207 | 6 | 4.83e-03 | |
| TAB | union | 0.996 | 0.8504 | no 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 | ||||||
| OntoNotes | union | 0.935 | 0.9318 | no 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 | ||||||
| Enron | union | 0.991 | 0.6235 | 0.0093 ± 0.0010 | 0.0394 ± 0.0030 | 0.0698 ± 0.0027 | 0.720 | 3,697 | 19,059 | 2.70e-04 |
| vote 2 | 0.831 | 0.8120 | 0.0509 ± 0.0029 | 0.0954 ± 0.0075 | 0.1572 ± 0.0067 | 0.720 | 3,697 | 9,355 | 2.70e-04 | |
| vote 3 | 0.822 | 0.8557 | 0.0660 ± 0.0070 | 0.1120 ± 0.0081 | 0.1801 ± 0.0083 | 0.720 | 3,697 | 9,408 | 2.70e-04 | |
| intersection | 0.044 | 0.9995 | 0.2551 ± 0.0362 | 0.2875 ± 0.0339 | 0.4758 ± 0.0579 | 0.720 | 3,697 | 494 | 2.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.
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.
| Corpus | People with a name in the clear | Entity–document pairs | Documents | Cases | Mentions never found | Mentions clipped |
|---|---|---|---|---|---|---|
| CARDIO:DE | 27 / 308 (8.8%) | 28 / 1,957 (1.4%) | 17 / 400 (4.2%) | 17 / 270 cases | 32 | 2 |
| TAB | 139 / 8,701 (1.6%) | 139 / 8,701 (1.6%) | 90 / 1,268 (7.1%) | 90 / 1,268 documents | 91 | 129 |
| OntoNotes | 1,577 / 13,852 (11.4%) | 2,707 / 39,240 (6.9%) | 1,156 / 5,994 (19.3%) | 1,156 / 5,994 documents | 2,544 | 672 |
| Enron | 434 / 3,886 (11.2%) | 5,737 / 216,342 (2.7%) | 4,810 / 58,636 (8.2%) | 15 / 16 cases | 2,442 | 4,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.
| Corpus | People with a name in the clear | Entity–document pairs | Documents | Mentions |
|---|---|---|---|---|
| CARDIO:DE | 1 / 308 (0.32%) | 1 / 1,957 (0.05%) | 1 / 400 (0.25%) | 1 / 2,800 |
| TAB | 72 / 8,701 (0.83%) | 72 / 8,701 (0.83%) | 47 / 1,268 (3.7%) | 145 / 15,955 |
| OntoNotes | 1,278 / 13,852 (9.2%) | 2,132 / 39,240 (5.4%) | 790 / 5,994 (13.2%) | 2,638 / 47,713 |
| Enron | 125 / 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.
| Corpus | Entities with something in the clear | Documents | Mentions never found | Mentions clipped |
|---|---|---|---|---|
| CARDIO:DE | 211 / 7,209 (2.9%) | 155 / 400 (38.8%) | 125 | 102 |
| TAB | 2,648 / 30,468 (8.7%) | 879 / 1,268 (69.3%) | 2,526 | 1,601 |
| OntoNotes | 5,402 / 30,267 (17.8%) | 2,584 / 5,994 (43.1%) | 14,886 | 4,398 |
| Enron | 2,284 / 20,018 (11.4%) | 18,425 / 58,636 (31.4%) | 2,591 | 23,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.
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.
| Corpus | Rule | Type | Scope | Chains | Collision | Fragmentation | Drift |
|---|---|---|---|---|---|---|---|
| CARDIO:DE | union | PERSON | within document | 1,549 | 10.11% | 1.48% | — |
| CARDIO:DE | union | PERSON | cross-document | 1,277 | 10.11% | 1.48% | 5.01% |
| CARDIO:DE | union | LOC | within document | 1,652 | 0.00% | 1.09% | — |
| CARDIO:DE | union | LOC | cross-document | 1,548 | 0.00% | 1.09% | 0.65% |
| CARDIO:DE | union | ORG | within document | 944 | 0.95% | 1.91% | — |
| CARDIO:DE | union | ORG | cross-document | 812 | 0.95% | 1.91% | 2.96% |
| CARDIO:DE | vote | PERSON | within document | 1,347 | 9.38% | 0.67% | — |
| CARDIO:DE | vote | PERSON | cross-document | 1,056 | 9.38% | 0.67% | 4.07% |
| CARDIO:DE | vote | LOC | within document | 474 | 0.00% | 0.00% | — |
| CARDIO:DE | vote | LOC | cross-document | 473 | 0.00% | 0.00% | 0.21% |
| CARDIO:DE | vote | ORG | within document | 449 | 0.00% | 0.00% | — |
| CARDIO:DE | vote | ORG | cross-document | 430 | 0.00% | 0.00% | 0.47% |
| Enron | union | PERSON | within document | 290,893 | 0.07% | 35.96% | — |
| Enron | union | PERSON | cross-document | 12,624 | 0.07% | 35.96% | 37.66% |
| Enron | union | LOC | within document | 3,797 | 0.17% | 6.35% | — |
| Enron | union | LOC | cross-document | 417 | 0.17% | 6.35% | 23.74% |
| Enron | union | ORG | within document | 64,827 | 17.31% | 28.49% | — |
| Enron | union | ORG | cross-document | 2,894 | 17.31% | 28.49% | 48.62% |
| Enron | vote | PERSON | within document | 199,536 | 0.43% | 8.23% | — |
| Enron | vote | PERSON | cross-document | 5,319 | 0.43% | 8.23% | 44.59% |
| Enron | vote | LOC | within document | 231 | 0.00% | 8.66% | — |
| Enron | vote | LOC | cross-document | 16 | 0.00% | 8.66% | 62.50% |
| Enron | vote | ORG | within document | 2,429 | 0.04% | 9.51% | — |
| Enron | vote | ORG | cross-document | 144 | 0.04% | 9.51% | 45.83% |
| OntoNotes | union | PERSON | within document | 12,076 | 13.70% | 11.51% | — |
| OntoNotes | union | LOC | within document | 9,846 | 16.01% | 13.84% | — |
| OntoNotes | union | ORG | within document | 6,709 | 7.65% | 16.96% | — |
| OntoNotes | vote | PERSON | within document | 6,870 | 6.65% | 3.62% | — |
| OntoNotes | vote | LOC | within document | 2,671 | 2.51% | 2.77% | — |
| OntoNotes | vote | ORG | within document | 1,860 | 2.15% | 2.96% | — |
| TAB | union | PERSON | within document | 9,070 | 2.30% | 14.62% | — |
| TAB | union | LOC | within document | 5,703 | 2.68% | 13.10% | — |
| TAB | union | ORG | within document | 11,222 | 1.34% | 22.13% | — |
| TAB | vote | PERSON | within document | 8,155 | 1.52% | 6.22% | — |
| TAB | vote | LOC | within document | 3,756 | 1.94% | 0.72% | — |
| TAB | vote | ORG | within document | 5,335 | 1.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.
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.