v1.9.7: station-samenstellingen medium i.p.v. sterk/whitelist; geen dubbeltelling bus-/metrostation

Gebruikersbesluit 2026-09-11 n.a.v. Omroep West-artikel 'Restaurant weg, pand
staat te verloederen': één 'busstation'-hit in de samenvatting ('pand naast
busstation') is geen OV-nieuws en mocht niet doorgelaten worden.

- Familie station-samenstellingen (trein/bus/metro-station): gewicht 3 -> 2
  (medium). In de samenvatting moet nu een tweede OV-woord bijkomen; in de
  titel volstaat het anker nog (2x2=4).
- 'busstation'/'metrostation' van de whitelist af (whitelist = altijd door).
- 'station' uit de voertuig-samenstelling-familie verwijderd: 'busstation'
  telde dubbel mee (via 'bus' én 'station', 2x3=6).
- validate_filter.py: 6 nieuwe regressie-cases + invariant 2-aanpassing.
This commit is contained in:
Eddy de Vink 2026-09-11 09:07:43 +02:00
commit 086d808dc7
3 changed files with 31 additions and 13 deletions

View file

@ -89,14 +89,21 @@ rss_change_level = EventType.find("xyz.maubot.rss", t_class=EventType.Class.STAT
# Drie lagen, elk met een eigen regel:
# 1. WHITELIST -> ALTIJD door. Alleen termen die in élke context OV
# betekenen (merken: NS/ProRail/Arriva; onmiskenbaar jargon: spoorstoring,
# perron, bushalte, metrostation, conducteur, ovpay; multi-woord termen).
# perron, bushalte, conducteur, ovpay; multi-woord termen).
# REGEL: twijfel je of de term ook buiten het OV kan voorkomen -> NIET hier.
# NIET: station-samenstellingen (busstation/metrostation) — een bericht over
# een pand 'naast het busstation' is geen OV-nieuws (besluit 2026-09-11);
# die wegen mee via de gewogen families (medium).
# 2. GEWOGEN FAMILIES -> score = 2x titel + 1x samenvatting >= drempel (3).
# - sterk (3): onmiskenbaar OV-jargon/merken/samenvoegingen (spoorlijn,
# treinstation, busverkeer, intercity, lijn 12, ...).
# bushalte, busverkeer, intercity, lijn 12, ...).
# - medium (2): onmiskenbaar OV maar iets algemener (tram, metro, halte,
# pont, ovpay, openbaar vervoer, ...); mag niet volledig
# ontbreken, maar telt alleen mee ter ondersteuning.
# pont, ovpay, openbaar vervoer, trein-/bus-/metrostation);
# mag niet volledig ontbreken, maar telt alleen mee ter
# ondersteuning. Station-samenstellingen zijn medium: één
# station-woord náást een ander onderwerp ('pand naast
# busstation') maakt een bericht nog geen OV-bericht
# (besluit 2026-09-11).
# - zwak (1): DUBBELZINNIGHEID. Woorden die (ook) buiten het OV
# voorkomen. REGEL: elk dubbelzinnig woord krijgt een EIGEN
# familie (niet samengevoegd), zodat twee verschillende
@ -129,9 +136,9 @@ MATCH_FILTER_FAMILIES: list[tuple[str, int]] = [
# sterk (3)
(r"\b(?:ns|arriva|qbuzz|connexxion|cxx|transdev|keolis|ret|gvb|ebs|htm|syntus|u-ov|allgo|flixbus|blauwnet|r-net|valleilijn|waterbus|eurostar|thalys|randstadrail|gvu|prorail|hermes|rrreis|qliner|ov)\b", 3), # vervoerders ('Breng' staat in de zwakke groep: botst met het werkwoord "brengen")
(r"\b(?:spoorweg|spoorba(?:an|nen)|spoorlijn|spoorverkeer|spoorwegovergang|spoorbrug|spoorstoring|perron|seinstoring|wisselstoring|spoorstaking)\w*\b", 3), # spoorinfra; let op de klinkerwisseling: 'ontsporing' (open lettergreep, één o) vs 'ontspoord'/'ontspoorde' (dicht, dubbel o) — vandaar beide stammen
(r"\b(?:treinstation|treinstations|metrostation|metrostations|busstation|busstations)\b", 3), # station-samenstellingen: onmiskenbaar OV-jargon
(r"\b(?:treinstation|treinstations|metrostation|metrostations|busstation|busstations)\b", 2), # station-samenstellingen: onmiskenbaar OV, maar MEDIUM — één station-woord náást een ander onderwerp ('pand naast busstation', besluit 2026-09-11) is geen OV-bericht; in de samenvatting moet een tweede OV-woord bijkomen
(r"(?<![\w-])\bstations?\b", 1), # los 'station(s)' is ZWAK: ook tv-/radio-/regionale omroepstations ('de lokale stations'), moet combineren met een andere OV-familie
(r"\b(?:bus|tram|metro)-?(?:halte|haltes|lijn|lijnen|station|stations|verkeer|net|staking|ba(?:an|nen)|hok(?:je|jes)|chauffeur)\w*\b", 3), # voertuig-samenstelling (busstation/metrostation/bushokje/busbanen/…)
(r"\b(?:bus|tram|metro)-?(?:halte|haltes|lijn|lijnen|verkeer|net|staking|ba(?:an|nen)|hok(?:je|jes)|chauffeur)\w*\b", 3), # voertuig-samenstelling (bushalte/buslijn/bushokje/busbanen/…); géén 'station': *station-samenstellingen zitten in de station-familie, anders telde 'busstation' dubbel mee (via 'bus' én 'station') — fix 2026-09-11
(r"\b(?:treinstoring|treinverkeer|treinstaking|treinongeval|treinbotsing|treinongeluk)\w*\b", 3), # trein-jargon-samenstellingen: onmiskenbaar OV
(r"\b\w*trein\w*\b", 1), # losse 'trein' en algemene samenstellingen (stoptrein, goederentrein, treinverkeer al in bovenstaande familie) — ZWAK: 'de trein naar mijn nieuwe huis' is geen OV-jargon, moet combineren met een andere familie
(r"\b(?:intercity|streekvervoer|stadsvervoer|veerdienst|veerboot|veerboten|veerpont|voetveer|veerverbinding|buurtbus|belbus)\w*\b", 3), # treintypes, vervoerssectoren en veren ('sprinter' staat in de zwakke groep: atleet-botsing)
@ -209,9 +216,9 @@ MATCH_FILTER_WHITELIST: frozenset[str] = frozenset({
"spoorbrug", "spoorstaking", "perron", "wisselstoring", "seinstoring", "treinstoring", "treinverkeer",
"treinstaking", "treinongeval", "treinbotsing", "treinstel",
# Bus/tram/metro-jargon
"bushalte", "bushaltes", "busstation", "busbaan", "buslijn", "busnet",
"bushalte", "bushaltes", "busbaan", "buslijn", "busnet",
"busstaking", "tramhalte", "tramlijn", "tramnet", "tramverkeer",
"metrostation", "metrolijn", "metroverkeer",
"metrolijn", "metroverkeer",
# Tarief/vervoerder-jargon
"ov-chipkaart", "ov-staking", "lightrail",
"conducteur", "conducteurs",
@ -426,14 +433,15 @@ class RSSBot(Plugin):
return (
"**OV-matchfilter (vast in code, gewogen families):**\n"
"- Sterk (3): vervoerders (NS, Arriva, ProRail, Qbuzz, ...), spoorinfra (spoorlijn, spoorwegovergang, perron, spoorstoring), "
"trein-/metro-/busstation, samenstellingen als bushalte/buslijn/bushokje/busbaan/busverkeer, treinstoring/treinverkeer/treinstaking, "
"samenstellingen als bushalte/buslijn/bushokje/busbaan/busverkeer, treinstoring/treinverkeer/treinstaking, "
"intercity/streekvervoer/veerdienst/buurtbus/belbus, 'lijn 12'\n"
"- Medium (2): tram, metro, openbaar vervoer, lightrail, halte, pont, ov-chipkaart/ovpay, ov-staking, conducteur\n"
"- Medium (2): tram, metro, openbaar vervoer, lightrail, halte, pont, ov-chipkaart/ovpay, ov-staking, conducteur, "
"trein-/bus-/metrostation (die vereisen in de samenvatting een tweede OV-woord: een 'pand naast busstation' is geen OV-bericht)\n"
"- Zwak (1): losse 'bus' (niet ná een koppelteken), 'pendelbus'/'shuttlebus', 'trein', 'station(s)', 'breng', 'overweg', 'overwegen', "
"'sein', 'kaartje', 'opwaarderen', 'rails', 'inchecken'/'uitchecken', 'dienstregeling', 'chipkaart', 'reisproduct', 'vervoersbewijs', "
"'ontsporen', 'reiziger', 'vervoerder', 'sprinter' — moet combineren met een ander OV-woord, met minstens één zwak woord in de titel\n\n"
"**Whitelist (altijd door):** één onmiskenbare OV-term in titel óf samenvatting is genoeg "
"(NS, ProRail, Nederlandse Spoorwegen, spoorstoring, perron, bushalte, metrostation, conducteur, "
"(NS, ProRail, Nederlandse Spoorwegen, spoorstoring, perron, bushalte, conducteur, "
"ov-chipkaart, ovpay, openbaar vervoer, ...)\n\n"
"Uitgesloten (blacklist): woorden die wél matchen maar geen OV-waarde hebben, "
"o.a. straatnamen rond stations ('stationsstraat', 'stationsweg', ...) en niet-OV-vormen als 'stationcar' en 'stationair'\n\n"

View file

@ -1,5 +1,5 @@
id: nl.eddydevink.rss
version: 1.9.6
version: 1.9.7
modules:
- buzzrss
main_class: RSSBot

View file

@ -90,7 +90,7 @@ for w in AMBIGUOUS:
# --- Invariant 2: onmiskenbare OV-termen mogen niet uitsluitend zwak zijn
UNAMBIGUOUS = [
"spoorstoring", "spoorlijn", "perron", "bushalte", "bushokje",
"metrostation", "busstation", "conducteur", "ovpay", "ns", "prorail",
"conducteur", "ovpay", "ns", "prorail",
"treinstoring", "halte", "openbaar vervoer", "intercity", "buurtbus",
"veerdienst", "lijn 12", "ov-chipkaart",
]
@ -139,6 +139,16 @@ GOLDEN = [
("Bushalte aan de Markt wordt verplaatst", "De halte gaat 200 meter opschuiven.", True),
("Conducteur bekogeld in stoptrein bij Den Haag", "De conducteur is nagekeken.", True),
("Nieuwe app voor ovpay", "De ovpay-app wordt dit najaar vernieuwd.", True),
# fix 2026-09-11: station-samenstellingen zijn medium (niet meer whitelist/
# sterk) — een enkel 'busstation' in de samenvatting naast een ander onderwerp
# ('pand naast busstation') moet GEWEERD worden, en 'busstation' telt maar 1×.
("Restaurant weg, pand staat te verloederen: 'Doorn in het oog'",
"De gemeente Midden-Delfland wil het leegstaande horecapand naast busstation Maasland "
"Viaduct kopen. Het gebouw staat al jaren leeg en maakt een vervallen indruk.", False),
("Pand naast busstation wordt gesloopt", "Het leegstaande pand naast het busstation gaat plat.", True), # titel-anker: 2×2=4 (medium-in-titel volstaat, zelfde regel als 'Metrostation Centraal gesloten')
("Nieuwe fietsenstalling bij busstation", "", True), # titel-anker: 2×2=4
("Busstation wordt verbouwd", "Het busstation krijgt andere perrons.", True), # titel-anker: 2×2=4
# busstation mag niet dubbel meetellen via 'bus' én 'station' (was 2×3=6→nu 1×2)
("Metrostation Centraal tijdelijk gesloten", "De metro's rijden niet.", True),
("NS verlengt noodregeling op traject Zwolle", "Reizigers moeten rekening houden met minder treinen.", True),
("Spoorstoring bij Utrecht opgeheven", "ProRail heeft de wisselstoring verholpen.", True),