Annotering och märkning av data
Kunna designa annoteringsinstruktioner, mäta överensstämmelse mellan annotatörer och hantera tvetydiga fall.
Förkunskaper
Intuition
Kvaliteten på ett märkt dataset sätts av instruktionerna, inte av annotatörernas flit. En bra riktlinje har: definition per klass, positiva och negativa exempel, uttalade gränsfall med beslut, och en regel för «vet inte».
Överensstämmelse mäts med Cohens kappa (κ): andel överens korrigerad för slump. κ < 0,4 = riktlinjen är otydlig; 0,6–0,8 = användbar; > 0,8 = stark. Procent överens är vilseledande vid obalans (två annotatörer som alltid säger «neutral» är 95 % överens).
Process: pilot på 50 exempel av 2–3 annotatörer → κ → diskutera oeniga → revidera riktlinjen → pilot igen → först sedan hela mängden, med 10 % överlapp för löpande kontroll. Oeniga fall avgörs av en tredje (adjudicering) och blir exempel i riktlinjen.
Kod
import numpy as np
def cohens_kappa(a, b):
a, b = np.asarray(a), np.asarray(b); labels = np.unique(np.concatenate([a, b]))
po = np.mean(a == b)
pe = sum(np.mean(a == l) * np.mean(b == l) for l in labels)
return (po - pe) / (1 - pe) if pe < 1 else 1.0
a = ["pos", "neg", "neu", "pos", "neu", "neu", "neg", "pos", "neu", "neu"]
b = ["pos", "neg", "neu", "neu", "neu", "neu", "neg", "pos", "pos", "neu"]
print(np.mean(np.array(a) == np.array(b)), round(cohens_kappa(a, b), 2)) # 0.8 0.68
# obalans: 95 % överens kan vara κ ≈ 0
x = ["neu"] * 95 + ["pos"] * 5; y = ["neu"] * 95 + ["neg"] * 5
print(np.mean(np.array(x) == np.array(y)), round(cohens_kappa(x, y), 2)) # 0.95 -0.05
För fler än två annotatörer: Fleiss' kappa eller Krippendorffs alfa (krippendorff-paketet).
Behärskning innebär
- Skriver annoteringsinstruktioner med definitioner och gränsfall
- Mäter överensstämmelse med Cohens kappa
- Hanterar oenighet: adjudicering, revidering av riktlinjer
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- Wikipedia — Cohen's kappa (CC BY-SA 4.0) — CC BY-SA 4.0
- Krippendorff — Content Analysis (referens) — CC BY-SA 4.0