Urdatorn Claude Opus 5 commited on
Commit
32648f9
·
1 Parent(s): 3e84d96

Report the scheme-only floor beneath the sentence results

Browse files

Sphragis merges seven treebanks that do not overlap in authors, so the
annotation scheme partly predicts the author. A collapsed note under the
sentence table gives what classifiers score when they see annotation markup
and no Greek at all: 34.02 macro-F1 on one sentence and 65.98 on ten, against
a 1.50 majority baseline. A model that does not clearly beat those has
demonstrated source identification rather than authorship attribution.

Figures come from scripts/audit_leakage.py in the dataset repository and are
regenerated with the data.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

src/app.css CHANGED
@@ -119,6 +119,20 @@ tbody tr.selected td.classifier-column { overflow: visible; white-space: normal;
119
  .tooltip { position: fixed; z-index: 50; top: var(--tip-y); left: var(--tip-x); display: grid; gap: 5px; width: 250px; padding: 11px 12px; border: 1px solid var(--border-strong); border-radius: 6px; background: var(--text); color: var(--page); box-shadow: 0 12px 30px rgb(0 0 0 / 18%); font-size: 11px; font-weight: 400; line-height: 1.45; white-space: normal; transform: translateX(-50%); }
120
  .tooltip strong { font-size: 11px; }
121
  .table-caption { display: flex; align-items: center; gap: 6px; margin: 11px 2px 0; color: var(--text-subtle); font-size: 11px; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
  .accuracy-chart { margin-top: 28px; padding: 22px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface); box-shadow: var(--shadow-sm); }
123
  .chart-heading { display: flex; align-items: end; justify-content: space-between; gap: 24px; margin-bottom: 10px; }
124
  .chart-heading h3 { margin: 0 0 5px; font-size: 20px; font-weight: 600; letter-spacing: -0.025em; }
 
119
  .tooltip { position: fixed; z-index: 50; top: var(--tip-y); left: var(--tip-x); display: grid; gap: 5px; width: 250px; padding: 11px 12px; border: 1px solid var(--border-strong); border-radius: 6px; background: var(--text); color: var(--page); box-shadow: 0 12px 30px rgb(0 0 0 / 18%); font-size: 11px; font-weight: 400; line-height: 1.45; white-space: normal; transform: translateX(-50%); }
120
  .tooltip strong { font-size: 11px; }
121
  .table-caption { display: flex; align-items: center; gap: 6px; margin: 11px 2px 0; color: var(--text-subtle); font-size: 11px; }
122
+ .scheme-note { margin: 7px 2px 0; color: var(--text-subtle); font-size: 11px; }
123
+ .scheme-note > summary { display: flex; align-items: center; gap: 6px; cursor: pointer; list-style: none; }
124
+ .scheme-note > summary::-webkit-details-marker { display: none; }
125
+ .scheme-note > summary::after { content: '\203A'; margin-left: 2px; transition: transform 0.12s; }
126
+ .scheme-note[open] > summary::after { transform: rotate(90deg); }
127
+ .scheme-note > summary:hover { color: var(--text-muted); }
128
+ .scheme-note > summary:focus-visible { outline: 2px solid var(--text); outline-offset: 2px; border-radius: 3px; }
129
+ .scheme-note > p { margin: 8px 0 0; max-width: 78ch; line-height: 1.55; }
130
+ .scheme-note .scheme-source { color: var(--text-subtle); }
131
+ .scheme-note code { font-size: 10px; }
132
+ .scheme-table { margin: 8px 0 0; border-collapse: collapse; font-variant-numeric: tabular-nums; }
133
+ .scheme-table th, .scheme-table td { padding: 3px 12px 3px 0; text-align: right; font-weight: 400; }
134
+ .scheme-table thead th { color: var(--text-subtle); font-size: 10px; text-transform: uppercase; letter-spacing: 0.05em; }
135
+ .scheme-table tbody th { text-align: left; color: var(--text-muted); }
136
  .accuracy-chart { margin-top: 28px; padding: 22px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface); box-shadow: var(--shadow-sm); }
137
  .chart-heading { display: flex; align-items: end; justify-content: space-between; gap: 24px; margin-bottom: 10px; }
138
  .chart-heading h3 { margin: 0 0 5px; font-size: 20px; font-weight: 600; letter-spacing: -0.025em; }
src/lib/components/LeaderboardTable.svelte CHANGED
@@ -1,5 +1,5 @@
1
  <script lang="ts">
2
- import { displayScore, metreTaskColumns, sentenceTaskColumns, type ResultRow, type TaskKey } from '$lib/data';
3
  import AuthorAccuracyChart from './AuthorAccuracyChart.svelte';
4
  import ConfusionMatrices from './ConfusionMatrices.svelte';
5
  import InfoTip from './InfoTip.svelte';
@@ -81,6 +81,21 @@
81
  </table>
82
  </div>
83
  <p class="table-caption"><InfoTip title="Scores" text="Values are held-out test macro-F1 percentages. Select a model row to inspect accuracy for each author." /> Scores are test macro-F1 (%). Select a row for per-author accuracy.</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  {#if selectedRow}
85
  <AuthorAccuracyChart row={selectedRow} {columns} onselectauthor={(author) => selectedAuthor = author} />
86
  <ConfusionMatrices row={selectedRow} {columns} {selectedAuthor} />
 
1
  <script lang="ts">
2
+ import { displayScore, metreTaskColumns, schemeBaselineNote, schemeOnlyBaselines, sentenceTaskColumns, type ResultRow, type TaskKey } from '$lib/data';
3
  import AuthorAccuracyChart from './AuthorAccuracyChart.svelte';
4
  import ConfusionMatrices from './ConfusionMatrices.svelte';
5
  import InfoTip from './InfoTip.svelte';
 
81
  </table>
82
  </div>
83
  <p class="table-caption"><InfoTip title="Scores" text="Values are held-out test macro-F1 percentages. Select a model row to inspect accuracy for each author." /> Scores are test macro-F1 (%). Select a row for per-author accuracy.</p>
84
+ {#if unit === 'sentence' && schemeOnlyBaselines.length}
85
+ <details class="scheme-note">
86
+ <summary><InfoTip title="Scheme-only floor" text={schemeBaselineNote} /> Scheme-only floor: {schemeOnlyBaselines.map((baseline) => `${displayScore(baseline.scores.sentence1)} / ${displayScore(baseline.scores.sentence10)}`).join(', ')} on 1 / 10 sentences</summary>
87
+ <p>{schemeBaselineNote} These classifiers see annotation markup and no Greek at all, so a model that does not clearly beat them has demonstrated source identification rather than authorship attribution.</p>
88
+ <table class="scheme-table">
89
+ <thead><tr><th>Probe</th>{#each columns as column}<th>{column.shortLabel}</th>{/each}</tr></thead>
90
+ <tbody>
91
+ {#each schemeOnlyBaselines as baseline}
92
+ <tr><th scope="row">{baseline.probe}</th>{#each columns as column}<td>{displayScore(baseline.scores[column.key])}</td>{/each}</tr>
93
+ {/each}
94
+ </tbody>
95
+ </table>
96
+ <p class="scheme-source">Regenerate with <code>scripts/audit_leakage.py</code>; full report in <code>metadata/leakage_report.json</code>. The <code>source_held_out_*</code> configurations evaluate each author on a treebank absent from its training data.</p>
97
+ </details>
98
+ {/if}
99
  {#if selectedRow}
100
  <AuthorAccuracyChart row={selectedRow} {columns} onselectauthor={(author) => selectedAuthor = author} />
101
  <ConfusionMatrices row={selectedRow} {columns} {selectedAuthor} />
src/lib/data.ts CHANGED
@@ -802,6 +802,32 @@ export const metreResults: ResultRow[] = [
802
  }
803
  ];
804
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
805
  export function displayScore(score: number | undefined): string {
806
  return score === undefined ? '—' : score.toFixed(2);
807
  }
 
802
  }
803
  ];
804
 
805
+ /**
806
+ * Scheme-only baselines from `scripts/audit_leakage.py`.
807
+ *
808
+ * Sphragis merges seven annotation projects that do not overlap in authors, so
809
+ * the annotation scheme is itself a partial answer key. These classifiers see
810
+ * annotation markup and no Greek at all: `inventory` is binary presence of each
811
+ * tag, feature and relation; `markup` adds non-lexical rates. A model that does
812
+ * not clearly beat them has demonstrated source identification rather than
813
+ * authorship attribution.
814
+ *
815
+ * Regenerate with:
816
+ * python scripts/audit_leakage.py --data data --metadata metadata
817
+ */
818
+ export interface SchemeBaseline {
819
+ probe: string;
820
+ scores: Partial<Record<TaskKey, number>>;
821
+ }
822
+
823
+ export const schemeOnlyBaselines: SchemeBaseline[] = [
824
+ { probe: 'Tag inventory only', scores: { sentence1: 17.95, sentence10: 16.65, sentence50: 28.92, sentence100: 27.27 } },
825
+ { probe: 'Non-lexical markup', scores: { sentence1: 34.02, sentence10: 65.98, sentence50: 48.91, sentence100: 41.67 } }
826
+ ];
827
+
828
+ export const schemeBaselineNote =
829
+ 'Sphragis merges seven treebanks that do not overlap in authors, so the annotation scheme partly predicts the author.';
830
+
831
  export function displayScore(score: number | undefined): string {
832
  return score === undefined ? '—' : score.toFixed(2);
833
  }