En el mundo actual, gran parte de la información que consumimos y generamos no se encuentra en formatos estructurados, lo que representa un reto significativo para su análisis. Particularmente en el campo de los Sistemas de Información Geográfica, transformar ese “caos” en datos organizados y georreferenciables es clave para generar valor. Esta publicación resume una presentación titulada "De datos a información: transformando el caos en visualizaciones geoespaciales con ArcGIS", en la que se expuso una metodología práctica para estructurar datos no estructurados extraídos de una fuente de noticias, aplicar LLM para extraer entidades clave, y finalmente analizar y visualizar esta información con herramientas de ArcGIS Pro.
Extracción de datos desde fuentes web
El punto de partida fue identificar una fuente rica en contenido informativo: una página web de noticias. A través de técnicas de scraping, se extrajeron múltiples artículos con el objetivo de recopilar información textual relevante. Este contenido fue almacenado inicialmente en un archivo de texto plano, lo cual facilitó su revisión y limpieza preliminar. Este paso fue fundamental para preparar los datos antes de aplicar cualquier técnica de análisis.
A continuación, se presenta el flujo de trabajo para la extracción de noticias relacionadas a una palabra clave en la pagina
Iniciamos importando librerías necesarias
import requests
from bs4 import BeautifulSoup
import os
from urllib.parse import unquote
Importamos módulos como request para hacer peticiones HTTP, BeatifulSoup para interpretar el contenido HTML de la página, os para manejo de datos.
Configuración inicial
# Configuración
PALABRAS_BUSQUEDA = 'Bogotatransito'
FILTRO_TITULOS = ['EN VIVO Movilidad en Bogotá','transporte', 'accidente', 'movilidad']
DESDE = '2025-01-01'
HASTA = '2025-02-15'
DIRECTORIO = r"C:\Users\usuario\Documents\PRUEBA1"
ARCHIVO_CONSOLIDADO = os.path.join(DIRECTORIO, 'noticias_consolidadas.txt')
URL_BASE = f'https://www.eltiempo.com/buscar/?q={PALABRAS_BUSQUEDA}&from={DESDE}&until={HASTA}'
Se definieron filtros específicos para acotar la búsqueda, incluyendo palabras clave y términos que debían estar presentes en los títulos de las noticias. Además, se estableció un rango de fechas, lo que permitió que el código retornara únicamente aquellas noticias que cumplían con los criterios definidos.
Procesamiento de noticias
def procesar_articulo(articulo, url_pagina, num_pagina, idx):
"""Procesa y guarda un artículo individual en el consolidado"""
# Extraer datos básicos
titulo = articulo.get('data-name', 'Sin título').strip()
autor = articulo.get('data-autor', 'Desconocido')
fecha = articulo.get('data-publicacion', 'Fecha desconocida')
categoria = articulo.get('data-category', 'Sin categoría')
id_noticia = articulo.get('data-id', 'sin-id')
# Extraer enlace
h3 = articulo.find('h3')
enlace = h3.find('a')['href'] if h3 and h3.find('a') else None
url_completa = requests.compat.urljoin(url_pagina, enlace) if enlace else None
# Obtener contenido completo
contenido_completo = ""
if url_completa:
try:
response = requests.get(url_completa)
if response.status_code == 200:
soup_noticia = BeautifulSoup(response.content, 'html.parser')
parrafos = soup_noticia.find_all('div', class_='paragraph')
contenido_completo = '\n'.join([p.get_text(strip=True) for p in parrafos])
except Exception as e:
contenido_completo = f"Error obteniendo contenido: {str(e)}"
Este paso consiste en extraer las noticias desde el sitio web y almacenarlas en nuestro repositorio local. Para ello, se realizaron solicitudes HTTP y se interpretó el contenido HTML de la página utilizando herramientas de análisis estructurado, lo que permitió identificar y extraer los elementos relevantes de cada artículo.
Estructuración de datos con modelos de lenguaje (LLM)
Con el contenido textual ya recopilado, el siguiente paso fue transformar esa información no estructurada en una base de datos organizada. Para ello, se utilizaron modelos de lenguaje de gran escala (LLM) capaces de comprender el texto y extraer entidades clave, como ubicaciones, fechas y eventos. Esta extracción se logró mediante la formulación de prompts precisos que guiaban al modelo a identificar y devolver la información de forma estructurada. Este enfoque demostró ser eficiente y flexible, eliminando la necesidad de desarrollar reglas complejas o aplicar técnicas tradicionales de procesamiento de lenguaje natural
PROMPT_IA = """Eres un experto en procesamiento de lenguaje natural y análisis de noticias de Bogotá.
Tu tarea es extraer información clave sobre incidentes de tráfico, Ubicacion, fecha y url de la noticia.
## * Importante - SOLO EXTRAER INCIDENTES, NO RESTRICCIONES DE TRÁNSITO*:
1. *IGNORA cualquier información sobre Pico y Placa, regulaciones vehiculares, restricciones de circulación o medidas de movilidad*.
2. *El título de la noticia es la fuente principal de información*.
3. *El contenido sirve solo como apoyo*, en caso de que el título no tenga datos suficientes.
4. *Si hay múltiples incidentes en la noticia, extrae cada uno por separado con su ubicación correspondiente*.
5. *La ubicación debe estar asociada únicamente al incidente específico, manteniendo la dirección completa* (Ejemplo: Calle 45 con Carrera 7, Bogotá).
6. *Si la ubicación es específica (Ejemplo: Calle 45 con Carrera 7, Bogotá), inclúyela tal cual sin dividirla*.
7. *Si la ubicación no es clara, busca en el contenido referencias como barrios, localidades o puntos de referencia*.
8. *Si la ubicación no está en el título ni en el contenido, usa solo la ciudad principal mencionada (Ejemplo: Bogotá)*.
### *Salida esperada (Formato JSON)*
- "incidentes": una lista de objetos, cada uno con:
- "tipo_incidente": Categoría (ver lista).
- "ubicacion": Ciudad, barrio, calle o cualquier referencia geográfica disponible.
- "fecha_incidente": Formato YYYY-MM-DD (si se encuentra).
- "url_noticia": URL de la fuente.
### *Categorías de incidentes*
- Accidente de tráfico (choques, colisiones, vuelcos)
- Manifestación (protestas, marchas, concentraciones)
- Incidente climático (lluvias, inundaciones, tormentas)
- Falla de infraestructura (semáforos, baches, fallas eléctricas)
- Incendio
- Seguridad (robos, hurtos, disturbios)
- Otro (si no encaja en las anteriores, especificar)
"""
Para lograr una extracción precisa y consistente de la información, se diseñó un prompt detallado que le proporcionó al modelo de lenguaje (LLM) el contexto necesario sobre su tarea: identificar únicamente incidentes relevantes dentro de noticias de Bogotá.
El prompt incluyó instrucciones claras para:
1.Ignorar noticias relacionadas con restricciones de tráfico o normativas como el pico y placa.
2.Extraer la ubicación más específica posible.
3.Separar múltiples incidentes encontrados en una misma noticia.
4.Utilizar barrios o localidades si no se especifica una dirección exacta.
Además, se definió un formato de salida estándar en JSON que estructuraba la información en campos como tipo de incidente, ubicación, fecha y URL de la noticia. Finalmente, se establecieron categorías predefinidas para los tipos de incidentes con el fin de normalizar los resultados: accidente de tráfico, manifestación, incidente climático, falla de infraestructura, incendio, seguridad, y otros.
A continuación, se muestra la base de datos estructurada obtenida del LLM:
Análisis geoespacial con ArcGIS Pro
Con los datos ya estructurados y listos para el análisis, se integraron en ArcGIS Pro para su representación y análisis geoespacial. Uno de los enfoques principales fue la identificación de patrones espaciales mediante el análisis de puntos calientes, lo cual permitió resaltar áreas con mayor concentración de eventos relevantes
El análisis espacial realizado en ArcGIS Pro permitió identificar zonas con concentraciones de incidentes significativamente altas o bajas, utilizando la herramienta de Hot Spot Analysis (Getis-Ord Gi). En el mapa resultante, las zonas calientes (tonos rojos) representan barrios donde la frecuencia de incidentes es estadísticamente mayor de lo esperado, mientras que las zonas frías (tonos azules) indican áreas donde se esperaba una mayor concentración, pero esta resultó ser baja. Por su parte, las zonas en blanco representan áreas donde la distribución de los incidentes no mostró un patrón estadísticamente significativo, lo que sugiere una distribución aleatoria.
Gracias a las capacidades del ecosistema ArcGIS, es posible construir tableros de control interactivos que permiten explorar la información de manera dinámica y geográfica. Utilizando aplicaciones como ArcGIS Dashboards, se desarrolló un producto que centraliza los datos estructurados previamente procesados y los presenta de forma accesible y visual. Un ejemplo funcional puede consultarse en el siguiente enlace: Dashboard Incidentes
Este tablero permite realizar consultas puntuales directamente sobre los incidentes mapeados, desplegando información clave como el título de la noticia, tipo de incidente, ubicación, fecha y un enlace directo a la fuente original. Además, también es posible realizar consultas a nivel de polígono, accediendo a información contextual adicional como el nombre del barrio y el tipo de zona, mostrando los incidentes contenidos dentro de ese límite espacial.
Esta herramienta no solo enriquece el análisis, sino que también mejora la toma de decisiones al ofrecer una visualización geográfica clara.
Resultados y beneficios del enfoque
La integración de técnicas de scraping, modelos LLM y herramientas de análisis geoespacial en ArcGIS Pro permitió no solo estructurar grandes volúmenes de texto no organizado, sino también obtener una visión espacial clara de los eventos descritos en las noticias. El análisis de puntos calientes reveló zonas con alta densidad de ocurrencias asociadas a la temática analizada, lo cual facilitó la identificación de patrones, tendencias y posibles focos de atención. Asimismo, el tablero interactivo ofreció una herramienta potente para la exploración dinámica de la información, lo que resultó útil para la toma de decisiones informadas en contextos operativos o estratégicos.
Este enfoque demostró que es posible conectar el poder de la inteligencia artificial con los SIG para transformar información caótica en conocimiento útil, reforzando la importancia de adoptar herramientas modernas para el análisis geoespacial en escenarios reales.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.