Open source PII detection benchmark
Compare PII detectors on Russian, English and multilingual datasets using exact masking and character-level metrics.
Start with what you need to protect
Compare personal data, secrets, and the datasets where detectors struggle.
Performance from easy to extreme
Dataset average · see how much sensitive data each detector hides completely at every difficulty level. Higher is better.
| Detector | Easy | Medium | Hard | Extreme |
|---|---|---|---|---|
| 86.7% | 79.6% | 75.1% | 36.3% | |
| 94.7% | 81.6% | 39.9% | 26.0% | |
| 75.0% | 72.6% | 61.4% | 26.4% | |
| 79.9% | 62.5% | 70.6% | 22.2% | |
| 69.6% | 66.3% | 68.1% | 27.7% | |
| 69.4% | 66.3% | 56.8% | 33.8% | |
| 68.7% | 62.7% | 58.6% | 31.9% | |
| 79.5% | 65.2% | 37.7% | 10.9% | |
| 80.0% | 62.3% | 29.4% | 17.1% | |
| 59.9% | 61.1% | 70.0% | 23.9% | |
| 72.7% | 58.8% | 30.9% | 9.4% | |
| 54.4% | 56.9% | 35.6% | 13.0% | |
| 77.2% | 58.8% | 39.5% | 19.9% | |
| 59.9% | 50.0% | 61.4% | 27.3% | |
| 62.3% | 54.4% | 47.3% | 19.6% | |
| 65.3% | 54.7% | 35.9% | 18.7% | |
| 69.9% | 52.8% | 32.9% | 15.6% | |
| 68.1% | 50.8% | 28.9% | 10.6% | |
| 63.0% | 51.9% | 31.3% | 21.7% | |
| 46.5% | 46.8% | 50.3% | 18.9% | |
| 49.5% | 40.7% | 60.9% | 18.7% | |
| 53.7% | 44.7% | 39.1% | 19.3% | |
| 50.8% | 39.4% | 71.0% | 11.3% | |
| 66.8% | 52.7% | 32.5% | 18.2% | |
| 46.8% | 37.7% | 60.1% | 16.4% | |
| 45.6% | 38.1% | 55.6% | 41.4% | |
| 34.4% | 30.0% | 47.3% | 17.5% | |
| 34.1% | 23.8% | 37.4% | 5.6% | |
| 28.1% | 20.2% | 47.0% | 25.6% | |
| 24.8% | 18.3% | 42.5% | 8.8% | |
| 12.8% | 24.8% | 3.4% | 1.7% | |
pplx+cpu-int8Not all datasets | 98.8% | 94.3% | 47.9% | — |
pplx+homoglyphNot all datasets | — | 93.8% | 78.7% | — |
gliner2-fastino-ruNot all datasets | 78.6% | 80.0% | 78.6% | 35.8% |
HiveTrace OmniNot all datasets | 84.5% | 74.6% | 64.5% | 36.3% |
gliner-nvidia+sent300Not all datasets | 65.9% | 72.7% | 73.2% | — |
gliner25-fastino+sent300Not all datasets | 66.8% | 72.5% | 72.1% | — |
nym-base+homoglyphNot all datasets | — | 71.3% | 72.0% | — |
gliner2-hivetrace-omni-ruNot all datasets | 79.0% | 73.3% | 62.8% | 35.9% |
openai-base-onnxNot all datasets | 76.7% | 71.7% | 22.3% | — |
gliner25-fastino+ov100Not all datasets | 69.2% | 71.9% | 71.8% | — |
nym-base+sent300Not all datasets | 61.4% | 66.3% | 62.2% | — |
pplx+sent300Not all datasets | 84.3% | 70.3% | 27.9% | — |
gliner25-fastino-ruNot all datasets | 75.4% | 65.4% | 62.5% | 31.4% |
nym-baseNot all datasets | 73.9% | 62.7% | 67.4% | 16.5% |
gliner-nvidiaNot all datasets | 82.8% | 68.9% | 63.6% | 25.9% |
nym-base+ov100Not all datasets | 60.8% | 63.6% | 67.1% | — |
ru-legal-ner+cpuNot all datasets | — | 62.9% | — | — |
nym-smallNot all datasets | 73.8% | 61.0% | 63.8% | 11.8% |
gliner-nvidia+homoglyphNot all datasets | — | 68.7% | 60.1% | — |
pplx+ov100Not all datasets | 87.2% | 68.2% | 23.3% | — |
ru-legal-ner+homoglyphNot all datasets | — | 68.6% | 57.3% | — |
nym-base+cpu-int8Not all datasets | 94.4% | 63.4% | 41.5% | — |
gliner-nvidia+ov100Not all datasets | 63.5% | 60.0% | 65.4% | — |
openmed-multilingualNot all datasets | 67.7% | 53.7% | 30.7% | 6.1% |
gliner-nvidia-ruNot all datasets | 67.5% | 60.9% | 58.9% | 21.4% |
gliner2-hivetrace-uniNot all datasets | 65.2% | 53.3% | 28.2% | 23.2% |
opf-ru-v2+homoglyphNot all datasets | — | 68.7% | 44.7% | — |
opf-ruNot all datasets | 62.1% | 54.9% | 32.7% | 11.7% |
openmed-nemotronNot all datasets | 61.4% | 48.1% | 29.4% | 8.3% |
presidio-ruNot all datasets | — | 54.5% | — | — |
gliner25-fastino+nochunkNot all datasets | 64.8% | 58.1% | 49.9% | — |
gliner2-vladlinv+homoglyphNot all datasets | — | 60.8% | 42.4% | — |
gliner25-fastino-ru+nochunkNot all datasets | 59.3% | 53.8% | 50.7% | — |
gliner-urchade-ruNot all datasets | 50.7% | 51.0% | 45.7% | 20.3% |
gravitee-small+cpu-int8Not all datasets | 71.1% | 51.9% | 40.2% | — |
ru-legal-ner+sent300Not all datasets | 61.4% | 40.6% | 32.5% | — |
gliner-multi-v21-ruNot all datasets | 51.8% | 42.6% | 50.3% | 25.0% |
kalyan-ettinNot all datasets | 60.2% | 45.0% | 27.8% | 8.8% |
gliner2-vladlinv-ruNot all datasets | 72.6% | 53.3% | 39.7% | 21.7% |
opf-ru-v2+sent300Not all datasets | 64.4% | 41.8% | 22.7% | — |
ru-legal-ner+ov100Not all datasets | 59.5% | 34.4% | 29.7% | — |
opf-ru-v2+ov100Not all datasets | 64.1% | 39.4% | 22.0% | — |
ru-legal-ner+cpu-int8Not all datasets | 43.4% | 44.4% | 6.1% | — |
fef2-secret-ru+cpu-int8Not all datasets | 3.6% | 31.9% | 2.1% | — |
davlan-mbert+cpu-int8Not all datasets | 55.3% | 25.0% | 54.5% | — |
ner-ru-gherman+homoglyphNot all datasets | — | 1.4% | 31.2% | — |
mmbert32k+cpu-int8Not all datasets | 50.9% | 29.1% | 5.9% | — |
gliner2-hivetrace-uni-ruNot all datasets | 26.3% | 22.5% | 31.3% | 16.1% |
kalyan-ettin+cpu-int8Not all datasets | 41.6% | 21.0% | 7.8% | — |
mmbert32k+nochunkNot all datasets | 24.9% | 31.4% | 16.6% | — |
ner-ru-gherman-onnxNot all datasets | 55.0% | 18.0% | 14.4% | — |
davlan-xlmr+cpu-int8Not all datasets | 51.4% | 18.7% | 36.2% | — |
ner-ru-gherman+cpu-int8Not all datasets | 52.1% | 16.9% | 13.8% | — |
spacy-alrosaitNot all datasets | 15.7% | 11.8% | 20.3% | 7.0% |
gliner-pii-edge+cpu-int8Not all datasets | 17.5% | 15.8% | 3.3% | — |
detect-secretsNot all datasets | — | 1.6% | — | — |
kingfisherNot all datasets | — | 1.0% | — | — |
noseyparkerNot all datasets | — | 1.0% | — | — |
titusNot all datasets | — | 1.0% | — | — |
credsweeper-nomlNot all datasets | — | 0.7% | — | — |
gliner-pii-base+cpu-int8Not all datasets | <0.1% | 1.2% | 2.3% | — |
credsweeperNot all datasets | — | 0.5% | — | — |
deepsecretsNot all datasets | — | 0.1% | — | — |
trufflehogNot all datasets | — | 0.1% | — | — |
betterleaksNot all datasets | 0.0% | 0.2% | — | — |
gitleaksNot all datasets | 0.0% | 0.2% | — | — |
gliner-multi-v21-ru+cpu-int8Not all datasets | — | 0.0% | — | — |
gliner-multi-v21+cpu-int8Not all datasets | 0.0% | 0.0% | 0.0% | — |
gliner-nvidia-ru+cpu-int8Not all datasets | — | 0.0% | — | — |
gliner-nvidia+cpu-int8Not all datasets | 0.0% | 0.0% | 0.0% | — |
gliner-urchade-ru+cpu-int8Not all datasets | — | 0.0% | — | — |
gliner-urchade+cpu-int8Not all datasets | 0.0% | 0.0% | 0.0% | — |
PII datasets vs secrets datasets
Pooled annotations · compare how well each detector hides labeled items in datasets assigned to each task.
Use one detector or combine several?
See what combining detectors adds and how much extra text it masks.
One detector vs several combined
See whether combining detectors hides more sensitive data and how much extra text it masks.
| Detector setup | Completely hidden, % ↑ 0%50%100% | Extra text masked, % ↓ | Not fully hidden, items ↓ |
|---|---|---|---|
| Four detectorsFastino + PPLX + BardsAI EU + mmBERT | 12,533 | ||
| CPU + GPUFastino + PPLX + BardsAI EU | 13,268 | ||
| Three detectorsFastino + PPLX + mmBERT | 15,777 | ||
| Two detectorsFastino + PPLX | 18,094 | ||
| Single detectorGLiNER2 Fastino | 44,412 | ||
| Single detectorPPLX | 56,689 |
Find the best detector for each data type
Focus on the sensitive information your application needs to protect.
Hardest datasets
Higher scores mean the dataset was harder for the tested detectors.
Best detector by data type
Pooled annotations by annotation type · choose what sensitive data you need to hide.
Detector leaderboard
31 detector setups · 31 datasets · sorted by fully hidden descending
| Compare | Rank | Family | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 01 | gliner2-fastino | GLINER2 | 80.11% | 87.02% | 3.03% | 0.797 | 14.93 | 0.27 | |
| 02 | pplx | PPLX | 74.62% | 78.72% | 3.56% | 0.771 | 9.94 | 2.20 | |
| 03 | nuner-zero | GLINER | 71.88% | 78.97% | 2.89% | 0.788 | 20.12 | 0.38 | |
| 04 | bardsai-eu | ONNX | 66.54% | 81.26% | 2.51% | 0.740 | — | — | |
| 05 | gliner2-large | GLINER2 | 66.40% | 72.77% | 3.56% | 0.723 | 24.69 | 0.61 | |
| 06 | gliner-urchade | GLINER | 65.91% | 72.94% | 3.17% | 0.717 | 9.68 | 0.20 | |
| 07 | gliner25-fastino | GLINER2 | 62.74% | 69.12% | 2.72% | 0.747 | 12.47 | 0.15 | |
| 08 | apararti | OPF | 62.00% | 69.73% | 4.13% | 0.696 | 4.09 | 1.69 | |
| 09 | openai-base | OPF | 59.22% | 64.88% | 2.84% | 0.687 | 4.21 | 1.80 | |
| 10 | gliner-pii-edge | GLINER | 56.77% | 67.94% | 4.01% | 0.660 | 6.88 | 5.80 | |
| 11 | opf-kz-ru | OPF | 55.88% | 64.56% | 3.64% | 0.670 | 3.39 | 1.59 | |
| 12 | pii-shield-onnx | ONNX | 55.74% | 69.11% | 21.26% | 0.466 | — | — | |
| 13 | ru-pii-ner | RUPII | 53.74% | 57.94% | 2.84% | 0.631 | 1.42 | — | |
| 14 | gliner-multi-v21 | GLINER | 51.87% | 60.74% | 2.82% | 0.570 | 9.89 | 0.19 | |
| 15 | gliner-stream-pii | GLINER | 51.58% | 63.76% | 2.48% | 0.650 | 8.20 | 0.21 | |
| 16 | mmbert32k | HF | 50.32% | 78.44% | 3.39% | 0.654 | 2.32 | 0.18 | |
| 17 | traciora | OPF | 48.00% | 58.87% | 3.12% | 0.658 | 3.29 | 1.36 | |
| 18 | opf-ru-v2 | OPF | 46.86% | 56.44% | 1.97% | 0.648 | 3.47 | — | |
| 19 | gliner2-vladlinv | GLINER2 | 46.27% | 49.81% | 0.57% | 0.596 | 14.49 | 0.17 | |
| 20 | gliner-pii-base | GLINER | 45.01% | 50.96% | 1.89% | 0.576 | 5.24 | 0.16 | |
| 21 | davlan-xlmr | HF | 44.82% | 52.27% | 0.99% | 0.533 | 2.26 | 0.14 | |
| 22 | ru-legal-ner | HF | 44.03% | 65.04% | 9.58% | 0.462 | 0.20 | 0.13 | |
| 23 | stanza-ru | STANZA | 43.87% | 51.43% | 10.72% | 0.346 | 8.35 | — | |
| 24 | gravitee-small | HF | 43.05% | 50.39% | 4.36% | 0.518 | 0.66 | — | |
| 25 | davlan-mbert | HF | 42.76% | 49.78% | 1.14% | 0.513 | 2.51 | 0.15 | |
| 26 | ner-ru-yqelz | HF | 40.16% | 50.20% | 7.89% | 0.485 | 7.08 | 0.18 | |
| 27 | fef2-secret-ru | HF | 35.31% | 42.97% | 1.11% | 0.532 | 3.05 | 0.15 | |
| 28 | ner-ru-gherman | HF | 28.13% | 49.68% | 0.44% | 0.483 | 2.48 | 0.15 | |
| 29 | spacy-ru-lg | SPACY | 27.17% | 31.85% | 3.88% | 0.334 | 0.19 | — | |
| 30 | natasha | NATASHA | 24.59% | 28.54% | 1.59% | 0.336 | 0.08 | — | |
| 31 | rules-ru | RULES | 23.79% | 24.63% | 0.69% | 0.521 | — | — |
How to read these numbers. Completely hidden means the whole sensitive value was masked. Found at least partly can still leave text visible. Extra text masked is measured on unlabeled rows and is not a verified false-positive rate.
What was tested
These counts describe the test data; they do not show which detector is best.