Požari SDŽ

Doprinos 1 → Usporedba

Usporedba: koliko su točni regex i LLM

Završni korak Doprinosa 1 — mjerimo oba pristupa na istom „gold setu" i vidimo tko, gdje i zašto pobjeđuje. Ovdje je objašnjeno kako mjerimo i kako kod radi.

1. Cilj

Imamo tri stvari: točne odgovore (gold set), predikcije regexa i predikcije LLM-a. Uspoređujemo predikcije s točnim odgovorima i dobivamo brojke koje pokazuju koji je pristup bolji — i tablicu konkretnih grešaka za analizu.

2. Kako mjerimo — jednostavno

Za svaki tekst gledamo mjesto koje je pristup predvidio i uspoređujemo ga s točnim. Svaki slučaj padne u jednu od četiri kategorije:

OznakaZnačenje
TP (pogodak)predvidio mjesto i točno je
FP (lažni pogodak)predvidio mjesto, ali krivo (ili ga uopće nije trebalo biti)
FN (promašaj)mjesto postoji, ali ga nije pronašao
TNnema mjesta i ništa nije predvidio (točno)

Iz tih brojeva računamo tri mjere:

MjeraFormulaPitanje
PreciznostTP / (TP + FP)Kad kaže mjesto, koliko često je u pravu?
OdzivTP / (TP + FN)Od svih mjesta, koliko ih pronađe?
F12·P·O / (P + O)Zajednička ocjena (spoj gornjih dviju)

Za vrijeme je jednostavnije: samo postotak pogodaka (HH:MM) na primjerima gdje vrijeme uopće postoji.

3. Kod objašnjen

Sav kod je u doprinos1_geolokacija/usporedba.py 📄 Otvori kod

Kategorizacija jedne predikcije

def oznaci_mjesto(pred, gold):
    p, g = norm(pred), norm(gold)      # oboje na mala slova, bez viška razmaka
    if g and p:  return "TP" if p == g else "FP"   # predvidio: točno ili krivo
    if g and not p:  return "FN"       # postoji mjesto, nije pronađeno
    if not g and p:  return "FP"       # nema mjesta, a nešto je rekao
    return "TN"                        # nema mjesta i ništa nije rekao

Iz oznaka u preciznost / odziv / F1

def metrike(oznake):
    tp = oznake.count("TP"); fp = oznake.count("FP"); fn = oznake.count("FN")
    preciznost = tp / (tp + fp)
    odziv      = tp / (tp + fn)
    F1         = 2 * preciznost * odziv / (preciznost + odziv)
    return preciznost, odziv, F1

LLM se pamti da ne plaćamo dvaput

LLM pozivi koštaju, pa se rezultati spremaju u rezultati/llm_predikcije.csv. Sljedeći put se učitaju iz te datoteke umjesto ponovnog poziva:

if LLM_CACHE.exists():
    # učitaj gotove LLM predikcije iz datoteke (bez novih poziva/troška)
    ...
# pozovi LLM samo za tekstove kojih još nema u predmemoriji

Graf

Na kraju se crta stupčasti graf koji uspoređuje regex i LLM po preciznosti, odzivu i F1 (rezultati/graf_mjesto.png).

4. Pokretanje u fazama

Skripta je namjerno tako složena da se može pokrenuti u koracima:

  1. Samo regex (ne treba API ključ) — čim je gold set označen. Preskoči LLM:
    $env:BEZ_LLM=1 ; python usporedba.py
  2. Puna usporedba (regex + LLM) — kad je .env ključ postavljen:
    python usporedba.py

Skripta upozori ako gold set još nije ručno označen (tada su rezultati regexa lažno savršeni). To je normalno dok se Excel ne popuni.

5. Što izlazi (u mapi rezultati/)

DatotekaŠto sadrži
ispis u terminalupreciznost / odziv / F1 za regex i LLM + točnost vremena
rezultati_usporedbe.xlsxredak-po-redak: točno, regex, LLM i ocjena (TP/FP/FN)
graf_mjesto.pngstupčasti graf usporedbe
llm_predikcije.csvspremljene LLM predikcije (da se ne ponavljaju)

Uz brojke, skripta ispiše i primjere grešaka te koliko je puta LLM bio točan gdje regex nije (i obrnuto) — to je najvrednija građa za pisanje rada.

Ovime je Doprinos 1 kompletan u kodu. Preostaje pokrenuti na označenom gold setu i s API ključem. Status: Napredak.