Gate place-based blocks on a literal mention

Connor spotted a Missouri redistricting story labelled ohio-state-politics.
Measuring showed that was not an isolated slip: 66% of the winners of a
place-based block named no place at all. Glastonbury, Anthony Albanese and a
Tim Montgomerie story were all scoring as italy-mexico; a singing-apraxia story
was ohio-state-politics.

Embeddings model meaning well and named entities poorly -- "Italian politics"
and "Australian politics" are nearly the same vector. Place is identity, not
meaning, so it is matched lexically, which is the same division of labour that
makes lexical comparison right for syndication detection and wrong for
clustering. Blocks carry `requires_any`; a block cannot win for an item whose
text names none of its terms.

Word boundaries, not substrings: "rome" is inside "chrome" and "mali" inside
"normalise". That is the trap the old blocklist fell into with "nfl" inside
"conflict".

The first implementation was wrong in a way worth recording, because it looked
correct and measured almost unchanged (66% -> 30%). It wrote a sentinel into the
RAW score before normalisation -- but when most items are gated, that sentinel
becomes the block's own mean, so a gated item z-scored to roughly zero and could
still win. Normalisation erased the gate. Applied after normalisation instead:
66% -> 0%, and place-block winners fell from 140 to 10, so 130 items now land in
the block they actually belong to.
This commit is contained in:
connor committed 2026-09-08 17:06:58 -04:00
1 parent b0e509ea92
commit e99b7c9fb7
3 files changed
+171

No files matched your search

+11
View File
@@ -204,6 +204,13 @@ probes = [
"Federal agencies are restructured by executive order, prompting legal challenges.",
]
# `requires_any` gates a block on a literal, word-boundary mention. Embeddings
# model meaning well and named entities poorly -- "Italian politics" and
# "Australian politics" are nearly the same vector -- so 66% of the winners of a
# place block named no place at all: Glastonbury and Anthony Albanese were
# scoring as italy-mexico, and a singing-apraxia story as ohio-state-politics.
# Place is identity, not meaning, so it is matched lexically.
#
# --- place -------------------------------------------------------------------
[[interest]]
id = "urbanism"
@@ -217,6 +224,7 @@ probes = [
[[interest]]
id = "cincinnati"
requires_any = ["cincinnati", "hamilton county", "northern kentucky", "covington", "newport", "over-the-rhine", "ohio"]
group = "local"
weight = 0.9
local = true
@@ -230,6 +238,7 @@ probes = [
[[interest]]
id = "kentucky-louisville"
requires_any = ["kentucky", "louisville", "frankfort", "lexington"]
group = "local"
weight = 0.6
local = true
@@ -241,6 +250,7 @@ probes = [
# coverage alongside Cincinnati city government.
[[interest]]
id = "ohio-state-politics"
requires_any = ["ohio", "columbus", "cleveland", "toledo", "dayton", "akron", "statehouse"]
group = "local"
weight = 0.75
local = true
@@ -257,6 +267,7 @@ probes = [
# the consumer-lifestyle veto must not swallow it.
[[interest]]
id = "italy-mexico"
requires_any = ["italy", "italian", "rome", "milan", "naples", "sicily", "meloni", "mexico", "mexican", "mexico city", "sheinbaum", "guadalajara", "monterrey"]
weight = 0.75
probes = [
"Italian politics, government coalitions and social policy in Italy.",