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:
| Oznaka | Znač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 |
| TN | nema mjesta i ništa nije predvidio (točno) |
Iz tih brojeva računamo tri mjere:
| Mjera | Formula | Pitanje |
|---|---|---|
| Preciznost | TP / (TP + FP) | Kad kaže mjesto, koliko često je u pravu? |
| Odziv | TP / (TP + FN) | Od svih mjesta, koliko ih pronađe? |
| F1 | 2·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:
- Samo regex (ne treba API ključ) — čim je gold set označen. Preskoči LLM:
$env:BEZ_LLM=1 ; python usporedba.py - Puna usporedba (regex + LLM) — kad je
.envključ 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 terminalu | preciznost / odziv / F1 za regex i LLM + točnost vremena |
rezultati_usporedbe.xlsx | redak-po-redak: točno, regex, LLM i ocjena (TP/FP/FN) |
graf_mjesto.png | stupčasti graf usporedbe |
llm_predikcije.csv | spremljene 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.