Silo de medios — tópicos semánticos sobre Twitter + prensa (BERTopic-lite)

Fecha: 2026-09-17

Qué se hizo

~/nef/news-silo/silo_medios.py (nuevo): embeddings Qwen3-Embedding-0.6B + HDBSCAN + c-TF-IDF sobre el corpus de medios de SPAB (~/nef/estado_turismo/spab-retrieval/data/corpus/*.jsonl, 430 docs Twitter+prensa). Cubre RUTA §5.2.3 (modelado de tópicos), sustituyendo la pasada léxica (sentimiento_corpus.py) por agrupación semántica.

Resultado

16 temas · 276 outliers (64%).

Temas que importan al plan

  • Bacalar → “Aeropuerto de Chetumal amplía nombre para incluir Bacalar” (T4, 8/8 docs de Bacalar): el emergente buscando visibilidad — coincide con su rol de receptor.
  • Tulum/Cancún/Playa → clima extremo (T1), bloqueos viales (T9), asaltos (T13): el saturado con fricción.
  • Sargazo / aguas residuales (T12) cruza el Caribe (Cancún, Bacalar, Playa, Tulum): la señal ambiental del plan.
  • Ruido nacional tangencial: Dr. Simi (T0), “Grito” 15-sept (T8), Sheinbaum (T5).

Hallazgos de calidad (importantes)

  1. 64% outliers + un clúster de spam tipo “saludos desde X, manda pv” (T14).
  2. El retriever corpus_social.py usa queryType: "Latest" → atrapa engagement-spam y noticias nacionales que mencionan el destino de paso.
  3. Falta filtro de calidad: longitud mínima, descartar saludos/replies, umbral de relevancia (p. ej. el nombre del destino en título/lead, no solo mención).

Filtro añadido (mismo día, segunda pasada)

silo_medios.py ahora limpia en ingesta: strip de URLs/mentions/hashtags, longitud mínima 25, blacklist de spam/engagement (saludos, “manda pv”, “me encantó tu video”, “suscríbete”, etc.) y dedup por texto normalizado.

  • Social (Twitter+prensa): 430 → 375 docs, 12 temas limpios (el clúster de “saludos” desapareció). Descarte: 43 dup + 6 spam + 6 cortos.
  • Tema nuevo relevante: “Cancún, Puerto Vallarta y Los Cabos pierden turistas en verano 2026 — sargazo, superpeso, inseguridad, falta de vuelos” → validación externa de la narrativa de saturación/colapso del plan.

YouTube (capa de voz): señal baja para tópicos

  • 2,886 comentarios → tras filtro 2,382 docs, pero HDBSCAN colapsa en 1 solo clúster genérico (top terms: “video, no, gracias, yo, mi”). Los comentarios son mayormente engagement (“me encantó tu video”, “mil gracias”).
  • Tienen señal de SENTIMIENTO real (Tulum: “víctima de su propia avaricia”, “taxis elevadísimos”; Bacalar: fondas, tren Maya) pero diluida.
  • Decisión: YouTube se usa como capa de sentimiento (léxico, ya en sentimiento_corpus.py), NO para modelado de tópicos. Mezclarlo con social hunde el clustering (la masa genérica domina).

Siguiente

  • Evolución temporal del tópico “precio” (el plan lo pide) → el corpus ya tiene fecha; falta agrupar por mes (sobre la capa social limpia, no YouTube).
  • YouTube como sentimiento: correr sentimiento_corpus.py por destino y reportar el diferencial emergente vs consolidado (Tulum “avaricia” vs Bacalar “comida/budget”).