v1.10.0: whitelist alleen titel-anker; medium+zwak uitsluitend in samenvatting geweerd

This commit is contained in:
Eddy de Vink 2026-09-12 09:11:45 +02:00
commit f5dec54165
3 changed files with 57 additions and 12 deletions

View file

@ -89,13 +89,17 @@ rss_change_level = EventType.find("xyz.maubot.rss", t_class=EventType.Class.STAT
# een niet-OV-bericht te veel doorgelaten (gebruikersbesluit, 2026-09-10).
#
# 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, conducteur, ovpay; multi-woord termen).
# 1. WHITELIST -> ALTIJD door BIJ EEN HIT IN DE TITEL. Alleen termen die
# in élke context OV betekenen (merken: NS/ProRail/Arriva; onmiskenbaar jargon:
# spoorstoring, 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).
# Een whitelist-term ALLEEN in de SAMENVATTING laat NIET onvoorwaardelijk
# door: een bijzin als 'de zakelijke bezoeker is ook nodig voor het openbaar
# vervoer' in een economiebericht is geen OV-nieuws (besluit 2026-09-12).
# Zo'n hit scoort via de gewogen families (dezelfde termen staan daar ook in).
# 2. GEWOGEN FAMILIES -> score = som van unieke OV-families over het hele artikel
# (titel + samenvatting; per familie 1× per artikel — herhaling of beide velden
# tellen niet dubbel, besluit 2026-09-11) >= drempel (3).
@ -107,6 +111,12 @@ rss_change_level = EventType.find("xyz.maubot.rss", t_class=EventType.Class.STAT
# in titel óf samenvatting, is onvoldoende — de titel weegt
# niet extra ('restaurant naast busstation' in de titel is
# geen OV-bericht, besluit 2026-09-11).
# EXTRA (besluit 2026-09-12): een medium + zwak-combinatie
# UITSLUITEND in de samenvatting (geen enkele hit in de
# titel) is geen OV-bewijs — 'openbaar vervoer' + 'zakelijke
# reizigers' in een economiebericht telt dan toch op tot de
# drempel. Sterke (3) families blijven in de samenvatting
# gewoon tellen.
# - zwak (1): DUBBELZINNIGHEID. Woorden die (ook) buiten het OV
# voorkomen. REGEL: elk dubbelzinnig woord krijgt een EIGEN
# familie (niet samengevoegd), zodat twee verschillende
@ -199,10 +209,15 @@ MATCH_FILTER_BLACKLIST: frozenset[str] = frozenset({
})
# MATCH_FILTER_WHITELIST: termen die een bericht per definitie OV maken. Eén enkele
# hit in titel óf samenvatting laat ALTIJD door (geen familiescore nodig) — dit is het
# expliciete "onmiskenbaar OV"-signaal, zodat we voor deze termen niet op de gewogen
# hit in de TITEL laat ALTIJD door (geen familiescore nodig) — dit is het expliciete
# "onmiskenbaar OV"-signaal, zodat we voor deze termen niet op de gewogen
# heuristiek hoeven te leunen. Vergelijking is case-insensitive, dus ook 'nederlandse
# spoorwegen', 'prorail' en 'NS' in all-caps titels tellen mee.
# Een whitelist-hit ALLEEN in de samenvatting is géén onvoorwaardelijk signaal
# (besluit 2026-09-12: 'openbaar vervoer' als bijzin in een economiebericht is geen
# OV-nieuws); die term scoort dan via de gewogen families — voor whitelist-termen
# die geen eigen familie hebben (bv. 'treinstel': alleen zwak via \w*trein\w*) is
# een samenvatting-alleen hit dus zwak.
# Termen MOETEN in elke context OV betekenen. Niet hierop (algemeen/dubbelzinnig):
# los 'trein', 'bus', 'metro', 'tram', 'station', 'lijn', 'ov', 'reiziger',
# 'vervoerder', 'sprinter',
@ -407,7 +422,12 @@ class RSSBot(Plugin):
Zwakke woorden (losse 'bus', 'breng', 'overweg', 'overwegen', 'sein',
'opwaarderen', 'kaartje', 'rails', 'pendelbus') moeten combineren met een
ander OV-woord én minstens één zwak woord moet in de titel staan; dezelfde
zwakke familie in titel én samenvatting is géén combinatie. Weert oa
zwakke familie in titel én samenvatting is géén combinatie. Whitelist-termen
(NS, perron, bushalte, openbaar vervoer, ...) laten alleen onvoorwaardelijk
door BIJ EEN HIT IN DE TITEL; in de samenvatting wegen ze mee als gewogen
familie. Een medium + zwak-combinatie UITSLUITEND in de samenvatting (geen
enkele hit in de titel) is geen OV-bewijs ('openbaar vervoer' + 'zakelijke
reizigers' in een economiebericht, besluit 2026-09-12). Weert oa
'VW-bus' (bus matcht niet ná een koppelteken), 'schoolbus', 'bussen rijden
om' in een woningbrand-lead, het werkwoord 'brengen', het idioom 'goed met
elkaar overweg kunnen', 'een wijk opwaarderen', brandweerjargon
@ -415,8 +435,12 @@ class RSSBot(Plugin):
waarin de samenvatting 'station' + 'pendelbus' + 'bus' noemt.
Bewust doorgelaten: krant 'De Metro'/café 'De Tram' (medium) en atleet-
'sprinter' in combinatie met ander OV-woord."""
# Whitelist: één onmiskenbare OV-term (titel óf samenvatting) laat altijd door.
if RSSBot._whitelist_hit(title) or RSSBot._whitelist_hit(summary):
# Whitelist: een onmiskenbare OV-term in de TITEL laat altijd door (het
# artikel kondigt het onderwerp aan: 'NS verlengt noodregeling'). Een
# whitelist-term ALLEEN in de samenvatting is geen OV-bewijs ('openbaar
# vervoer' als bijzin in een economiebericht, besluit 2026-09-12) en
# scoort via de gewogen families hieronder.
if RSSBot._whitelist_hit(title):
return True
t_hits = RSSBot._fam_hits(title)
s_hits = RSSBot._fam_hits(summary)
@ -433,6 +457,11 @@ class RSSBot(Plugin):
# 'bus' in een golfverslag telt anders op tot de drempel).
if not t_hits or len(combined) < 2:
return False
elif not t_hits and 1 in combined.values():
# Medium + zwak uitsluitend in de samenvatting, niets in de titel: geen
# OV-bewijs. 'openbaar vervoer' + 'zakelijke reizigers' in een
# economiebericht telt anders op tot de drempel (besluit 2026-09-12).
return False
return True
@staticmethod
@ -444,13 +473,15 @@ class RSSBot(Plugin):
"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, "
"trein-/bus-/metrostation — één medium-hit volstaat niet, moet combineren met een andere OV-familie\n"
"trein-/bus-/metrostation — één medium-hit volstaat niet, moet combineren met een andere OV-familie; "
"medium + zwak uitsluitend in de samenvatting (geen hit in de titel) telt niet\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 "
"**Whitelist (altijd door bij een hit in de TITEL):** een onmisbare OV-term in de titel is genoeg "
"(NS, ProRail, Nederlandse Spoorwegen, spoorstoring, perron, bushalte, conducteur, "
"ov-chipkaart, ovpay, openbaar vervoer, ...)\n\n"
"ov-chipkaart, ovpay, openbaar vervoer, ...); in de samenvatting alleen weegt zo'n term mee "
"als gewogen familie (medium/sterk)\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"
"Doorlaten: som van unieke OV-families ≥ 3 — één familie telt 1× per artikel "