Fine-tuned
pczarnik/herbert-base-ner
for detecting personal data (PII) in Polish text.
Intended use: Polish web forms — browser-side inference via
@xenova/transformers + ONNX Runtime Web (WASM),
no backend required.
Fine-tuned for 8 epochs with early stopping (patience=3), best checkpoint selected by eval F1
(seqeval, micro-averaged over B-PER/I-PER/B-LOC/I-LOC).
ADDRESS recall 0.990 — the model captures full addresses including city names.
1from transformers import pipeline
2
3ner = pipeline(
4 "token-classification",
5 model="ArkadiuszPawlak/pczarnik-herbert-ner-polish-pii",
6 aggregation_strategy="simple",
7)
8result = ner("Jan Kowalski mieszka przy ul. Marszałkowskiej 1, 00-001 Warszawa.")
9# [{"entity_group": "PER", "word": "Jan Kowalski", ...},
10# {"entity_group": "LOC", "word": "ul. Marszałkowskiej 1, 00-001 Warszawa", ...}]
1import { pipeline } from "@xenova/transformers";
2
3const ner = await pipeline(
4 "token-classification",
5 "ArkadiuszPawlak/pczarnik-herbert-ner-polish-pii",
6 { aggregation_strategy: "simple" }
7);
8
9const LABEL_MAP = { PER: "PERSON", LOC: "ADDRESS" };
10
11const raw = await ner("Jan Kowalski mieszka przy ul. Marszałkowskiej 1 w Krakowie.");
12const entities = raw
13 .filter(e => e.entity_group in LABEL_MAP)
14 .map(e => ({ label: LABEL_MAP[e.entity_group], text: e.word, score: e.score }));
15console.log(entities);
16// [{ label: "PERSON", text: "Jan Kowalski", score: 0.99 },
17// { label: "ADDRESS", text: "ul. Marszałkowskiej 1 w Krakowie", score: 0.97 }]