v1.9.8: titel weegt niet meer 2x — score = titel + samenvatting >= 3

Gebruikersbesluit 2026-09-11: een medium-hit in de TITEL haalt het filter te
makkelijk ('restaurant naast busstation' = 2x2=4 was door). Formule gelijkgemaakt:
score = titelscore + samenvattingscore >= 3. Gevolg (regressie-pinned):
- enkel-woord-medium in titel is nu onvoldoende (fietsenstalling/restaurant-case
  geweerd); zware/sterke woorden en combinaties over 2 families blijven door.
- zwak-alleen-regel (titel-anker + >=2 families) ongewijzigd.
This commit is contained in:
Eddy de Vink 2026-09-11 09:17:08 +02:00
commit 341036cd16
4 changed files with 26 additions and 21 deletions

View file

@ -51,10 +51,12 @@ rss_change_level = EventType.find("xyz.maubot.rss", t_class=EventType.Class.STAT
# Gewogen OV-trefwoord-families voor het match-filter. Elke tuple = (regex, gewicht).
# Per familie wordt 1× geteld per tekst (niet per cluster/herhaling). Drempel (3):
# doorlaten als 2×(titelscore) + 1×(samenvattingscore) >= MATCH_FILTER_THRESHOLD
# doorlaten als titelscore + samenvattingscore >= MATCH_FILTER_THRESHOLD
# (titel weegt NIET extra — besluit 2026-09-11: 'restaurant naast busstation'
# als enige medium-hit in de titel is geen OV-bericht).
# Gewicht 3 (sterk, onmiskenbaar OV): één woord in titel óf samenvatting volstaat.
# Gewicht 2 (medium): één woord in de titel volstaat; in de samenvatting moet er
# een tweede OV-woord bijkomen.
# Gewicht 2 (medium): moet combineren met een andere OV-familie; één medium-hit,
# in titel óf samenvatting, haalt de drempel niet.
# Gewicht 1 (zwak/dubbelzinnig: los "bus", "breng", "overweg", "overwegen", "sein",
# "kaartje", "opwaarderen", "rails", "pendelbus"): moet met een ander OV-woord
# combineren (een tweede, andere familie — dezelfde zwakke familie in titel én
@ -94,16 +96,15 @@ rss_change_level = EventType.find("xyz.maubot.rss", t_class=EventType.Class.STAT
# 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).
# 2. GEWOGEN FAMILIES -> score = titel + samenvatting >= drempel (3).
# - sterk (3): onmiskenbaar OV-jargon/merken/samenvoegingen (spoorlijn,
# bushalte, busverkeer, intercity, lijn 12, ...).
# - medium (2): onmiskenbaar OV maar iets algemener (tram, metro, halte,
# 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).
# pont, ovpay, openbaar vervoer, trein-/bus-/metrostation).
# Moet COMBINEREN met een andere OV-familie: één medium-hit,
# 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).
# - zwak (1): DUBBELZINNIGHEID. Woorden die (ook) buiten het OV
# voorkomen. REGEL: elk dubbelzinnig woord krijgt een EIGEN
# familie (niet samengevoegd), zodat twee verschillende
@ -394,11 +395,12 @@ class RSSBot(Plugin):
@staticmethod
def _filter_passes(title: str, summary: str) -> bool:
"""Gewogen familiescore: doorlaten bij 2×(titelscore) + 1×(samenvattingscore) >= drempel.
"""Gewogen familiescore: doorlaten bij titelscore + samenvattingscore >= drempel
(titel weegt NIET extra — één medium-hit in de titel, 'restaurant naast
busstation', is geen OV-bewijs; besluit 2026-09-11).
Sterke families (gewicht 3) halen de drempel al met één woord in titel óf
samenvatting. Medium (2) in de titel ook; in de samenvatting moet er een
tweede OV-woord bijkomen.
samenvatting. Medium (2) moet combineren met een andere OV-familie.
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
@ -415,7 +417,7 @@ class RSSBot(Plugin):
return True
t_hits = RSSBot._fam_hits(title)
s_hits = RSSBot._fam_hits(summary)
score = 2 * sum(w for _, w in t_hits) + sum(w for _, w in s_hits)
score = sum(w for _, w in t_hits) + sum(w for _, w in s_hits)
if score < MATCH_FILTER_THRESHOLD:
return False
if max(w for _, w in t_hits + s_hits) == 1:
@ -436,7 +438,7 @@ 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 (die vereisen in de samenvatting een tweede OV-woord: een 'pand naast busstation' is geen OV-bericht)\n"
"trein-/bus-/metrostation — één medium-hit volstaat niet, moet combineren met een andere OV-familie\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"
@ -445,7 +447,8 @@ class RSSBot(Plugin):
"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"
"Doorlaten: `2×(titel-score) + 1×(samenvatting-score) ≥ 3`; bij uitsluitend zwakke woorden tellen alleen "
"Doorlaten: `titel-score + samenvatting-score ≥ 3` (titel weegt niet extra); "
"bij uitsluitend zwakke woorden tellen alleen "
"≥2 verschillende families én een zwak woord in de titel"
)