Skip to content

Latest commit

 

History

History
409 lines (290 loc) · 16.5 KB

File metadata and controls

409 lines (290 loc) · 16.5 KB
Banner README de OpenMed con la mascota del gato, la marca denominativa en minúsculas, Open Cross y el texto IA sanitaria de código abierto, 340 M+ de descargas y 10 M+ de instalaciones

Tus datos. Tu modelo. Tu hardware.

Convierta texto clínico en información estructurada y desidentificada en hardware bajo su control.
El entorno local principal de OpenMed realiza la extracción y la desidentificación una vez disponibles los artefactos de modelo necesarios. Las descargas de modelos, los adaptadores de proveedores remotos, las rutas con telemetría y las integraciones configuradas por el usuario pueden usar la red; revise las condiciones de cada modelo y conjunto de datos.

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

Ejecución local primero  ·  33 idiomas PII respaldados por modelos  ·  Apache-2.0 SDK

English · 简体中文 · Español · Français · Deutsch · Italiano · Português · Nederlands · العربية · हिन्दी · తెలుగు · 日本語 · Türkçe · فارسی


Míralo en acción

OpenMed des-identificando PII de un informe de alta clínica en tiempo real
Des-identificación de PII en tiempo real: el Privacy Filter Nemotron oculta nombres, direcciones, identificadores y datos de facturación de un informe de alta clínica, completamente en el dispositivo. (Todos los valores mostrados son sintéticos.)

Ejemplo en 30 segundos

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 modelo de NER clínico usa el entorno local después de que sus artefactos necesarios están disponibles.


¿Por qué OpenMed?

Consideración de despliegue Límite del SDK de OpenMed
Entorno principal Procesa localmente cuando están disponibles los artefactos necesarios
Rutas de red opcionales Descargas, adaptadores remotos, telemetría e integraciones pueden usar la red
Validación El responsable valida términos de modelos y datos, privacidad y aptitud clínica
Interfaces Python, Swift, Android, navegador y servicios cuando son compatibles
  • Catálogo de modelos seleccionado: valide cada modelo, licencia y conjunto de datos para su caso de uso.
  • Configuración alineada con Safe Harbor: puede dirigirse a las 18 categorías de identificadores; sigue siendo necesaria la revisión experta del despliegue y usar el SDK no demuestra por sí solo el cumplimiento de HIPAA.
  • Rutas de ejecución compatibles: los adaptadores de CPU, CUDA, MLX, móvil, servicio y navegador varían según el entorno y el artefacto.
  • Interfaces de despliegue: Python, contenedores, servicios y flujos por lotes requieren configuración y validación.
  • Código fuente del SDK: publicado bajo Apache-2.0 License; los términos de modelos y datos varían.

En el dispositivo, en Apple: Swift, MLX e iOS

En hardware Apple compatible, OpenMed puede usar MLX y OpenMedKit para el procesamiento local una vez disponibles los artefactos necesarios. La obtención de modelos y las integraciones remotas configuradas por el usuario son límites de red independientes.

// Add OpenMedKit to your app
dependencies: [
    .package(url: "https://github.com/maziyarpanahi/openmed.git", from: "2.0.0"),
]
  • Runtime de MLX para la clasificación de tokens de PII, la familia Privacy Filter y tareas zero-shot experimentales de la familia GLiNER, con una ruta de respaldo en CoreML.
  • Un nombre de modelo, todas las plataformas: en hardware que no es de Apple, los nombres de modelo MLX recurren automáticamente al checkpoint de PyTorch correspondiente.
  • Python en Apple Silicon también: pip install --upgrade "openmed[mlx]".

Guías: Backend de MLX · OpenMedKit (Swift) · Exportación a CoreML


Cómo funciona

flowchart LR
    A["Texto clínico"] --> B["OpenMed<br/>(local primero)"]
    B --> C["Entidades médicas"]
    B --> D["PII detectada"]
    B --> E["Texto des-identificado"]
    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

Inicio rápido

# 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 de Python

from openmed import analyze_text

analyze_text(
  "Patient received 75mg "
  "clopidogrel for NSTEMI.",
  model_name=
  "pharma_detection_superclinical",
)

Servicio REST

uvicorn openmed.service.app:app \
  --host 0.0.0.0 --port 8080

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

Por lotes

from openmed import BatchProcessor

p = BatchProcessor(
  model_name=
  "disease_detection_superclinical",
  group_entities=True,
)
p.process_texts([...])

¿Sin conexión / aislado? Apunta model_name (o model_id) a un directorio local y OpenMed lo cargará sin contactar con el Hub de 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"),
)

Modelos

Un registro curado de modelos de NER médico especializados. Explora el catálogo completo.

Modelo Especialización Tipos de entidad Tamaño
disease_detection_superclinical Enfermedades y afecciones DISEASE, CONDITION, DIAGNOSIS 434M
pharma_detection_superclinical Fármacos y medicamentos DRUG, MEDICATION, TREATMENT 434M
pii_superclinical_large PII y des-identificación NAME, DATE, SSN, PHONE, EMAIL, ADDRESS 434M
anatomy_detection_electramed Anatomía y partes del cuerpo ANATOMY, ORGAN, BODY_PART 109M
gene_detection_genecorpus Genes y proteínas GENE, PROTEIN 109M

Privacidad: detección y des-identificación de 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 fusión inteligente de entidades mantiene 01/15/1970 completo en lugar de fragmentarlo.
  • Ofuscación basada en Faker con proveedores personalizados de identificadores clínicos (CPF, CNPJ, BSN, NIR, Codice Fiscale, NIE, Aadhaar, Steuer-ID, NPI).
  • Límite de HIPAA: las categorías alineadas con Safe Harbor y los umbrales configurables ayudan a la implementación; sigue siendo necesaria la revisión experta del despliegue y usar el SDK no demuestra por sí solo el cumplimiento.

Cuaderno completo de PII · Fusión inteligente · Anonimización

Familia Privacy Filter: tres familias de modelos sobre la arquitectura OpenAI Privacy Filter

El código del modelo es el mismo (transformador disperso MoE estilo gpt-oss con atención local, tokens sink, RoPE+YaRN, tokenización tiktoken o200k_base); solo cambian los datos de entrenamiento. Todas usan la misma API extract_pii() / deidentify(): solo cambia el argumento model_name=.

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)

En hosts que no son Apple Silicon, los nombres de modelo MLX se sustituyen automáticamente por el checkpoint de PyTorch correspondiente (con un aviso único): escribe un nombre de modelo y ejecútalo en cualquier lugar. Consulta Arquitectura de Privacy Filter y enrutamiento del backend.


PII multilingüe (34 rutas admitidas; 33 respaldadas por modelos)

Extracción y des-identificación en en, fr, de, it, es, nl, hi, te, pt, ar, ja y tr: el catálogo registrado de modelos PII en 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])"
Ver ejemplos por idioma (portugués, neerlandés, hindi, árabe, japonés, turco)
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])

REST API

Un servicio FastAPI compatible con Docker, con validación de solicitudes, precarga de pipeline compartida y envoltorios de error unificados.

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"}'

Consulta la guía completa del servicio REST.


Documentación

Guías completas en openmed.life/docs.

Primeros pasos Analizar texto Registro de modelos
Guía de detección de PII Anonimización Procesamiento por lotes
Perfiles de configuración Servicio REST Backend de MLX

Conoce a la mascota

Mascota de OpenMed

El guardián de OpenMed es un esponjoso gato persa caracterizado como un pequeño Avicena (Ibn Sina), el gran médico persa cuyo Canon de Medicina fue el texto médico de referencia en todo el mundo durante unos 600 años. Vigila el libro abierto del conocimiento médico, con una paleta inspirada en la turquesa persa (fīrūza): un guardián local-first para tus datos más privados.



Contribuir

¡Las contribuciones son bienvenidas! Informes de errores, solicitudes de funciones y PRs por igual.

  • Abrir una incidencia
  • Se aceptan traducciones: ayuda a completar los README en otros idiomas enlazados en el selector de la parte superior.

Créditos

OpenMed se basa en excelente trabajo de código abierto: agradecimiento especial a OpenAI (la arquitectura Privacy Filter), NVIDIA (el conjunto de datos Nemotron PII), Hugging Face (transformers y el ecosistema de modelos), Apple (MLX) y los mantenedores de Faker.

Licencia

El código fuente del SDK de OpenMed se publica bajo la Apache-2.0 License.

Cita

Si OpenMed te resulta útil en tu investigación, cítalo:

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

Historial de estrellas

Si OpenMed te resulta útil, una estrella ayuda a que otros lo descubran.

4,700+ GitHub stars · 29 Jul 2026 snapshot


Hecho por el equipo de OpenMed

Sitio web · Documentación · X / Twitter · LinkedIn