Skip to content

Latest commit

 

History

History
409 lines (290 loc) · 16.8 KB

File metadata and controls

409 lines (290 loc) · 16.8 KB
Bannière README d’OpenMed avec la mascotte chat, le nom en minuscules, l’Open Cross et le texte IA de santé open source, plus de 340 M de téléchargements et plus de 10 M d’installations

Vos données. Votre modèle. Votre matériel.

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 · فارسی


Voir en action

OpenMed dé-identifie les PII d'un compte rendu de sortie clinique en temps réel
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.)

Exemple en 30 secondes

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.95

Un modèle de NER clinique utilise le moteur local une fois ses artefacts requis disponibles.


Pourquoi OpenMed ?

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 l'appareil, sur Apple : Swift, MLX et iOS

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


Comment ça marche

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
Loading

Démarrage rapide

# 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

GET /health POST /analyze POST /pii/extract POST /pii/deidentify

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"),
)

Modèles

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

Confidentialité : détection et dé-identification des PII

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/1970 intact 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.


PII multilingue (34 routes prises en charge ; 33 prises en charge par modèle)

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])

API REST

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:local
curl -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.


Documentation

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

Découvrez la mascotte

Mascotte OpenMed

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.



Contribuer

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.

Remerciements

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.

Licence

Le code source du SDK OpenMed est publié sous Apache-2.0 License.

Citation

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},
}

Historique des étoiles

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

Site web · Documentation · X / Twitter · LinkedIn