v1.3.1: filter-score (titel 2x + summary 1x, drempel 2)
- losse 1-hit in summary volstaat niet meer: 'ns-trein' in een rechtszaak-artikel (stenengooier) telt als 1 cluster en wordt geblokkeerd - cluster-aware teller: aaneengesloten matches (NS-trein, openbaar vervoer, pdf) samenvoegen - bus(?:sen)? suffix: 'Meer bussen naar TU' komt terug - root-cause config-corruptie: re.sub-replacement de-escaped \\b naar \b (YAML-backspace); nu regel-bewerking zonder escape-processing
This commit is contained in:
parent
5d75f490fc
commit
dff304ba56
3 changed files with 23 additions and 5 deletions
|
|
@ -51,7 +51,7 @@ rss_change_level = EventType.find("xyz.maubot.rss", t_class=EventType.Class.STAT
|
|||
DEFAULT_MATCH_FILTER = (
|
||||
r"(?i)"
|
||||
r"\b(?:ns|arriva|qbuzz|connexxion|cxx|transdev|keolis|ret|gvb|ebs|htm|syntus|breng|u-ov|allgo|flixbus|blauwnet|r-net|valleilijn|waterbus|eurostar|thalys|randstadrail|gvu|ov)\b"
|
||||
r"|\b(?:bus|tram|metro)(?:halte|haltes|lijn|lijnen|station|stations|verkeer|net|staking)?\b"
|
||||
r"|\b(?:bus|tram|metro)(?:halte|haltes|lijn|lijnen|station|stations|verkeer|net|staking|sen)?\b"
|
||||
r"|\btrein(?:en|verkeer|stel(?:len)?|staking|ongeluk|reizigers?|station|stations)?\b"
|
||||
r"|\b(?:spoorweg|spoorbaan|spoorlijn|spoorverkeer|spoorwegovergang|spoorstoring|perron|perrons|overweg|overwegen|seinstoring|wisselstoring|sein|ontsporing|ontspoord|spoorstaking)\b"
|
||||
r"|\b(?:openbaar vervoer|dienstregeling|reizigers?|inchecken|uitchecken|pont|ponten|lightrail|pendelbus|shuttlebus)\b"
|
||||
|
|
@ -134,11 +134,29 @@ class RSSBot(Plugin):
|
|||
except Exception:
|
||||
self.log.exception("Fatal error while polling feeds")
|
||||
|
||||
@staticmethod
|
||||
def _filter_score(title: str, summary: str, match_filter: str) -> int:
|
||||
"""Score = 2× hits in titel + 1× hits in summary. Aaneengesloten matches
|
||||
(bv 'NS-trein', 'openbaar vervoer') tellen als 1 cluster."""
|
||||
def count(text: str) -> int:
|
||||
spans = sorted((m.start(), m.end()) for m in re.finditer(match_filter, text))
|
||||
if not spans:
|
||||
return 0
|
||||
clusters, prev_end = 1, spans[0][1]
|
||||
for s, e in spans[1:]:
|
||||
if s - prev_end <= 1:
|
||||
prev_end = max(prev_end, e)
|
||||
else:
|
||||
clusters += 1
|
||||
prev_end = e
|
||||
return clusters
|
||||
return 2 * count(title) + count(summary)
|
||||
|
||||
async def _send(self, feed: Feed, entry: Entry, sub: Subscription) -> EventID | None:
|
||||
match_filter = self.config["match_filter"]
|
||||
if match_filter:
|
||||
haystack = f"{entry.title}\n{html.unescape(re.sub(r'<[^>]+>', '', entry.summary))}"
|
||||
if not re.search(match_filter, haystack):
|
||||
summary = html.unescape(re.sub(r"<[^>]+>", "", entry.summary))
|
||||
if self._filter_score(entry.title, summary, match_filter) < 2:
|
||||
return None
|
||||
|
||||
message = sub.notification_template.safe_substitute(
|
||||
|
|
|
|||
Loading…
Reference in a new issue