fix(geo+recall): Länder-Centroid statt Hauptstadt + Eigennamen in GNews-Query

Zwei Fixes aus der jp_demo-Verifikation:

1. Geoparsing — Länder mit Centroid statt Hauptstadt
   Bisher bekam ein Land die Koordinaten seiner Hauptstadt. Damit landeten
   alle "Japan"-Marker exakt auf Tokyo (35.69, 139.69) und die Karte
   suggerierte faelschlich ein Ereignis in der Hauptstadt. Neue Tabelle
   _COUNTRY_CENTROIDS (37 Laender) verortet ein Land in seiner geografischen
   Mitte (Japan: 36.20, 138.25). Laender ohne Centroid-Eintrag fallen auf die
   Hauptstadt zurueck.

2. Recall — Eigennamen in den Google-News-Suchfeed erzwingen
   Beim ersten Refresh fehlt die Headlines-Historie, daher kamen die GNews-
   Such-Keywords aus der Feed-Selektion. Haiku legt Eigennamen (z.B. "Qilin")
   in die en-Liste, die ja-Liste hatte nur Allgemeinbegriffe — die ja-Query
   suchte ohne "Qilin". build_news_search_feeds stellt nicht-englischen
   Sprach-Queries jetzt die 2 wichtigsten en-Keywords voran (Eigennamen
   kommen auch in fremdsprachigen Artikeln lateinisch vor). Damit ist schon
   der erste Refresh spezifisch.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
2026-05-22 02:13:30 +02:00
Ursprung 4e9d9f92f1
Commit 309c97f40a
2 geänderte Dateien mit 68 neuen und 11 gelöschten Zeilen

Datei anzeigen

@@ -58,15 +58,36 @@ def build_news_search_feeds(
locale = _GNEWS_LOCALE.get(lang_key)
if not locale:
continue
kws = keywords_by_lang.get(lang_key) or []
# Fallback: wenn fuer die Sprache keine Keywords da sind, "en" nehmen
# (lateinische Eigennamen matchen auch in fremdsprachigen News-Indizes).
if not kws and lang_key != "en":
kws = keywords_by_lang.get("en") or []
kws = [str(k).strip() for k in kws if str(k).strip()]
if not kws:
lang_kws = [str(k).strip() for k in (keywords_by_lang.get(lang_key) or []) if str(k).strip()]
en_kws = [str(k).strip() for k in (keywords_by_lang.get("en") or []) if str(k).strip()]
if lang_key == "en":
query_terms = en_kws[:max_keywords]
else:
# Fuer nicht-englische Sprachen: die ersten 2 englischen Keywords
# voranstellen. Haiku ordnet Eigennamen/Akronyme (z.B. "Qilin",
# "Asahi") nach vorne — und die kommen auch in fremdsprachigen
# Artikeln lateinisch vor. Ohne das fehlt beim ersten Refresh (noch
# keine Headlines-Historie) der entscheidende Eigenname in der Query.
# Danach 3 sprach-spezifische Keywords.
query_terms = en_kws[:2] + lang_kws[:3]
# Wenn fuer die Sprache gar keine Keywords da sind: ganz auf en.
if not lang_kws:
query_terms = en_kws[:max_keywords]
# Dedup, Reihenfolge erhalten
seen_terms: set[str] = set()
deduped: list[str] = []
for t in query_terms:
tl = t.lower()
if tl in seen_terms:
continue
seen_terms.add(tl)
deduped.append(t)
if not deduped:
continue
query = " ".join(kws[:max_keywords])
query = " ".join(deduped)
if not query or query in seen_queries:
continue
seen_queries.add(query)