Labb: bygg och validera en benchmark
Bygga verktygen som gör en fallmängd till en benchmark — annotatörsöverensstämmelse, kontamineringskoll mot en korpus, validering mot baslinjer (golv, tak, diskriminering) och ett datakort — och köra dem på en given fallmängd.
Teori
En benchmark är ett mätinstrument: mätdomän, facit med känd tillförlitlighet (κ), skydd mot kontaminering (n-gram-överlapp, kanarier), och validering som visar att den skiljer system åt (ingen mättnad, inget golv). Ett datakort dokumenterar källa, licens, konstruktion och kända skevheter.
Deluppgifter
- kappa —
cohens_kappa(a, b)för två lika långa etikettlistor (strängar).load_jsonl(path). - kontaminering —
ngrams(text, n)→ mängd av n-gram (ord, gemener, bara \w+);contaminated(cases, corpus_text, n=8)→ lista av case-id vars fråga har minst ett n-gram i korpusen. - validering —
validate(cases, results)där results är {system: {case_id: bool}} → {"floor": [id som ingen klarar], "ceiling": [id som alla klarar], "discrimination": andel fall där systemen skiljer sig, "accuracy": {system: andel}}. - datakort —
datacard(cases, meta)→ markdown-sträng med rubrikerna "# <title>", "## Mätdomän", "## Källa och licens", "## Konstruktion", "## Kända skevheter", "## Statistik" (antal fall, fördelning per svårighet).
Godkänt när: ok >= 1
Startkoden
körs i en isolerad sandlåda på servern"""Benchmark-verktyg. Fyll i funktionerna."""
import json
import re
def load_jsonl(path):
return [json.loads(l) for l in open(path, encoding="utf-8") if l.strip()]
def cohens_kappa(a, b):
"""Cohens kappa för två lika långa listor med etiketter."""
# TODO
raise NotImplementedError
def ngrams(text, n=8):
"""Mängd av n-gram över ord (gemener, bara \\w+)."""
# TODO
raise NotImplementedError
def contaminated(cases, corpus_text, n=8):
"""Lista av case-id (i indataordning) vars 'question' delar minst ett n-gram med korpusen."""
# TODO
raise NotImplementedError
def validate(cases, results):
"""results: {system: {case_id: bool}}. Returnerar {"floor": [...], "ceiling": [...], "discrimination": float, "accuracy": {system: float}}."""
# TODO
raise NotImplementedError
def datacard(cases, meta):
"""Markdown med rubrikerna: '# <title>', '## Mätdomän', '## Källa och licens', '## Konstruktion', '## Kända skevheter', '## Statistik'."""
# TODO
raise NotImplementedError
Du skriver koden, tester du inte ser avgör om den håller. Skapa ett gratis konto för att köra labben.
Prova diagnosenSkapa konto gratisFörväntade resultat
κ mellan de två annotatörerna ≈ 0,7; exakt två fall är kontaminerade mot korpusen (c07, c14); valideringen hittar ett takfall och ett golvfall; datakortet innehåller alla sex rubriker. Evalen sätter ok = 1 när allt stämmer.
Vanliga fel
- κ: pe ska summera produkten av marginalerna per etikett, inte bara majoritetsklassen.
- n-gram: normalisera till gemener och ta bort skiljetecken innan du delar — annars missar du överlapp.
- discrimination: ett fall diskriminerar när minst ett system har rätt och minst ett har fel.
- Datakortet: rubrikerna måste vara exakt de angivna (tester söker efter dem).