174 lines
5.8 KiB
Python
174 lines
5.8 KiB
Python
#!/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)
|