English | 한국어
newmean-pii
Detect and mask personal information in text on your own machine, before it is stored, logged or sent to an LLM. A
small multilingual token-classification model (54 languages) runs in a C extension; no network after the first
download, no dependencies. Python package of the npm package @newmean-ai/pii:
same models, same spans.
pip install newmean-pii
from newmean_pii import create_redactor
redactor = create_redactor(size="medium")
redactor.redact("제 메일은 kim@example.com, 전화는 010-1234-5678입니다").text
# '제 메일은 [EMAIL], 전화는 [PHONE]입니다'
Python 3.9+. Wheels for Linux (x86-64, arm64), macOS (arm64, x86-64) and Windows (x86-64); other platforms build from the sdist with a C11 compiler.
Models
| size | file | notes |
|---|---|---|
nano |
2.6 MB | one shared layer applied 4 times, rank-32 embeddings |
small |
7.1 MB | 4 layers, rank-64 embeddings |
medium (default) |
11.3 MB | 6 layers, rank-192 embeddings |
large |
15.5 MB | 6 layers, full (pruned-vocabulary) embeddings |
Plus a 0.8 MB tokenizer. On first use the files are downloaded from Hugging Face (newmean-ai/pii-<size>, tag v1.0.0)
into ~/.cache/newmean-pii and checked against SHA-256 values pinned in this package; every later load checks them again.
No model finds every piece of personal information. The technical report lists miss and over-masking rates per language and dataset; treat the output as a strong first pass, not a guarantee. On newmean-pii-dataset (public test, 54 languages) the models miss 1.6% (large) to 3.3% (nano) of PII characters; the full comparison is in the repository README.
Labels
PERSON, EMAIL, PHONE, ADDRESS, ID_NUMBER, FINANCIAL, ORG, USERNAME, URL, DATE_OF_BIRTH, SECRET, and two
level 2 labels for indirect identifiers: PERSON_L2 (a surname with a title, a nickname, initials) and URL_L2 (public
profile or page URLs). Pass labels=LEVEL1_LABELS to leave level 2 visible.
API
create_redactor( # or Redactor(...), same arguments
size="medium", # "nano" | "small" | "medium" | "large"
variant=None, # "q4" | "q4e"; default q4e for large/medium, q4 for small/nano
*,
sensitivity=0.0, # > 0 masks more, < 0 masks less (about -1..1)
labels=None, # labels to mask; default all (LABELS); unknown names raise ValueError
regex=False, # also mask a few patterns (email, URL, card/account, phone, Korean resident number);
# off by default: almost no extra coverage, double the over-masking
model_dir=None, # folder with tokenizer.web.json and onnx/model_<variant>.onnx; never downloads
cache_dir=None, # default: $NEWMEAN_PII_CACHE, $XDG_CACHE_HOME/newmean-pii or ~/.cache/newmean-pii
model_url=None, # base URL of a mirror of newmean-ai/pii-<size> (https://, http:// or file://)
on_progress=None, # callback(file, loaded_bytes, total_bytes)
) -> Redactor
redactor.detect(text) # -> [Span(start, end, label, source)], sorted, non-overlapping
redactor.redact(text, mode="tag") # -> RedactResult(text, spans); "tag" -> [EMAIL], "mask" -> *****, "blank" -> removed
redactor.redact(text, mask_char="#", replace=None) # replace(span, original) -> str overrides mode
redactor.set_sensitivity(value) # no reload
redactor.tokenize(text) # -> [Token(id, start, end)]
redactor.close() # also: with create_redactor() as r: ...
apply_redaction(text, spans, mode="tag", mask_char="*", replace=None)
regex_spans(text) # the pattern layer alone
fetch_model(size, variant=None, cache_dir=None) # download and verify ahead of time; returns the folder
-
Offsets are Python
strindices (code points):text[span.start:span.end]is the masked text, emoji included. The npm package uses UTF-16 indices for the same spans.sourceis"model","regex"or"model+regex". -
tagmode writes the label family:PERSON_L2becomes[PERSON],URL_L2becomes[URL].maskwrites onemask_charper code point. -
Threads: a redactor can be shared. The model is immutable and the GIL is released while it runs, so a thread pool detects in parallel (one core per call):
from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor(4) as pool: results = list(pool.map(redactor.redact, texts))
-
Speed: one thread on Apple M5 Pro, about 10 ms for a short text with nano and 15 ms with medium; a 1,000-token text takes 0.4 s (nano) to 0.55 s (medium). Long texts are split into overlapping 256-token windows.
-
Errors:
ValueErrorfor bad options,ModelFileErrorwhen a file is missing, cannot be downloaded or does not match its pin.
Offline use
Download once, then run without network:
python -m newmean_pii download --size medium # into the cache; prints the folder
NEWMEAN_PII_OFFLINE=1 python app.py # never download; fail if a file is not cached
Or copy the files of the Hugging Face repo yourself (tokenizer.web.json and onnx/model_<variant>.onnx) and pass the
folder:
redactor = create_redactor(size="medium", model_dir="/opt/models/pii-medium")
The files are checked against the pinned SHA-256 there too. For containers, run python -m newmean_pii download at
build time with NEWMEAN_PII_CACHE set to a folder inside the image.
There is also a small command line: python -m newmean_pii redact --size nano --mode mask < input.txt.
Development
cd python
uv build # sdist (with native/core copied in) and a wheel built from it
pip install dist/*.whl pytest
pytest -q # fixture parity tests skip without fixtures and model copies
The C extension compiles native/core (the shared core of every native package) with the same flags as its Makefile,
so logits are bit-identical to the npm package's baseline WebAssembly engine. Tests: regex parity with the Python
baseline, redaction modes, offsets on emoji text, threads, downloads against a local HTTP server and file:// (no
network), and, when the private fixtures and model copies exist (PII_FIXTURES, default js/test/fixtures;
PII_MODELS, default js/test/models), tokenizer parity with Hugging Face and span parity with the Python evaluator for
every run of the npm test (PII_SIZES=nano,medium limits them). NEWMEAN_PII_NETWORK_TESTS=1 adds one download from
Hugging Face. Wheels: cibuildwheel (configured in pyproject.toml, workflow .github/workflows/python-wheels.yml).
License
Apache-2.0, for the package code and the model weights; third-party notices in NOTICE. If you use them in a product, we would appreciate a "Powered by newmean.ai" mention in your docs or an about or licenses screen (a request, not a license condition). Made by newmean.ai.
Metadata
Release files for newmean-pii 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| newmean_pii-1.0.0.tar.gz | 89.5 kB | With provenance | Details for newmean_pii-1.0.0.tar.gz |
Built distributions (wheels)
Total release size: 730.8 kB
Release files / newmean_pii-1.0.0.tar.gz
| Download URL | newmean_pii-1.0.0.tar.gz |
|---|---|
| Size | 89.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2121394167c7e8dce62cc8ad9e32b0c8a0ef71670dbe481b919ada36cdf0b288
|
|
BLAKE2b-256 checksum How to use checksums |
41e5b09005ffa8dc07c0f1d321be3f2ad789f17e84bfaffca84b723057ea03d9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logRelease files / newmean_pii-1.0.0-cp39-abi3-win_amd64.whl
| Download URL | newmean_pii-1.0.0-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 70.3 kB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
75eaa5cfe44b10d91485ef186bc52978b29a755cd548074854f5a4f9330d1227
|
|
BLAKE2b-256 checksum How to use checksums |
0a94cf86786ac6b3d1818255fe4a8fa2c801c0b5f377ab29bc3c84cba2a2b7ca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logRelease files / newmean_pii-1.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | newmean_pii-1.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 212.9 kB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
841bd27bed66352d6fa09602374a50663efb1af79ef61c90a89dca40f859ebb2
|
|
BLAKE2b-256 checksum How to use checksums |
b7fc23ff03bfa23ed8bfff165d4f9f1cc4bbcf9bd5d5c0cd2409c334e4a912d1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logRelease files / newmean_pii-1.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
| Download URL | newmean_pii-1.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 209.6 kB |
| Tags | CPython 3.9 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
659f5f1b04de9abd5dcb843b06b631f5914e7d17c996371b0511b58419aadb13
|
|
BLAKE2b-256 checksum How to use checksums |
e2c02fd41bcb0120f7d8ff251712ce873eca1a74bd83f8009776c355fd723cfd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logRelease files / newmean_pii-1.0.0-cp39-abi3-macosx_11_0_x86_64.whl
| Download URL | newmean_pii-1.0.0-cp39-abi3-macosx_11_0_x86_64.whl |
|---|---|
| Size | 73.2 kB |
| Tags | CPython 3.9 abi3 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
0c9755e0db549b2f84d165bb0a3a7f4001ba121e2025415df7bbbc1352a3f4e5
|
|
BLAKE2b-256 checksum How to use checksums |
635da68c4728b5fece2407f5bdbbc76828e8ce1f2612807247c2bd0e7234d26b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logRelease files / newmean_pii-1.0.0-cp39-abi3-macosx_11_0_arm64.whl
| Download URL | newmean_pii-1.0.0-cp39-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 75.2 kB |
| Tags | CPython 3.9 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
227ea1e256ae44a5559b658d653e2f3aeaf8543b8b88d901763294865ed4f6aa
|
|
BLAKE2b-256 checksum How to use checksums |
8956f9799f7571cc3acce3baa6417c6d2b387f260f86ec2d22842f50901a8637
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logSecurity for newmean-pii 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 6 files in this release have been uploaded with provenance metadata.
Attestation for newmean_pii-1.0.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.