|
|
|
|
|
""" |
|
|
Test simplifié de l'agent NER médical + Mapper de template |
|
|
Extraction → Affichage → Mapping → Affichage → Fichier TXT |
|
|
""" |
|
|
import os |
|
|
import sys |
|
|
from type3_extract_entities import MedicalNERAgent, ExtractedData |
|
|
from medical_template3_mapper import MedicalTemplateMapper, create_filled_medical_report |
|
|
|
|
|
|
|
|
def main(): |
|
|
"""Test simplifié : extraction + mapping + génération fichier""" |
|
|
print("🏥 TEST AGENT NER MÉDICAL + MAPPER") |
|
|
print("=" * 50) |
|
|
|
|
|
|
|
|
transcription = """Compte rendu classique. L'utérus est antéversé de taille 7,8 cm 60 d'hystérométrie |
|
|
3,7 d'endomètre triangulaire zone jonctionnelle épaissie focale d'adénomyose diffuse fibromes |
|
|
myomètre pas de fibromes. Le col voulut le laisser comme il est la morphologie triangulaire. |
|
|
L'ovaire droit mesure 26 x 20 mm, 5 follicules. L'ovaire gauche accessibilité au maître rétro |
|
|
thérape par contre l'autre il est normal il mesure 25 x 19 mm siège de CFA : 22 follicules. |
|
|
Le Doppler : IP 3,24 - IR 0,91 et le reste tout en fait qui est l'ovaire gauche d'accès |
|
|
difficile à rétro-utérin.""" |
|
|
|
|
|
try: |
|
|
|
|
|
print("🔬 ÉTAPE 1: EXTRACTION DES ENTITÉS MÉDICALES") |
|
|
print("-" * 50) |
|
|
|
|
|
agent = MedicalNERAgent() |
|
|
extracted_data = agent.extract_medical_entities(transcription) |
|
|
|
|
|
|
|
|
print(agent.print_extraction_report(extracted_data)) |
|
|
|
|
|
|
|
|
print("\n📋 ÉTAPE 2: MAPPING VERS TEMPLATE") |
|
|
print("-" * 50) |
|
|
|
|
|
mapper = MedicalTemplateMapper() |
|
|
mapping_result = mapper.map_extracted_data_to_template(extracted_data) |
|
|
|
|
|
|
|
|
print(mapper.print_mapping_report(mapping_result)) |
|
|
|
|
|
|
|
|
print("\n💾 ÉTAPE 3: GÉNÉRATION DU FICHIER") |
|
|
print("-" * 50) |
|
|
|
|
|
output_file = "rapport_medical_final.txt" |
|
|
with open(output_file, 'w', encoding='utf-8') as f: |
|
|
f.write("RAPPORT MÉDICAL GÉNÉRÉ AUTOMATIQUEMENT\n") |
|
|
f.write("=" * 50 + "\n\n") |
|
|
f.write("📋 DONNÉES EXTRAITES:\n") |
|
|
f.write(agent.print_extraction_report(extracted_data)) |
|
|
f.write("\n\n📄 TEMPLATE REMPLI:\n") |
|
|
f.write("-" * 50 + "\n") |
|
|
f.write(mapping_result.filled_template) |
|
|
|
|
|
|
|
|
f.write("\n\n📊 STATISTIQUES:\n") |
|
|
f.write("-" * 30 + "\n") |
|
|
f.write(f"Score d'extraction: {extracted_data.extraction_confidence:.1%}\n") |
|
|
f.write(f"Champs mappés: {len(mapping_result.mapped_fields)}\n") |
|
|
f.write(f"Score de mapping: {mapping_result.mapping_confidence:.1%}\n") |
|
|
f.write(f"Erreurs de mapping: {len(mapping_result.errors)}\n") |
|
|
|
|
|
print(f"✅ Rapport médical sauvegardé dans: {output_file}") |
|
|
|
|
|
|
|
|
print(f"\n📊 RÉSUMÉ FINAL:") |
|
|
print(f" 🎯 Score d'extraction: {extracted_data.extraction_confidence:.1%}") |
|
|
print(f" 🎯 Champs mappés: {len(mapping_result.mapped_fields)}") |
|
|
print(f" 🎯 Score de mapping: {mapping_result.mapping_confidence:.1%}") |
|
|
print(f" ⚠️ Erreurs: {len(mapping_result.errors)}") |
|
|
print(f" 📝 Placeholders non mappés: {len(mapping_result.unmapped_placeholders)}") |
|
|
|
|
|
|
|
|
if mapping_result.errors: |
|
|
print(f"\n⚠️ ERREURS DE MAPPING:") |
|
|
for error in mapping_result.errors: |
|
|
print(f" - {error}") |
|
|
|
|
|
|
|
|
if mapping_result.unmapped_placeholders: |
|
|
print(f"\n📝 QUELQUES PLACEHOLDERS NON MAPPÉS:") |
|
|
for placeholder in mapping_result.unmapped_placeholders[:5]: |
|
|
print(f" - {placeholder[:60]}...") |
|
|
|
|
|
print("\n🎉 PROCESSUS TERMINÉ AVEC SUCCÈS!") |
|
|
|
|
|
|
|
|
print(f"\n👁️ APERÇU DU TEMPLATE REMPLI (100 premiers caractères):") |
|
|
print("-" * 50) |
|
|
preview = mapping_result.filled_template[:200] + "..." if len(mapping_result.filled_template) > 200 else mapping_result.filled_template |
|
|
print(preview) |
|
|
|
|
|
except Exception as e: |
|
|
print(f"\n💥 ERREUR: {e}") |
|
|
import traceback |
|
|
traceback.print_exc() |
|
|
|
|
|
if __name__ == "__main__": |
|
|
main() |