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 · فارسی
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.)
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 modelo de NER clínico usa el entorno local después de que sus artefactos necesarios están disponibles.
| 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 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
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
# 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
|
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"),
)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 |
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/1970completo 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.
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])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: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"}'Consulta la guía completa del servicio REST.
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 |
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.
¡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.
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.
El código fuente del SDK de OpenMed se publica bajo la Apache-2.0 License.
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},
}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