diff --git a/60 ScansProcessing/extract_patient_info.py b/60 ScansProcessing/Testy/extract_patient_info.py similarity index 100% rename from 60 ScansProcessing/extract_patient_info.py rename to 60 ScansProcessing/Testy/extract_patient_info.py diff --git a/60 ScansProcessing/corrections.json b/60 ScansProcessing/corrections.json index bd8cd13..66a5a13 100644 --- a/60 ScansProcessing/corrections.json +++ b/60 ScansProcessing/corrections.json @@ -438,5 +438,85 @@ { "original": "6757100592 2026-04-16 Slabá, Radka [Laboratoř] [E789, CKD-EPI 1,31 G2, TG 1,90, glukóza 5,8, HbA1c 36, chol. 4,35, LDL 2,10].pdf", "corrected": "6757100592 2026-04-16 Slabá, Radka [Laboratoř] [E789, prediabetes, CKD-EPI 1,31 G2, TG 1,90, glukóza 5,8, HbA1c 36, chol. 4,35, LDL 2,10].pdf" + }, + { + "original": "395907022 2026-04-10 Herzová, Marie [LZ ortopedie] [gonarthrosis bilat, obstřik kortik+M i.a., indik. lázeňská terapie VII/7 M179].pdf", + "corrected": "395907022 2026-04-10 Herzová, Marie [LZ ortopedie] [gonarthrosis bilat, obstřik kortik+M i.a., indik. lázeňská terapie VII7 M179].pdf" + }, + { + "original": "356031017 2025-10-27 Mejstříková, Marcela [LZ gastroenterologie] [inkompetence kardie, lehce polyp. GE junkce, antrální gastropatie, biopsie].pdf", + "corrected": "356031017 2025-10-27 Mejstříková, Marcela [LZ gastroenterologie] [gastroskopie, inkompetence kardie, lehce polyp. GE junkce, antrální gastropatie, biopsie].pdf" + }, + { + "original": "356031017 2026-01-27 Mejstříková, Marcela [SONO krku] [drobné koloidní uzlíky a spongiformní uzel levého laloku š.ž.].pdf", + "corrected": "356031017 2026-01-27 Mejstříková, Marcela [sono ŠŽ] [drobné koloidní uzlíky a spongiformní uzel levého laloku ŠŽ].pdf" + }, + { + "original": "346204097 2025-11-14 Kopřivíková, Jarmila [PZ neurologie] [11–14NOV2025 embolus M2 ACM sin, trombektomie TICl2c, iCMP].pdf", + "corrected": "346204097 2025-11-14 Kopřivíková, Jarmila [PZ neurologie] [11–14NOV2025, iktus, embolus M2 ACM sin, trombektomie TICl2c, iCMP].pdf" + }, + { + "original": "8351112693 2026-04-27 Zelenková, Petra [sono mamm.] [fibrozní dysplazie, vícečetné fibromy bilat., expanzivní proces ZHQ vlevo s benigními markantami].pdf", + "corrected": "8351112693 2026-04-27 Zelenková, Petra [sono prsù] [fibrozní dysplazie, vícečetné fibromy bilat., expanzivní proces ZHQ vlevo s benigními markantami].pdf" + }, + { + "original": "450113005 2025-01-16 Fiala, Václav [LZ angiologie] [Ektazie AP bilat., sono žil DKK: bil. hluboký žilní syst. bez trombozy, varikozity bilat.].pdf", + "corrected": "450113005 2025-01-16 Fiala, Václav [LZ angiologie] [Ektazie AP bilat., sono žil DKK bil. hluboký žilní syst. bez trombozy, varikozity bilat.].pdf" + }, + { + "original": "450113005 2025-03-28 Fiala, Václav [CT krku, hrudníku, břicha a pánve] [progrese nadbráničníí lymfadenopatie, NHL MZL KS IV A, 1. relaps].pdf", + "corrected": "450113005 2025-03-28 Fiala, Václav [CT krku, hrudníku, břicha a pánve] [progrese nadbráničníí lymfadenopatie, NHL MZL KS IV A, 1. relaps, nekompletní zpráva].pdf" + }, + { + "original": "450113005 2019-02-10 Fiala, Václav [LZ denzitometrie] [snížení kostní denzity v pásmu osteopenie, nehomogenní rozložení denzity].pdf", + "corrected": "450113005 2019-02-10 Fiala, Václav [LZ denzitometrie] [T-1.6, osteopenie, snížení kostní denzity v pásmu osteopenie, nehomogenní rozložení denzity].pdf" + }, + { + "original": "450113005 2026-02-18 Fiala, Václav [LZ hematologie] [MZL, lymfocytóza 42.98, B-NHL CD20+ 65.4%, lymfadenopatie, FIS po kardioverzi].pdf", + "corrected": "450113005 2026-02-18 Fiala, Václav [LZ hematologie] [NHL, lymfocytóza 42.98, B-NHL CD20+ 65.4%, lymfadenopatie, FIS po kardioverzi].pdf" + }, + { + "original": "5862236435 2026-03-18 Kopřivová, Erika [sono břicha] [st.p. IK resekci, IK anastomóza, neo-TI, jaterní steatóza, korové cysty pravé ledviny].pdf", + "corrected": "5862236435 2026-03-18 Kopřivová, Erika [sono břicha] [Crohnova nemoc, st.p. IK resekci, IK anastomóza, neo-TI, jaterní steatóza, korové cysty pravé ledviny].pdf" + }, + { + "original": "5862236435 2026-01-12 Kopřivová, Erika [LZ gastroenterologie] [Crohnova nemoc, st.p. LPSK IK resekci, terapie Entyvio, switch z Remsima 1/2021].pdf", + "corrected": "5862236435 2026-01-12 Kopřivová, Erika [LZ gastroenterologie] [Crohnova nemoc, st.p. LPSK IK resekci, terapie Entyvio, switch z Remsima 12021].pdf" + }, + { + "original": "365123089 2026-04-22 Opršalová, Libuše [Laboratoř] [dg. I839, warfarin, PT ratio 2.32*, INR 2.48*].pdf", + "corrected": "365123089 2026-04-22 Opršalová, Libuše [Laboratoř] [dg. I839, warfarin, PT ratio 2.32, INR 2.48].pdf" + }, + { + "original": "7361130040 2021-12-07 Šilhavá, Simona [LZ plicní] [FVP: FEV1 61%, FEV1/FVC 79%, PEF 48%, TLco 65%, obstrukce].pdf", + "corrected": "7361130040 2021-12-07 Šilhavá, Simona [LZ plicní] [FVP FEV1 61%, FEV1FVC 79%, PEF 48%, TLco 65%, obstrukce].pdf" + }, + { + "original": "5862236435 2026-02-23 Kopřivová, Erika [LZ interna] [hypertenze TK 161/95, BMI 31.87, Crohn-Entyvio, DM2, HLP, hyperurikémie, CPAP].pdf", + "corrected": "5862236435 2026-02-23 Kopřivová, Erika [LZ interna] [hypertenze TK 16195, BMI 31.87, Crohn-Entyvio, DM2, HLP, hyperurikémie, CPAP, ad urologie].pdf" + }, + { + "original": "425412434 null Hornofová, Helena [LZ algologie] [P ramenní funkční, min. bolestivý; L ramenní bolestivý, hybnost dobrá; Biofenac, RTG ramen].pdf", + "corrected": "425412434 2026-04-28 Hornofová, Helena [LZ ambulance bolesti] [nevím datum, P ramenní funkční, min. bolestivý; L ramenní bolestivý, hybnost dobrá; Biofenac, RTG ramen].pdf" + }, + { + "original": "7701120955 2026-04-21 Moudrý, Michal [LZ interna] [EKG sinusový rytmus 64/min, křivka v mezích normy, arteriální hypertenze].pdf", + "corrected": "7701120955 2026-04-21 Moudrý, Michal [LZ interna] [EKG sinusový rytmus 64min, křivka v mezích normy, arteriální hypertenze].pdf" + }, + { + "original": "471126130 2026-04-07 Procházka, Vladimír [LZ angiologie] [CVI bez progrese, bez TEN, varikozity přibývají, Duplex UŽ DK bez obliterace].pdf", + "corrected": "471126130 2026-04-07 Procházka, Vladimír [LZ cévní] [CVI bez progrese, bez TEN, varikozity přibývají, Duplex UŽ DK bez obliterace].pdf" + }, + { + "original": "471126130 2026-02-12 Procházka, Vladimír [LZ kardiologie] [FS 114min, QRS 110, LAH, indikována reablace FS].pdf", + "corrected": "471126130 2026-02-12 Procházka, Vladimír [LZ kardiologie] [plánovaná kontrola, FS 114min, QRS 110, LAH, indikována reablace FS].pdf" + }, + { + "original": "null 2026-04-27 Drakpelova [Laboratoř] [DM2, Glucophage XR 1000 0-0-1, HbA1c 4.5-4.2, Chol 3.07-3.77].pdf", + "corrected": "515820013 2026-04-27 Drakselová, Daniela [INR karta] [07APR2025-10MAR2026].pdf" + }, + { + "original": "5951231044 2026-04-21 Vašinová, Jiřina [PZ ortopedie] [13–21APR2026 impl. TEP coxae l.dx., koxartróza l.dx. KL IV.].pdf", + "corrected": "5951231044 2026-04-21 Vašinová, Jiřina [PZ ortopedie] [13–21APR2026 impl. TEP coxae l.dx., koxartróza l.dx., indikace KLL VII_10].pdf" } ] \ No newline at end of file diff --git a/60 ScansProcessing/extract_patient_info_novy.py b/60 ScansProcessing/extract_patient_info_novy.py index d7aa515..7a22dbf 100644 --- a/60 ScansProcessing/extract_patient_info_novy.py +++ b/60 ScansProcessing/extract_patient_info_novy.py @@ -40,10 +40,13 @@ def _load_env(): _load_env() POPPLER_PATH = r"C:/Poppler/Library/bin" +CORRECTIONS = True # True = corrections.json se načítá a ukládá; False = ignorovat + _DROPBOX = Path(get_dropbox_root()) TO_PROCESS = _DROPBOX / r"Ordinace\Dokumentace_ke_zpracování\Ricoh Fi-8040\KeZpracování" PROCESSED = _DROPBOX / r"Ordinace\Dokumentace_ke_zpracování\Ricoh Fi-8040\Zpracováno" CORRECTIONS_FILE = Path(__file__).parent / "corrections.json" +NAMING_RULES_FILE = Path(__file__).parent / "naming_rules.md" DOKUMENTACE = _DROPBOX / r"Ordinace\Dokumentace_zpracovaná" import threading @@ -180,6 +183,8 @@ def load_corrections() -> list[dict]: return [] def save_correction(original: str, corrected: str): + if not CORRECTIONS: + return corrections = load_corrections() for c in corrections: if c["original"] == original and c["corrected"] == corrected: @@ -190,7 +195,16 @@ def save_correction(original: str, corrected: str): ) print(f" ✓ Korekce uložena ({len(corrections)} celkem)") +def load_naming_rules() -> str: + if NAMING_RULES_FILE.exists(): + content = NAMING_RULES_FILE.read_text(encoding="utf-8").strip() + if content: + return f"Pravidla pro pojmenování souborů (dodržuj vždy):\n{content}\n\n" + return "" + def build_corrections_prompt() -> str: + if not CORRECTIONS: + return "" corrections = load_corrections() if not corrections: return "" @@ -221,6 +235,7 @@ def extract_info(pdf_path: Path) -> dict: image_b64 = base64.standard_b64encode(buf.getvalue()).decode("utf-8") prompt = ( + load_naming_rules() + build_corrections_prompt() + "Toto je naskenovaná lékařská zpráva v češtině. " "Vrať JSON s těmito poli:\n" @@ -235,11 +250,7 @@ def extract_info(pdf_path: Path) -> dict: "- \"poznamka\": krátká klinická poznámka česky, max 80 znaků. " "DŮLEŽITÉ: pokud zpráva obsahuje sekci \"Závěr:\" nebo \"Závěr vyšetření:\", " "použij VÝHRADNĚ obsah této sekce — je nejdůležitější. " - "Teprve pokud závěr chybí, shrň obsah z celé zprávy. " - "U laboratorních výsledků uváděj POUZE hodnoty mimo normu (patologické nálezy) — hodnoty v normě vynech. " - "Osmolalitu nikdy nezmiňuj ani jako patologický nález. " - "Pokud výsledky obsahují glomerulární filtraci (eGFR nebo C_CKD-EPI), přidej její klasifikaci velkými písmeny podle CKD-EPI: " - "eGFR ≥ 90 → CHRI G1, 60–89 → CHRI G2, 45–59 → CHRI G3a, 30–44 → CHRI G3b, 15–29 → CHRI G4, < 15 → CHRI G5.\n" + "Teprve pokud závěr chybí, shrň obsah z celé zprávy.\n" "- \"nazev_souboru\": název souboru ve formátu " "\"{rodne_cislo} {datum_zpravy} {Příjmení}, {Jméno} [{typ_dokumentu}] [{poznamka}].pdf\" " "(jméno bez titulu, RČ bez lomítka)\n" @@ -314,6 +325,10 @@ def run_variant_picker(variants_data: list) -> str | None: capture_output=True, text=True, encoding="utf-8", ) tmp.unlink(missing_ok=True) + if proc.returncode != 0 or not proc.stdout.strip(): + print(f" [variant_picker] returncode={proc.returncode}") + if proc.stderr.strip(): + print(f" [variant_picker] CHYBA:\n{proc.stderr.strip()}") out = proc.stdout.strip() return json.loads(out).get("chosen") if out else None @@ -410,11 +425,10 @@ def process_file(pdf_path: Path): PROCESSED.mkdir(exist_ok=True) dest = PROCESSED / final_name if dest.exists(): - print(f" VAROVÁNÍ: '{final_name}' již existuje, přeskakuji.") - else: - shutil.copy2(chosen, dest) - pdf_path.unlink() - print(f" ✓ Uloženo: {dest.name}") + print(f" Přepisuji existující: {dest.name}") + shutil.copy2(chosen, dest) + pdf_path.unlink() + print(f" ✓ Uloženo: {dest.name}") for t in temp_files: t.unlink(missing_ok=True) # originál mezi temp_files není, je bezpečné diff --git a/60 ScansProcessing/naming_rules.md b/60 ScansProcessing/naming_rules.md new file mode 100644 index 0000000..42f785f --- /dev/null +++ b/60 ScansProcessing/naming_rules.md @@ -0,0 +1,26 @@ +# Pravidla pro přejmenování souborů + +Tato pravidla platí vždy při generování polí `poznamka` a `nazev_souboru`. + +1. Název souboru má vždy tvar: `RODNECISLO YYYY-MM-DD Příjmení, Jméno [TYP ODBORNOST] [popis].pdf` + - TYP je vždy buď `LZ` (lékařská zpráva / ambulantní zpráva) nebo `PZ` (propouštěcí zpráva z hospitalizace). + - Jiné typy dokumentů (Laboratoř, CT, MRI, kolonoskopie, poukaz FT apod.) nemají TYP prefix — píší se celým názvem: `[Laboratoř]`, `[CT břicha]` atd. + - Příklady: `[LZ chirurgie]`, `[PZ interna]`, `[Laboratoř]`, `[CT břicha]` + +2. Když je typ dokumentu PZ (propouštěcí zpráva), umísti do druhé závorky jako první věc data hospitalizace ve tvaru `DDMMMYYYY–DDMMMYYYY` (měsíc třemi písmeny anglicky, velká, bez mezer), za pomlčkou pak popis. + - Příklad: `[PZ interna] [12–15APR2026 srdeční selhání]` + - Pokud je datum přijetí a propuštění ve stejném měsíci, stačí: `[12–15APR2026 ...]` + - Pokud datum hospitalizace nelze určit, druhou závorku napiš bez datumu. + +3. Když je dokument typ "Laboratoř", do `poznamka` uváděj POUZE hodnoty mimo normu (patologické nálezy) — hodnoty v normě vynech. Osmolalitu séra nikdy nezmiňuj, ani když je mimo normu. +4. Pokud laboratorní výsledky obsahují glomerulární filtraci — bývá označena jako eGFR, CKD-EPI nebo CK-EPI — do `poznamka` nikdy nepiš číselnou hodnotu eGFR. Místo toho uveď pouze klasifikaci: eGFR ≥ 90 → CHRIG1, 60–89 → CHRIG2, 45–59 → CHRIG3a, 30–44 → CHRIG3b, 15–29 → CHRIG4, < 15 → CHRIG5. Klasifikaci uváděj pouze pokud je CHRIG2 nebo horší (tj. eGFR < 90) — CHRIG1 je v normě, nezmiňuj ho. +5. Když je dokument typ "Laboratoř" a zpráva obsahuje diagnózu (dg., dg:, diagnóza), umísti ji do `nazev_souboru` jako první část druhé závorky, tedy: `[Laboratoř] [dg. XY00 - stručná poznamka]`. +6. Zkratky a pojmenování: slovo „sono" (sonografie/ultrazvuk) piš vždy malými písmeny — `sono břicha`, `sono ŠŽ`, nikoli `SONO`. Štítnou žlázu označuj vždy zkratkou `ŠŽ`. Sonografii prsu/prsů (sono mamm., sono mamografie, sono mamma apod.) piš vždy jako `sono prsů`. Denzitometrii (DEXA, DXA, denzitometrie) piš vždy pouze jako `[DXA]` — bez prefixu LZ. Algologii piš vždy jako `[LZ léčba bolesti]`. Dermatovenerologii (dermatologie, dermatovenerologie, kožní) piš vždy jako `[LZ kožní]`. Angiologii piš vždy jako `[LZ cévní]`. +7. V číselných hodnotách VŽDY používej desetinnou tečku, nikoli desetinnou čárku. Toto pravidlo platí absolutně pro všechna čísla v `poznamka` i `nazev_souboru` — např. `TG 4.73`, nikoli `TG 4,73`. + +8. Rozpoznávání vzorců — sideropenická anémie: Pokud laboratorní výsledky splňují typický obraz sideropenické (železo-deficitní) anémie, přidej diagnózu jako první část druhé závorky ve tvaru `[sideropenická anémie, ...]`. + Typický obraz (stačí kombinace několika z těchto nálezů): + - Krevní obraz: ↓ Hb, ↓ Htk, ↓ MCV (mikrocytóza), ↓ MCH nebo ↓ MCHC (hypochromie), ↑ RDW (anisocytóza) + - Metabolismus železa: ↓ sérové Fe (železo), ↓ ferritin, ↑ transferrin (nebo TIBC), ↓ saturace transferrinu + - Diagnózu uveď pouze pokud je obraz dostatečně přesvědčivý (alespoň ↓ Hb + ↓ MCV nebo ↓ Fe/ferritin). + - Příklad výsledného názvu: `[Laboratoř] [sideropenická anémie, Hb 98, MCV 71, Fe 5.2]` diff --git a/60 ScansProcessing/pomoc/Pages from 2026-04-27-10-09-03.pdf b/60 ScansProcessing/pomoc/Pages from 2026-04-27-10-09-03.pdf new file mode 100644 index 0000000..d1972c9 Binary files /dev/null and b/60 ScansProcessing/pomoc/Pages from 2026-04-27-10-09-03.pdf differ diff --git a/60 ScansProcessing/rename_dialog.py b/60 ScansProcessing/rename_dialog.py index 134c2ae..4e89e33 100644 --- a/60 ScansProcessing/rename_dialog.py +++ b/60 ScansProcessing/rename_dialog.py @@ -42,7 +42,7 @@ def main(): nazev_bez = nazev[:-4] if nazev.endswith(".pdf") else nazev var = tk.StringVar(value=nazev_bez) - entry = tk.Entry(root, textvariable=var, font=("Segoe UI", 10), width=90) + entry = tk.Entry(root, textvariable=var, font=("Segoe UI", 10), width=135) entry.pack(fill="x", padx=12, pady=(0, 10)) entry.icursor(tk.END) entry.focus_set()