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

173
test_sejour_15.py Normal file
View File

@@ -0,0 +1,173 @@
#!/usr/bin/env python3
"""
Test rapide du séjour 15_23096332
"""
from pathlib import Path
from pipeline_mco_pmsi.database.base import get_engine, get_session
from pipeline_mco_pmsi.database.models import StayDB, ClinicalDocumentDB
from pipeline_mco_pmsi.models.clinical import ClinicalDocument
from pipeline_mco_pmsi.models.metadata import StayMetadata
from pipeline_mco_pmsi.rag.rag_engine import RAGEngine
from pipeline_mco_pmsi.rag.referentiels_manager import ReferentielsManager
from pipeline_mco_pmsi.extractors.clinical_facts_extractor import ClinicalFactsExtractor
from pipeline_mco_pmsi.coders.codeur import Codeur
print("=" * 60)
print("TEST DU SÉJOUR 15_23096332")
print("=" * 60)
# 1. Charger le séjour depuis la base
print("\n1⃣ Chargement du séjour depuis la base...")
engine = get_engine('sqlite:///pipeline_mco_pmsi.db')
with get_session(engine) as session:
stay = session.query(StayDB).filter(StayDB.stay_id == '15_23096332').first()
if not stay:
print("❌ Séjour non trouvé")
exit(1)
print(f"✅ Séjour trouvé: {stay.stay_id}")
print(f" Spécialité: {stay.specialty}")
# Récupérer les documents
docs_db = session.query(ClinicalDocumentDB).filter(
ClinicalDocumentDB.stay_id == stay.id
).order_by(ClinicalDocumentDB.priority).all()
print(f" Documents: {len(docs_db)}")
# Créer les métadonnées du séjour (nécessaire pour process_documents)
stay_metadata = StayMetadata(
stay_id=stay.stay_id,
admission_date=stay.admission_date,
discharge_date=stay.discharge_date,
specialty=stay.specialty
)
# Convertir en modèles Pydantic
documents = []
for doc_db in docs_db:
doc = ClinicalDocument(
document_id=doc_db.document_id,
document_type=doc_db.document_type,
content=doc_db.content,
creation_date=doc_db.creation_date,
author=doc_db.author or 'Inconnu',
priority=doc_db.priority
)
documents.append(doc)
print(f" - {doc.document_id}: {doc.document_type} ({len(doc.content)} car.)")
# 2. Initialiser le RAG Engine
print("\n2⃣ Initialisation du moteur RAG...")
referentiels_manager = ReferentielsManager(data_dir=Path('data/referentiels'))
rag_engine = RAGEngine(referentiels_manager=referentiels_manager)
print("✅ RAG Engine initialisé")
# 3. Segmentation des documents en sections
print("\n3⃣ Segmentation des documents en sections...")
from pipeline_mco_pmsi.processors.document_processor import DocumentProcessor
processor = DocumentProcessor()
try:
structured_stay = processor.process_documents(
documents=documents,
stay_metadata=stay_metadata
)
print(f"{len(structured_stay.sections)} sections créées")
# Afficher quelques sections
for i, section in enumerate(structured_stay.sections[:3], 1):
print(f" {i}. {section.section_type}: {section.content[:80]}...")
if len(structured_stay.sections) > 3:
print(f" ... et {len(structured_stay.sections) - 3} autres sections")
except Exception as e:
print(f"❌ Erreur lors de la segmentation: {e}")
import traceback
traceback.print_exc()
exit(1)
# 4. Extraction des faits cliniques
print("\n4⃣ Extraction des faits cliniques...")
print(" ⏳ Cela peut prendre 1-2 minutes...")
extractor = ClinicalFactsExtractor()
try:
facts = extractor.extract_facts(structured_stay)
print(f"{len(facts)} faits extraits")
# Afficher quelques faits
for i, fact in enumerate(facts[:5], 1):
print(f" {i}. [{fact.type}] {fact.text[:80]}...")
print(f" Certitude: {fact.qualifier.certainty}, Temporalité: {fact.temporality}")
if len(facts) > 5:
print(f" ... et {len(facts) - 5} autres faits")
except Exception as e:
print(f"❌ Erreur lors de l'extraction: {e}")
import traceback
traceback.print_exc()
exit(1)
# 5. Codage
print("\n5⃣ Proposition de codes CIM-10 et CCAM...")
print(" ⏳ Cela peut prendre 2-3 minutes...")
codeur = Codeur(rag_engine=rag_engine)
try:
coding_proposal = codeur.propose_codes(
facts=facts,
stay_metadata=stay_metadata
)
print("✅ Codage terminé")
print(f"\n📊 RÉSULTATS:")
print(f"\n DP (Diagnostic Principal):")
if coding_proposal.dp:
print(f" {coding_proposal.dp.code} - {coding_proposal.dp.label}")
print(f" Confiance: {coding_proposal.dp.confidence:.2%}")
print(f" Justification: {coding_proposal.dp.reasoning[:150]}...")
else:
print(" Non proposé")
print(f"\n DR (Diagnostic Relié):")
if coding_proposal.dr:
print(f" {coding_proposal.dr.code} - {coding_proposal.dr.label}")
print(f" Confiance: {coding_proposal.dr.confidence:.2%}")
else:
print(" Non proposé")
print(f"\n DAS (Diagnostics Associés Significatifs): {len(coding_proposal.das)}")
for i, das in enumerate(coding_proposal.das[:5], 1):
print(f" {i}. {das.code} - {das.label}")
print(f" Confiance: {das.confidence:.2%}")
if len(coding_proposal.das) > 5:
print(f" ... et {len(coding_proposal.das) - 5} autres DAS")
print(f"\n CCAM (Actes): {len(coding_proposal.ccam)}")
for i, ccam in enumerate(coding_proposal.ccam[:5], 1):
print(f" {i}. {ccam.code} - {ccam.label}")
print(f" Confiance: {ccam.confidence:.2%}")
if len(coding_proposal.ccam) > 5:
print(f" ... et {len(coding_proposal.ccam) - 5} autres actes")
except Exception as e:
print(f"❌ Erreur lors du codage: {e}")
import traceback
traceback.print_exc()
exit(1)
print("\n" + "=" * 60)
print("✅ TEST TERMINÉ AVEC SUCCÈS")
print("=" * 60)