Transformez le texte clinique en informations structurées et dé-identifiées sur le matériel que vous contrôlez.
Le moteur local principal d’OpenMed effectue l’extraction et la dé-identification une fois les artefacts de modèle requis disponibles. Les téléchargements de modèles, les adaptateurs de fournisseurs distants, les parcours avec télémétrie et les intégrations configurées par l’utilisateur peuvent utiliser le réseau ; vérifiez les conditions de chaque modèle et jeu de données.
PyPI package · Python 3.10+ · Model catalog · Research paper · Apache-2.0 SDK source
OpenMedKit · Apple Silicon / MLX · Android / ONNX Runtime Mobile · Browser / Transformers.js · Documentation
Exécution locale en priorité · 33 langues PII prises en charge par modèle · Apache-2.0 SDK
English · 简体中文 · Español · Français · Deutsch · Italiano · Português · Nederlands · العربية · हिन्दी · తెలుగు · 日本語 · Türkçe · فارسی
Dé-identification des PII en temps réel : le Privacy Filter Nemotron masque les noms, adresses, identifiants et données de facturation d'un compte rendu de sortie clinique, entièrement sur l'appareil. (Toutes les valeurs affichées sont synthétiques.)
from openmed import analyze_text
result = analyze_text(
"Patient started on imatinib for chronic myeloid leukemia.",
model_name="disease_detection_superclinical",
)
for entity in result.entities:
print(f"{entity.label:<12} {entity.text:<28} {entity.confidence:.2f}")
# DISEASE chronic myeloid leukemia 0.98
# DRUG imatinib 0.95Un modèle de NER clinique utilise le moteur local une fois ses artefacts requis disponibles.
| Point de déploiement | Périmètre du SDK OpenMed |
|---|---|
| Moteur principal | Traite localement une fois les artefacts requis disponibles |
| Parcours réseau facultatifs | Téléchargements, adaptateurs distants, télémétrie et intégrations peuvent utiliser le réseau |
| Validation | Le responsable valide les conditions des modèles et données, la confidentialité et l’aptitude clinique |
| Interfaces | Python, Swift, Android, navigateur et services lorsqu’ils sont pris en charge |
- Catalogue de modèles sélectionné : validez chaque modèle, licence et jeu de données pour votre cas d’usage.
- Configuration alignée sur Safe Harbor : peut cibler les 18 catégories d’identifiants ; une revue experte du déploiement reste requise et l’utilisation du SDK n’établit pas à elle seule la conformité HIPAA.
- Parcours d’exécution pris en charge : les adaptateurs CPU, CUDA, MLX, mobile, service et navigateur varient selon l’environnement et l’artefact.
- Interfaces de déploiement : Python, conteneurs, services et traitements par lots nécessitent configuration et validation.
- Code source du SDK : publié sous Apache-2.0 License ; les conditions des modèles et jeux de données varient.
Sur le matériel Apple pris en charge, OpenMed peut utiliser MLX et OpenMedKit pour le traitement local une fois les artefacts requis disponibles. L’acquisition des modèles et les intégrations distantes configurées par l’utilisateur restent des frontières réseau distinctes.
// Add OpenMedKit to your app
dependencies: [
.package(url: "https://github.com/maziyarpanahi/openmed.git", from: "2.0.0"),
]- Runtime MLX pour la classification de tokens PII, la famille Privacy Filter et les tâches zero-shot expérimentales de la famille GLiNER, avec une voie de repli CoreML.
- Un seul nom de modèle, toutes les plateformes : sur du matériel non-Apple, les noms de modèles MLX basculent automatiquement vers le checkpoint PyTorch correspondant.
- Python sur Apple Silicon aussi :
pip install --upgrade "openmed[mlx]".
Guides : Backend MLX · OpenMedKit (Swift) · Export CoreML
flowchart LR
A["Texte clinique"] --> B["OpenMed<br/>(local en priorité)"]
B --> C["Entités médicales"]
B --> D["PII détectées"]
B --> E["Texte dé-identifié"]
style B fill:#0D6E6E,stroke:#0A5656,stroke-width:2px,color:#ffffff
style C fill:#D6EBEB,stroke:#0D6E6E,color:#0E1116
style D fill:#F7DCD8,stroke:#C5453A,color:#0E1116
style E fill:#F5E27A,stroke:#A9A088,color:#0E1116
# Core + Hugging Face runtime (Linux, macOS, Windows; CPU or CUDA)
pip install --upgrade "openmed[hf]"
# Add the REST service
pip install --upgrade "openmed[hf,service]"
# Apple Silicon acceleration (MLX)
pip install --upgrade "openmed[mlx]"|
API Python from openmed import analyze_text
analyze_text(
"Patient received 75mg "
"clopidogrel for NSTEMI.",
model_name=
"pharma_detection_superclinical",
) |
Service REST uvicorn openmed.service.app:app \
--host 0.0.0.0 --port 8080
|
Par lots from openmed import BatchProcessor
p = BatchProcessor(
model_name=
"disease_detection_superclinical",
group_entities=True,
)
p.process_texts([...]) |
Hors ligne / isolé ? Pointez model_name (ou model_id) vers un répertoire local et OpenMed le charge sans contacter le Hub Hugging Face :
from openmed import OpenMedConfig, analyze_text
result = analyze_text(
"Patient presents with chronic myeloid leukemia and Type 2 diabetes.",
model_id="./models/OpenMed-NER-DiseaseDetect-SuperClinical-434M",
config=OpenMedConfig(device="cpu"),
)Un registre soigneusement sélectionné de modèles NER médicaux spécialisés : parcourez le catalogue complet.
| Modèle | Spécialisation | Types d'entités | Taille |
|---|---|---|---|
disease_detection_superclinical |
Maladies et affections | DISEASE, CONDITION, DIAGNOSIS | 434M |
pharma_detection_superclinical |
Médicaments et traitements | DRUG, MEDICATION, TREATMENT | 434M |
pii_superclinical_large |
PII et dé-identification | NAME, DATE, SSN, PHONE, EMAIL, ADDRESS | 434M |
anatomy_detection_electramed |
Anatomie et parties du corps | ANATOMY, ORGAN, BODY_PART | 109M |
gene_detection_genecorpus |
Gènes et protéines | GENE, PROTEIN | 109M |
from openmed import extract_pii, deidentify
text = "Patient: John Doe, DOB: 01/15/1970, SSN: 123-45-6789"
# Extract PII with smart merging (prevents tokenization fragmentation)
result = extract_pii(text, model_name="pii_superclinical_large", use_smart_merging=True)
# De-identify with the method you need
deidentify(text, method="mask") # [NAME], [DATE]
deidentify(text, method="replace") # Faker-backed, locale-aware, format-preserving fakes
deidentify(text, method="hash") # Cryptographic hashing
deidentify(text, method="shift_dates", date_shift_days=180)- La fusion intelligente des entités conserve
01/15/1970intact au lieu de le fragmenter. - Obfuscation basée sur Faker avec des fournisseurs personnalisés d'identifiants cliniques (CPF, CNPJ, BSN, NIR, Codice Fiscale, NIE, Aadhaar, Steuer-ID, NPI).
- Périmètre HIPAA : les catégories alignées sur Safe Harbor et les seuils configurables sont des aides à l’implémentation ; une revue experte du déploiement reste requise et l’utilisation du SDK seule n’établit pas la conformité.
Notebook PII complet · Fusion intelligente · Anonymisation
Famille Privacy Filter : trois familles de modèles sur l'architecture OpenAI Privacy Filter
Le code du modèle est identique (transformeur MoE clairsemé de style gpt-oss avec attention locale, tokens sink, RoPE+YaRN, tokenisation tiktoken o200k_base) ; seules les données d'entraînement diffèrent. Toutes passent par la même API extract_pii() / deidentify() : seul l'argument model_name= change.
| Variante | PyTorch (CPU + CUDA) | MLX (Apple Silicon) | MLX 8-bit |
|---|---|---|---|
| OpenAI Privacy Filter | openai/privacy-filter |
OpenMed/privacy-filter-mlx |
…-mlx-8bit |
| Nemotron-PII fine-tune | OpenMed/privacy-filter-nemotron |
…-nemotron-mlx |
…-nemotron-mlx-8bit |
| OpenMed Multilingual | OpenMed/privacy-filter-multilingual |
…-multilingual-mlx |
…-multilingual-mlx-8bit |
from openmed import extract_pii
text = "Patient Sarah Connor (DOB: 03/15/1985) at MRN 4471882."
extract_pii(text, model_name="openai/privacy-filter") # PyTorch baseline
extract_pii(text, model_name="OpenMed/privacy-filter-nemotron") # same code, different weights
extract_pii(text, model_name="OpenMed/privacy-filter-mlx") # Apple Silicon (MLX)Sur les hôtes non-Apple-Silicon, les noms de modèles MLX sont automatiquement remplacés par le checkpoint PyTorch correspondant (avec un avertissement unique) : écrivez un seul nom de modèle, exécutez-le partout. Voir Architecture Privacy Filter et routage du backend.
Extraction et dé-identification en en, fr, de, it, es, nl, hi, te, pt, ar, ja et tr, soit le catalogue enregistré de modèles PII au total.
python -c "from openmed import extract_pii; print([(e.label, e.text) for e in extract_pii('Dr. Pedro Almeida, CPF: 123.456.789-09, email: pedro@hospital.pt', lang='pt').entities])"Voir des exemples par langue (portugais, néerlandais, hindi, arabe, japonais, turc)
from openmed import extract_pii
portuguese = extract_pii("Paciente: Pedro Almeida, CPF: 123.456.789-09, telefone: +351 912 345 678", lang="pt", use_smart_merging=True)
dutch = extract_pii("Patiënt: Eva de Vries, BSN: 123456782, telefoon: +31 6 12345678", lang="nl", use_smart_merging=True)
hindi = extract_pii("रोगी: अनीता शर्मा, फोन: +91 9876543210, पता: नई दिल्ली 110001", lang="hi", use_smart_merging=True)
arabic = extract_pii("المريضة ليلى حسن، الهاتف +20 10 1234 5678، الرقم القومي 29801011234567.", lang="ar", use_smart_merging=True)
japanese = extract_pii("患者 佐藤 花子、電話 +81 90 1234 5678、マイナンバー 1234 5678 9012.", lang="ja", use_smart_merging=True)
turkish = extract_pii("Hasta Ayşe Yılmaz, telefon +90 532 123 45 67, TCKN 10000000146.", lang="tr", use_smart_merging=True)
for r in (portuguese, dutch, hindi, arabic, japanese, turkish):
print([(e.label, e.text) for e in r.entities])Un service FastAPI compatible Docker, avec validation des requêtes, préchargement de pipeline partagé et enveloppes d'erreur unifiées.
pip install --upgrade "openmed[hf,service]"
uvicorn openmed.service.app:app --host 0.0.0.0 --port 8080
# or with Docker
docker build -t openmed:local .
docker run --rm -p 8080:8080 -e OPENMED_PROFILE=prod openmed:localcurl -X POST http://127.0.0.1:8080/pii/extract \
-H "Content-Type: application/json" \
-d '{"text":"Paciente: Maria Garcia, DNI: 12345678Z","lang":"es"}'Consultez le guide complet du service REST.
Guides complets sur openmed.life/docs.
| Premiers pas | Analyser du texte | Registre des modèles |
| Guide de détection PII | Anonymisation | Traitement par lots |
| Profils de configuration | Service REST | Backend MLX |
Le gardien d'OpenMed est un chat persan duveteux représenté en petit Avicenne (Ibn Sina), le grand médecin perse dont le Canon de la médecine fut le manuel médical de référence dans le monde entier pendant près de 600 ans. Il veille sur le livre ouvert du savoir médical, dans une palette inspirée de la turquoise persane (fīrūza) : un gardien local-first pour vos données les plus privées.
Les contributions sont les bienvenues : rapports de bugs, demandes de fonctionnalités et PR.
- Ouvrir une issue
- Traductions bienvenues : aidez à compléter les README dans les autres langues liés dans le sélecteur en haut de page.
OpenMed s'appuie sur d'excellents travaux open source, avec un merci tout particulier à OpenAI (l'architecture Privacy Filter), NVIDIA (le jeu de données Nemotron PII), Hugging Face (transformers et l'écosystème de modèles), Apple (MLX) et les mainteneurs de Faker.
Le code source du SDK OpenMed est publié sous Apache-2.0 License.
Si OpenMed vous est utile dans vos recherches, merci de le citer :
@misc{panahi2025openmedneropensourcedomainadapted,
title={OpenMed NER: Open-Source, Domain-Adapted State-of-the-Art Transformers for Biomedical NER Across 12 Public Datasets},
author={Maziyar Panahi},
year={2025},
eprint={2508.01630},
archivePrefix={arXiv},
primaryClass={cs.CL},
url={https://arxiv.org/abs/2508.01630},
}Si OpenMed vous est utile, une étoile aide les autres à le découvrir.
4,700+ GitHub stars · 29 Jul 2026 snapshot
Réalisé par l'équipe OpenMed