AโG taxonomy
The NEXORA annotation guide describes 7 observation categories (letters A
to G), each with coded labels (e.g. A1). Each 15 s window carries one
label per category; each label has a base score /10 (see
scoring.py::BASE_SCORE).
The 7 categories
| Cat. | Name | Labels | Examples |
|---|---|---|---|
| A | Attention Orientation | A1โA5 | on-task gaze (A1), off-task (A2), peer gaze (A3), prolonged stare (A4), head down (A5) |
| B | Task Activity | B1โB5 | writing (B1), reading (B2), hand raise (B3), idle (B4), off-task interaction (B5) |
| C | Posture | C1โC5 | upright attentive (C1), leaning forward (C2), slouched (C3), head on desk (C4), arms crossed (C5) |
| D | Physical Activity | D1โD5 | yawning (D1), fidgeting (D2), nodding (D3), stretching (D4), no movement (D5) |
| E | Facial / Affective | E1โE5 | neutral (E1), positive affect (E2), confusion (E3), frustration (E4), face obscured (E5) |
| F | Peer Interaction | F1โF4 | none (F1), task talk (F2), off-task talk (F3), physical contact (F4) |
| G | Teacher-Cue Response | G1โG4 | reorients to teacher (G1), no response (G2), delayed (G3), no cue (G4) |
Scoring rules
Window = mean of the 7 category scores (unless overridden):
window score = (A + B + C + D + E + F + G) / 7
Contextual rules (a label's score may depend on other categories):
| Rule | Condition | Result |
|---|---|---|
| A3 resolved by F | A3 + F2 (task talk) |
A = 10 |
A3 + F3 (off-task talk) |
A = 3 | |
| A5 resolved by B | A5 + B1/B2 (writing/reading) |
A = 9 |
A5 + B4/B5 (idle / off-task) |
A = 0 | |
A5 unresolved |
A = 5 | |
| B4 adjusted by A | B4 + A2/A4 (off-task gaze) |
B = 2 |
| otherwise | B = 5 | |
| G2 override | G2 (no response to a cue) |
window = 0 (always) |
Default labels (rule R2)
When a category was not annotated on a window:
A โ A2 (unverifiable gaze) B โ B4 (idle) C โ C1 (standard posture)
D โ D5 (no movement) E โ E1 (neutral) F โ F1 (no interaction) G โ G4 (no cue)
Posture C is sampled every 60 s then propagated (forward_fill) over the
intermediate windows.
Base scores (extract /10)
| Label | Score | Label | Score | Label | Score |
|---|---|---|---|---|---|
| A1 | 10 | B1/B2/B3 | 10 | C2 | 10 |
| A2 | 2 | B4 | 5 | C1 | 8 |
| A4 | 1 | B5 | 0 | C3 | 3 |
| A3 (solo) | 3 | D5 | 7 | C4 | 0 |
| D3 | 10 | C5 | 5 | ||
| E2 | 10 | D2 | 3 | F1 | 8 |
| E1/E5 | 6 | D1 | 2 | F2 | 10 |
| E3 | 5 | D4 | 4 | F3 | 2 |
| E4 | 2 | F4 | 4 | ||
| G1 | 10 | G2 | 0 | G3 | 5 ยท G4 |
Input tolerance
The pipeline accepts free text (human CSV) and normalizes it: category
variants ("physical activity signals" โ D), punctuation/case ignored,
aliases ("on task" โ A1, "writing" โ B1โฆ). What cannot be normalized
goes to silver/rejects.