Skip to content

Latest commit

 

History

History
409 lines (290 loc) · 16.4 KB

File metadata and controls

409 lines (290 loc) · 16.4 KB
Banner README do OpenMed com o mascote gato, a marca nominativa em minúsculas, Open Cross e o texto IA de saúde de código aberto, 340 M+ de downloads e 10 M+ de instalações

Seus dados. Seu modelo. Seu hardware.

Transforme texto clínico em informação estruturada e desidentificada no hardware que você controla.
O runtime local principal do OpenMed realiza extração e desidentificação depois que os artefatos de modelo necessários estão disponíveis. Downloads de modelos, adaptadores de provedores remotos, caminhos com telemetria e integrações configuradas pelo usuário podem usar a rede; revise os termos de cada modelo e conjunto de dados.

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

Execução local em primeiro lugar  ·  33 idiomas PII com suporte de modelos  ·  Apache-2.0 SDK

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


Veja em ação

OpenMed des-identificando PII de um relatório de alta clínica em tempo real
Des-identificação de PII em tempo real: o Privacy Filter Nemotron oculta nomes, endereços, identificadores e dados de faturamento de um relatório de alta clínica, totalmente no dispositivo. (Todos os valores exibidos são sintéticos.)

Exemplo em 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

Um modelo de NER clínico usa o runtime local depois que os artefatos necessários estão disponíveis.


Por que OpenMed?

Consideração de implantação Limite do SDK OpenMed
Runtime principal Processa localmente após os artefatos necessários estarem disponíveis
Caminhos de rede opcionais Downloads, adaptadores remotos, telemetria e integrações podem usar a rede
Validação O responsável valida termos de modelos e dados, privacidade e adequação clínica
Interfaces Python, Swift, Android, navegador e serviços quando compatíveis
  • Catálogo de modelos selecionado: valide cada modelo, licença e conjunto de dados para seu caso de uso.
  • Configuração alinhada ao Safe Harbor: pode abranger as 18 categorias de identificadores; a revisão especializada da implantação continua necessária e o uso do SDK, isoladamente, não comprova conformidade com HIPAA.
  • Caminhos de execução compatíveis: adaptadores de CPU, CUDA, MLX, dispositivo móvel, serviço e navegador variam conforme o ambiente e o artefato.
  • Interfaces de implantação: Python, contêineres, serviços e fluxos em lote exigem configuração e validação.
  • Código-fonte do SDK: publicado sob Apache-2.0 License; os termos de modelos e conjuntos de dados variam.

No dispositivo, na Apple: Swift, MLX e iOS

Em hardware Apple compatível, o OpenMed pode usar MLX e OpenMedKit para processamento local após os artefatos necessários estarem disponíveis. A obtenção de modelos e as integrações remotas configuradas pelo usuário continuam sendo limites de rede separados.

// Add OpenMedKit to your app
dependencies: [
    .package(url: "https://github.com/maziyarpanahi/openmed.git", from: "2.0.0"),
]
  • Runtime MLX para classificação de tokens de PII, a família Privacy Filter e tarefas zero-shot experimentais da família GLiNER, com um caminho de fallback em CoreML.
  • Um nome de modelo, todas as plataformas: em hardware que não é Apple, os nomes de modelo MLX recorrem automaticamente ao checkpoint PyTorch correspondente.
  • Python no Apple Silicon também: pip install --upgrade "openmed[mlx]".

Guias: Backend MLX · OpenMedKit (Swift) · Exportação CoreML


Como funciona

flowchart LR
    A["Texto clínico"] --> B["OpenMed<br/>(local primeiro)"]
    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

Início 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 Python

from openmed import analyze_text

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

Serviço REST

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

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

Em lote

from openmed import BatchProcessor

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

Offline / isolado? Aponte model_name (ou model_id) para um diretório local e o OpenMed o carrega sem contatar o Hugging Face Hub:

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

Um registro curado de modelos de NER médico especializados: explore o catálogo completo.

Modelo Especialização Tipos de entidade Tamanho
disease_detection_superclinical Doenças e condições DISEASE, CONDITION, DIAGNOSIS 434M
pharma_detection_superclinical Fármacos e medicamentos DRUG, MEDICATION, TREATMENT 434M
pii_superclinical_large PII e des-identificação NAME, DATE, SSN, PHONE, EMAIL, ADDRESS 434M
anatomy_detection_electramed Anatomia e partes do corpo ANATOMY, ORGAN, BODY_PART 109M
gene_detection_genecorpus Genes e proteínas GENE, PROTEIN 109M

Privacidade: detecção e des-identificação 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)
  • A mesclagem inteligente de entidades mantém 01/15/1970 inteiro em vez de fragmentá-lo.
  • Ofuscação baseada em Faker com provedores personalizados de identificadores clínicos (CPF, CNPJ, BSN, NIR, Codice Fiscale, NIE, Aadhaar, Steuer-ID, NPI).
  • Limite da HIPAA: categorias alinhadas ao Safe Harbor e limiares configuráveis auxiliam a implementação; a revisão especializada da implantação continua necessária e o uso isolado do SDK não comprova conformidade.

Notebook completo de PII · Mesclagem inteligente · Anonimização

Família Privacy Filter: três famílias de modelos sobre a arquitetura OpenAI Privacy Filter

O código do modelo é o mesmo (transformer MoE esparso no estilo gpt-oss com atenção local, tokens sink, RoPE+YaRN, tokenização tiktoken o200k_base); apenas os dados de treinamento mudam. Todos usam a mesma API extract_pii() / deidentify(): só muda o 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)

Em hosts que não são Apple Silicon, os nomes de modelo MLX são substituídos automaticamente pelo checkpoint PyTorch correspondente (com um aviso único): escreva um nome de modelo e rode em qualquer lugar. Veja Arquitetura do Privacy Filter e roteamento de backend.


PII multilíngue (34 rotas suportadas; 33 com suporte de modelos)

Extração e des-identificação em en, fr, de, it, es, nl, hi, te, pt, ar, ja e tr, o catálogo registrado de modelos PII no 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 exemplos por idioma (português, holandê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

Um serviço FastAPI amigável ao Docker, com validação de requisições, pré-carregamento de pipeline compartilhado e envelopes de erro 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"}'

Veja o guia completo do serviço REST.


Documentação

Guias completos em openmed.life/docs.

Primeiros passos Analisar texto Registro de modelos
Guia de detecção de PII Anonimização Processamento em lote
Perfis de configuração Serviço REST Backend MLX

Conheça o mascote

Mascote do OpenMed

O guardião do OpenMed é um gato persa fofo caracterizado como um pequeno Avicena (Ibn Sina), o grande médico persa cujo Cânone da Medicina foi o texto médico de referência no mundo todo por cerca de 600 anos. Ele cuida do livro aberto do conhecimento médico, com uma paleta inspirada na turquesa persa (fīrūza): um guardião local-first para os seus dados mais privados.



Contribuir

Contribuições são bem-vindas: relatórios de bugs, pedidos de recursos e PRs.

  • Abrir uma issue
  • Traduções são bem-vindas: ajude a completar os README em outros idiomas vinculados no seletor no topo.

Créditos

O OpenMed se baseia em excelente trabalho open source: agradecimento especial à OpenAI (a arquitetura Privacy Filter), à NVIDIA (o conjunto de dados Nemotron PII), à Hugging Face (transformers e o ecossistema de modelos), à Apple (MLX) e aos mantenedores do Faker.

Licença

O código-fonte do SDK OpenMed é publicado sob a Apache-2.0 License.

Citação

Se o OpenMed for útil na sua pesquisa, por favor, cite:

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

Histórico de estrelas

Se o OpenMed for útil para você, uma estrela ajuda outros a descobri-lo.

4,700+ GitHub stars · 29 Jul 2026 snapshot


Feito pela equipe OpenMed

Site · Documentação · X / Twitter · LinkedIn