Skip to content

Semantic frames: figures, frequency audits, ring diagnosis, and the 14-frame audited library - #25

Merged
jdonaldson merged 8 commits into
mainfrom
blog-frames-figs
Jul 5, 2026
Merged

Semantic frames: figures, frequency audits, ring diagnosis, and the 14-frame audited library#25
jdonaldson merged 8 commits into
mainfrom
blog-frames-figs

Conversation

@jdonaldson

Copy link
Copy Markdown
Owner

The full frame-family science arc:

  • Blog figures + JSON results dump for ordering_frames (fresh-run data, no hand-entered cells)
  • Frequency-control audit (freq_control/freq_residual/freq_audit_family): zipf strongly encoded @l0; space retracted (0.89→0.16 residualized — it was word rarity, and it had shipped in the bundled npz); number vindicated (0.94→0.98); kill-law is dose-response (death ≥.69 label|zipf, haircut .49–.59)
  • Color diagnosed as a hue RING (color_ring): circular readout R=0.72@L18 vs linear 0.47 — the r=0.28 scalar failure was a shape mismatch; circularity emerges mid-stack. Same model: time is a line, hue is a ring (cf. Engels et al. 2405.14860)
  • New frames, all audited: certainty 0.92@L19 (prefix-balanced against morphological negation), concreteness 0.88@L16 (Brysbaert norms), animacy 0.94@L17 (size-balanced), warmth/competence-v2/potency (oblique to EPA: warmth|eval 0.31, comp|potency 0.41), weight 0.78@L10
  • Depth gradient re-read: vocabulary-concreteness hypothesis dead (r=−0.03); lexical word-features early (L1–4), relational/world-knowledge late (L16–20)
  • Composition: no direction-level algebra (weight→span 0.22) but genuine bilinear coordinate-level composition (ΔR²+0.19: size matters only for dense objects — felt heaviness, not log-mass)
  • Bundled library: 14 frames, 307KB, mean off-diag |cos| 0.037; tests pass

Blog post (published + corrected same-day): https://jjd.io/posts/semantic-frames.html

ordering_frames.py now writes experiments/results/ordering_frames.json
(recoverability r + peak layer per rung, |cos| matrices at L8/L12) so
figures consume real run output instead of hand-entered cells. Fresh run
replicates the recorded numbers (opinion .99@L4 ... color .28@L17; mean
off-diag .043@L8, max .122). blog_frames_figs.py renders the solarized
figures for the jjd.io post 'Meaning Has More Than Three Numbers'.
…color as a hue ring

freq_control.py: zipf strongly encoded (r=0.92 @l0); 5/7 rungs orthogonal
to it; space flagged (dir cos 0.21, labels corr -0.69 with zipf).
freq_residual.py: space COLLAPSES residualized (0.886 -> 0.162 — it read
word rarity); age survives (0.905 -> 0.828, peak moves L2 -> L14);
material survives; opinion control no-op (0.992 -> 0.989).
color_ring.py: hue is CIRCULAR — cos/sin readout R=0.72 @L18 vs naive
linear 0.47; a*/b* 0.60/0.65; circularity emerges mid-stack (L0 ties).
Same model: time is a line, hue is a ring — linear-vs-circular is
per-concept and per-model (cf. Engels et al. 2405.14860).

CANONICAL_FRAMES drops space (tombstone comment); bundled npz rebuilt
(7 frames, 152KB, mean off-diag |cos| 0.043 -> 0.032 — the family got
MORE orthogonal without the frequency probe in it); tests updated, 15 pass.
…e stays the lone casualty

freq_audit_family.py audits CANONICAL_FRAMES directly (per-frame templates).
number: label|zipf -0.37 but residualized 0.937 -> 0.976 (IMPROVES —
vindicated; the ATOM claims stand). time +0.25, 0.944 -> 0.950. material-
naturalness +0.51 (heaviest surviving label load), 0.921 -> 0.902. size
control 0.981 -> 0.981 byte-identical (second no-op validation of the
method). 11 frames audited total; space is the only kill.
certainty_frame.py: impossible(-3) <-> certain(+3), 22 words, template
'It is {w} that it happened.' Raw CV r 0.921 @L19 (late-stack — epistemic
status is computed deep). Both audit columns green: zipf-residualized
0.926; the certainty-specific MORPHOLOGICAL-NEGATION trap (a probe could
read IMpossible/UNlikely as a prefix detector) defeated by lexicon design
— UNdeniable/INdisputable sit at +3 — and prefix-residualized 0.934.
|cos| vs opinion 0.10: certainty is not Evaluation in epistemic costume.

Enrolled in CANONICAL_FRAMES; bundled npz rebuilt (8 frames, all audited;
mean off-diag |cos| 0.034, certainty max pair 0.110 vs opinion). Next:
wire the dial into the abstain machinery.
… frequency; density dies of it

concreteness (Brysbaert norms, 80 nouns): 0.882 @L16, zipf-clean, orthogonal
to opinion/size/certainty (max 0.04). animacy (37 nouns, size-balanced):
0.944 @L17, zipf-clean, cos vs size 0.02. Both meet the family bar.

warmth_competence horse race: warmth 0.934@L13 clean; potency 0.952@L19
clean; competence raw 0.933 but zipf-residualized 0.628 (label|zipf +0.49
— wounded, needs a rebalanced lexicon). SCM axes are OBLIQUE to EPA, not
reused: warmth|evaluation 0.31, competence|potency 0.42 — social judgment
has its own directions with family resemblance.

frame_algebra: weight 0.775@L10 zipf-clean and nearly orthogonal to size
(0.15 — heavy != big, extending the magnitude separation). But DENSITY
dies the space death (0.673 raw -> -0.002 residualized, label|zipf +0.70)
so the composition test is INVALID pending a frequency-clean density
lexicon (material_investigate's naturalness/density words recovered 0.93
— reuse those). Control clean (opinion->span 0.03).
… weight is a primitive

concreteness (80 Brysbaert nouns, 0.882@L16) and animacy (37 size-balanced
nouns, 0.944@L17) join CANONICAL_FRAMES; npz rebuilt (10 frames, 219KB,
mean off-diag |cos| 0.031, max 0.116=animacy.age). 'metallic' projects
animacy -7.0 — the library knows metal is not alive.

frame_algebra v2 with the legitimate material-noun density (0.927@L24 raw,
zipf-res 0.677 — frequency-entangled but alive, unlike the adjective
lexicon that died): cos(weight, span{size,density}) = 0.224 vs control
0.04-0.07. Weight is NOT a linear composition — the panel is a coordinate
system of independent primitives, not a vector algebra. Caveat: weight ~
size x density is multiplicative; a bilinear test remains open. Kill-law
refined: deaths at |label-zipf| >= .69, haircuts in the .49-.59 band.
depth_gradient.py (13 frames, residualized peaks): lexicon-concreteness
vs depth is r=-0.03 — the vocabulary hypothesis is DEAD (opinion, the most
abstract vocab, peaks L1; animacy, the most concrete, peaks L17). Age's
honest peak L14 also breaks adjective-rung monotonicity. Surviving story
(post-hoc): lexically-coded word features early, relational/world-
knowledge properties late (animacy/certainty/potency/time L16-20).

bilinear_weight.py (2x2 object factorial): no linear composition at the
direction level, but GENUINE bilinear composition at the coordinate level
— dR2 +0.09@L8 -> +0.19@L16; cell means show size matters only for DENSE
objects (big balloon ~ small balloon; anvil >> coin). The weight
coordinate behaves like felt heaviness, not log(mass).

competence v2: rebalanced lexicon (common negatives, rare positives)
label|zipf +0.49 -> +0.02; raw .926 res .925 — haircut closed. Honest
peak moves L13 -> L20, joining potency in the deep social-power cluster.
Horse-race conclusions unchanged (oblique to EPA).
…rary

All four ship-grade from the sweep: warmth 0.934@L13; competence v2
(zipf-rebalanced, +0.02) 0.926/0.925@L20; potency 0.952@L19 (completes
the EPA trio with opinion/Evaluation); weight 0.775@L10 (felt heaviness,
bilinear with size x density). npz rebuilt: 14 frames, 307KB, mean
off-diag |cos| 0.037 over 91 pairs; the only cell >0.2 is
competence-potency 0.344 — the documented oblique-social finding.
@jdonaldson
jdonaldson merged commit 82679f0 into main Jul 5, 2026
0 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant