Initial commit

This commit is contained in:
Dom
2026-03-05 01:20:14 +01:00
commit 2163e574c1
184 changed files with 354881 additions and 0 deletions

186
config/config.example.yaml Normal file
View File

@@ -0,0 +1,186 @@
# Configuration exemple pour le Pipeline MCO PMSI
# Copier ce fichier vers config/config.yaml et adapter les valeurs
# Base de données
database:
url: "postgresql://user:password@localhost:5432/pmsi_db"
# Pour SQLite en développement :
# url: "sqlite:///data/pmsi_dev.db"
echo: false
pool_size: 10
max_overflow: 20
# Modèle LLM
llm:
provider: "ollama" # ollama, vllm, llamacpp
base_url: "http://localhost:11434"
model_name: "mistral"
model_tag: "7b-instruct-v0.2"
# Paramètres d'inférence
inference:
temperature: 0.1 # Faible pour reproductibilité
top_p: 0.9
max_tokens: 2048
context_window: 8192
# Prompts
prompts:
codeur_version: "v1.0"
verificateur_version: "v1.1" # Doit être différent du codeur
# Embeddings
embeddings:
model: "sentence-transformers/paraphrase-multilingual-mpnet-base-v2"
device: "cpu" # cpu ou cuda
batch_size: 32
normalize: true
# Vector store
vector_store:
type: "faiss" # faiss ou qdrant
dimension: 768
index_type: "HNSW"
# Pour Qdrant
# url: "http://localhost:6333"
# collection_name: "pmsi_referentiels"
# Recherche RAG
rag:
# Recherche hybride
bm25_weight: 0.3
vector_weight: 0.7
top_k_retrieval: 50
top_k_reranking: 10
# Reranking
reranker_model: "cross-encoder/ms-marco-multilingual-MiniLM-L-12-v2"
alphabetic_index_boost: 1.2 # Boost pour résultats de l'index alphabétique
# Référentiels ATIH
referentiels:
cim10:
version: "2026"
file_path: "data/referentiels/cim-10-fr_2026_a_usage_pmsi_version_provisoire_111225.pdf"
chunk_size: 500
chunk_overlap: 100
ccam:
version: "2025"
file_path: "data/referentiels/actualisation_ccam_descriptive_a_usage_pmsi_v4_2025.pdf"
chunk_size: 600
chunk_overlap: 100
guide_mco:
version: "2026"
file_path: "data/referentiels/guide_methodo_mco_2026_version_provisoire.pdf"
chunk_size: 800
chunk_overlap: 150
# Fonction de groupage
groupage:
version: "2026"
# Chemin vers la bibliothèque de groupage ATIH
library_path: "/opt/atih/groupage/libgroupage.so"
# Protection des DIP
pii:
enabled: true
detection_method: "hybrid" # hybrid, regex, ner
anonymize_exports: true
recall_threshold: 0.95 # Préférer les faux positifs
# Validation PMSI
validation:
max_questions: 5
confidence_threshold_low: 0.5
confidence_threshold_high: 0.8
# Mode conservateur vs agressif
mode: "conservative" # conservative ou aggressive
# Règles de codage
rules:
version: "v1.0"
file_path: "config/rules.yaml"
# Priorités de sources
source_priorities:
cr_operatoire: 1
cr_medical: 2
imagerie: 3
biologie: 4
courrier: 5
# Audit et logging
audit:
enabled: true
log_level: "INFO" # DEBUG, INFO, WARNING, ERROR
log_file: "logs/pipeline.log"
log_format: "json" # json ou text
# Chiffrement des exports
encryption:
enabled: true
algorithm: "AES-256-GCM"
key_file: "config/encryption.key"
# Performance
performance:
# Timeouts (en secondes)
timeout_mono_document_p50: 20
timeout_mono_document_p95: 45
timeout_multi_documents_p50: 35
timeout_multi_documents_p95: 75
# Mode résultats partiels
partial_results_enabled: true
# Cache
cache_embeddings: true
cache_ttl: 3600 # 1 heure
# Métriques et monitoring
monitoring:
enabled: true
metrics_interval: 60 # secondes
# Seuils d'alerte
thresholds:
codes_sans_preuve_max: 0.05 # 5%
diagnostics_nies_codes_max: 0.01 # 1%
das_fantomes_max: 0.10 # 10%
actes_sans_preuve_max: 0.02 # 2%
# Jeu gold pour validation
gold_set:
path: "data/gold_set/"
min_size: 200
specialties: ["chirurgie", "medecine"]
# Seuils de non-régression
regression_thresholds:
dp_accuracy_min: 0.70
das_precision_min: 0.60
das_recall_min: 0.65
tim_acceptance_min: 0.50
# Sécurité
security:
# Contrôle d'accès
rbac_enabled: true
# Rôles
roles:
- name: "tim"
permissions: ["view", "correct", "validate"]
- name: "responsable_dim"
permissions: ["view", "correct", "validate", "export", "configure"]
- name: "admin"
permissions: ["all"]
# Authentification
auth:
method: "local" # local, ldap, oauth
session_timeout: 3600 # 1 heure

46
config/edsnlp_config.yaml Normal file
View File

@@ -0,0 +1,46 @@
# EDS-NLP Configuration
# Configuration for EDS-NLP integration in the MCO PMSI coding pipeline
# Model configuration
model_name: "fr_core_news_sm" # spaCy French model
# Component toggles - enable/disable specific EDS-NLP components
enable_sentences: true
enable_negation: true
enable_hypothesis: true
enable_history: true
enable_family: true
enable_reported_speech: true
# Performance tuning
cache_pipeline: true
batch_size: 32
max_length: 1000000 # Maximum document length in characters
# Fallback configuration
enable_fallback: true
max_failures_before_cooldown: 3
cooldown_period_seconds: 300 # 5 minutes
# Timeout configuration
processing_timeout_seconds: 30.0
# Normalization
enable_normalization: true
abbreviations_file: "config/medical_abbreviations.json"
# Entity extraction configuration
extract_diagnostics: true
extract_medications: true
extract_procedures: true
extract_dates: true
extract_measurements: true
# Confidence thresholds
min_entity_confidence: 0.3
min_qualifier_confidence: 0.5
# Logging configuration
log_processing_time: true
log_entity_counts: true
performance_warning_threshold: 1.0 # seconds

View File

@@ -0,0 +1,191 @@
{
"comment": "Medical abbreviations dictionary for French clinical terms",
"abbreviations": {
"avc": "accident vasculaire cérébral",
"ait": "accident ischémique transitoire",
"irc": "insuffisance rénale chronique",
"ira": "insuffisance rénale aiguë",
"icc": "insuffisance cardiaque congestive",
"ic": "insuffisance cardiaque",
"hta": "hypertension artérielle",
"bpco": "bronchopneumopathie chronique obstructive",
"im": "infarctus du myocarde",
"idm": "infarctus du myocarde",
"aomi": "artériopathie oblitérante des membres inférieurs",
"oap": "œdème aigu du poumon",
"ep": "embolie pulmonaire",
"tvp": "thrombose veineuse profonde",
"fa": "fibrillation auriculaire",
"ac/fa": "arythmie complète par fibrillation auriculaire",
"rao": "rétention aiguë d'urine",
"ivg": "interruption volontaire de grossesse",
"img": "interruption médicale de grossesse",
"geu": "grossesse extra-utérine",
"map": "menace d'accouchement prématuré",
"rciu": "retard de croissance intra-utérin",
"hta": "hypertension artérielle",
"db": "diabète",
"dt1": "diabète de type 1",
"dt2": "diabète de type 2",
"dnid": "diabète non insulino-dépendant",
"did": "diabète insulino-dépendant",
"mici": "maladie inflammatoire chronique de l'intestin",
"rch": "rectocolite hémorragique",
"mc": "maladie de crohn",
"sep": "sclérose en plaques",
"sla": "sclérose latérale amyotrophique",
"vhb": "virus de l'hépatite b",
"vhc": "virus de l'hépatite c",
"vih": "virus de l'immunodéficience humaine",
"sida": "syndrome d'immunodéficience acquise",
"bk": "bacille de koch",
"tbc": "tuberculose",
"palu": "paludisme",
"covid": "maladie à coronavirus 2019",
"sars-cov-2": "coronavirus 2 du syndrome respiratoire aigu sévère",
"ecg": "électrocardiogramme",
"ecbu": "examen cytobactériologique des urines",
"nfs": "numération formule sanguine",
"crp": "protéine c réactive",
"vs": "vitesse de sédimentation",
"ldh": "lactate déshydrogénase",
"got": "glutamate oxaloacétate transaminase",
"gpt": "glutamate pyruvate transaminase",
"alat": "alanine aminotransférase",
"asat": "aspartate aminotransférase",
"ggt": "gamma-glutamyl transférase",
"pal": "phosphatase alcaline",
"tp": "taux de prothrombine",
"tca": "temps de céphaline activée",
"inr": "international normalized ratio",
"hb": "hémoglobine",
"ht": "hématocrite",
"gb": "globules blancs",
"gr": "globules rouges",
"plt": "plaquettes",
"pnn": "polynucléaires neutrophiles",
"pne": "polynucléaires éosinophiles",
"pnb": "polynucléaires basophiles",
"lympho": "lymphocytes",
"mono": "monocytes",
"na": "sodium",
"k": "potassium",
"cl": "chlore",
"ca": "calcium",
"mg": "magnésium",
"p": "phosphore",
"urée": "urée sanguine",
"créat": "créatinine",
"dfg": "débit de filtration glomérulaire",
"glyc": "glycémie",
"hba1c": "hémoglobine glyquée",
"chol": "cholestérol",
"tg": "triglycérides",
"hdl": "high density lipoprotein",
"ldl": "low density lipoprotein",
"tsh": "thyroid stimulating hormone",
"t3": "triiodothyronine",
"t4": "thyroxine",
"psa": "antigène prostatique spécifique",
"cea": "antigène carcino-embryonnaire",
"ca 19-9": "antigène carbohydrate 19-9",
"ca 15-3": "antigène carbohydrate 15-3",
"ca 125": "antigène carbohydrate 125",
"afp": "alpha-fœtoprotéine",
"bhcg": "bêta-hcg",
"ains": "anti-inflammatoire non stéroïdien",
"iec": "inhibiteur de l'enzyme de conversion",
"ara2": "antagoniste des récepteurs de l'angiotensine 2",
"bb": "bêta-bloquant",
"inh": "inhibiteur",
"atb": "antibiotique",
"avk": "anti-vitamine k",
"aod": "anticoagulant oral direct",
"naco": "nouvel anticoagulant oral",
"hbpm": "héparine de bas poids moléculaire",
"hnf": "héparine non fractionnée",
"aap": "antiagrégant plaquettaire",
"ipp": "inhibiteur de la pompe à protons",
"irm": "imagerie par résonance magnétique",
"tdm": "tomodensitométrie",
"pet": "tomographie par émission de positons",
"echo": "échographie",
"rx": "radiographie",
"eeg": "électroencéphalogramme",
"emg": "électromyogramme",
"eto": "échographie trans-œsophagienne",
"ett": "échographie trans-thoracique",
"fibro": "fibroscopie",
"colo": "coloscopie",
"gastro": "gastroscopie",
"fogd": "fibroscopie œso-gastro-duodénale",
"pl": "ponction lombaire",
"pbl": "ponction biopsie hépatique",
"ktc": "cathéter central",
"vvc": "voie veineuse centrale",
"vvp": "voie veineuse périphérique",
"sng": "sonde naso-gastrique",
"sad": "sonde à demeure",
"kt": "cathéter",
"drain": "drainage",
"vac": "vacuum assisted closure",
"o2": "oxygène",
"vni": "ventilation non invasive",
"vm": "ventilation mécanique",
"cpap": "continuous positive airway pressure",
"peep": "positive end-expiratory pressure",
"fio2": "fraction inspirée en oxygène",
"spo2": "saturation pulsée en oxygène",
"pao2": "pression artérielle en oxygène",
"paco2": "pression artérielle en dioxyde de carbone",
"ph": "potentiel hydrogène",
"hco3": "bicarbonates",
"be": "base excess",
"lac": "lactates",
"pa": "pression artérielle",
"pas": "pression artérielle systolique",
"pad": "pression artérielle diastolique",
"pam": "pression artérielle moyenne",
"fc": "fréquence cardiaque",
"fr": "fréquence respiratoire",
"t°": "température",
"poids": "poids corporel",
"taille": "taille",
"imc": "indice de masse corporelle",
"sc": "surface corporelle",
"glasgow": "score de glasgow",
"asa": "american society of anesthesiologists",
"nyha": "new york heart association",
"child": "score de child-pugh",
"meld": "model for end-stage liver disease",
"apache": "acute physiology and chronic health evaluation",
"sofa": "sequential organ failure assessment",
"saps": "simplified acute physiology score",
"oms": "organisation mondiale de la santé",
"ecog": "eastern cooperative oncology group",
"karnofsky": "indice de karnofsky",
"mmse": "mini mental state examination",
"moca": "montreal cognitive assessment",
"iadl": "instrumental activities of daily living",
"adl": "activities of daily living",
"gir": "groupe iso-ressources",
"aggir": "autonomie gérontologie groupes iso-ressources",
"mna": "mini nutritional assessment",
"norton": "échelle de norton",
"braden": "échelle de braden",
"eva": "échelle visuelle analogique",
"en": "échelle numérique",
"evs": "échelle verbale simple",
"doloplus": "échelle doloplus",
"algoplus": "échelle algoplus",
"ecpa": "échelle comportementale de la douleur chez la personne âgée",
"hamilton": "échelle de hamilton",
"madrs": "montgomery-åsberg depression rating scale",
"hads": "hospital anxiety and depression scale",
"panss": "positive and negative syndrome scale",
"bprs": "brief psychiatric rating scale",
"ymrs": "young mania rating scale",
"cgi": "clinical global impression",
"gaf": "global assessment of functioning"
}
}

View File

@@ -0,0 +1,84 @@
# Règles de codage PMSI - Mode agressif
# Version: 1.0.0
version: "1.0.0"
name: "Règles de codage PMSI - Mode agressif"
description: "Jeu de règles avec mode agressif pour maximiser le codage"
mode: "agressif"
rules:
# Règles DP - Mode agressif
- rule_id: "dp_001"
name: "DP obligatoire"
description: "Un diagnostic principal doit toujours être présent"
category: "dp"
condition:
type: "required"
action: "reject_if_missing"
severity: "bloquant"
enabled: true
- rule_id: "dp_002_agg"
name: "DP avec confiance minimale réduite"
description: "Le DP peut avoir un score de confiance >= 0.5 en mode agressif"
category: "dp"
condition:
min_confidence: 0.5
action: "flag_for_review"
severity: "info"
enabled: true
# Règles DAS - Mode agressif
- rule_id: "das_001_agg"
name: "DAS avec preuves assouplies"
description: "Les DAS peuvent être proposés avec preuves indirectes"
category: "das"
condition:
min_evidence: 1
allow_indirect: true
action: "flag_for_review"
severity: "info"
enabled: true
- rule_id: "das_002"
name: "Limite de DAS étendue"
description: "Maximum 30 DAS par séjour en mode agressif"
category: "das"
condition:
max_count: 30
action: "reject_excess"
severity: "bloquant"
enabled: true
# Règles CCAM
- rule_id: "ccam_001"
name: "Date CCAM obligatoire"
description: "Chaque acte CCAM doit avoir une date de réalisation"
category: "ccam"
condition:
type: "required_date"
action: "reject_if_missing"
severity: "bloquant"
enabled: true
# Règles de validation - Mode agressif
- rule_id: "neg_001"
name: "Pas de codes pour faits niés"
description: "Les faits cliniques niés ne doivent jamais être codés"
category: "validation"
condition:
qualifier: "nié"
action: "reject_code"
severity: "bloquant"
enabled: true
- rule_id: "susp_001_agg"
name: "DAS possibles pour faits suspectés"
description: "Les faits suspectés peuvent être codés comme DAS en mode agressif"
category: "validation"
condition:
qualifier: "suspecté"
code_type: "das"
action: "allow_with_flag"
severity: "info"
enabled: true

View File

@@ -0,0 +1,135 @@
# Règles de codage PMSI par défaut
# Version: 1.0.0
version: "1.0.0"
name: "Règles de codage PMSI - Établissement"
description: "Jeu de règles de codage pour l'établissement avec mode conservateur"
mode: "conservateur"
rules:
# Règles pour le Diagnostic Principal (DP)
- rule_id: "dp_001"
name: "DP obligatoire"
description: "Un diagnostic principal doit toujours être présent"
category: "dp"
condition:
type: "required"
action: "reject_if_missing"
severity: "bloquant"
enabled: true
- rule_id: "dp_002"
name: "DP avec preuves suffisantes"
description: "Le DP doit avoir au moins une preuve textuelle"
category: "dp"
condition:
min_evidence: 1
action: "reject_if_insufficient"
severity: "bloquant"
enabled: true
- rule_id: "dp_003"
name: "DP avec confiance minimale"
description: "Le DP doit avoir un score de confiance >= 0.7"
category: "dp"
condition:
min_confidence: 0.7
action: "flag_for_review"
severity: "à_revoir"
enabled: true
# Règles pour les Diagnostics Associés Significatifs (DAS)
- rule_id: "das_001"
name: "DAS avec preuves"
description: "Chaque DAS doit avoir au moins une preuve"
category: "das"
condition:
min_evidence: 1
action: "reject_if_insufficient"
severity: "à_revoir"
enabled: true
- rule_id: "das_002"
name: "Limite de DAS"
description: "Maximum 20 DAS par séjour"
category: "das"
condition:
max_count: 20
action: "reject_excess"
severity: "bloquant"
enabled: true
# Règles pour les actes CCAM
- rule_id: "ccam_001"
name: "Date CCAM obligatoire"
description: "Chaque acte CCAM doit avoir une date de réalisation (règle 2026)"
category: "ccam"
condition:
type: "required_date"
action: "reject_if_missing"
severity: "bloquant"
enabled: true
- rule_id: "ccam_002"
name: "CCAM avec preuve explicite"
description: "Les actes CCAM doivent avoir une preuve explicite dans le dossier"
category: "ccam"
condition:
min_evidence: 1
explicit: true
action: "reject_if_insufficient"
severity: "bloquant"
enabled: true
# Règles de validation générale
- rule_id: "neg_001"
name: "Pas de codes pour faits niés"
description: "Les faits cliniques niés ne doivent jamais être codés"
category: "validation"
condition:
qualifier: "nié"
action: "reject_code"
severity: "bloquant"
enabled: true
- rule_id: "susp_001"
name: "Pas de DP pour faits suspectés"
description: "Les faits suspectés ne peuvent pas être codés comme DP"
category: "validation"
condition:
qualifier: "suspecté"
code_type: "dp"
action: "reject_as_dp"
severity: "bloquant"
enabled: true
- rule_id: "ant_001"
name: "Pas de DP pour antécédents"
description: "Les antécédents ne peuvent pas être codés comme DP"
category: "validation"
condition:
temporality: "antécédent"
code_type: "dp"
action: "reject_as_dp"
severity: "bloquant"
enabled: true
- rule_id: "val_001"
name: "Cohérence DP/DAS"
description: "Le DP ne doit pas être répété dans les DAS"
category: "validation"
condition:
type: "no_duplicate_dp_das"
action: "flag_for_review"
severity: "à_revoir"
enabled: true
- rule_id: "val_002"
name: "Codes obsolètes"
description: "Interdire l'utilisation de codes CIM-10 obsolètes"
category: "validation"
condition:
type: "check_obsolete"
action: "reject_code"
severity: "bloquant"
enabled: true