Ni una muerte vial: automatizando la recolección de información periodística

Hector Garrido
Codeando México
Published in
7 min readAug 30, 2023

Introducción

Este proyecto nace del dolor, pero también de la esperanza. Para honrar la memoria de todas las víctimas de siniestros de tránsito, nos abocamos a reconocer y visibilizar a los peatones y ciclistas atropellados en el país.

Así nos recibe Ni una muerte vial, iniciativa que surgió a partir de la muerte de Manu, activista de movilidad, en 2018. Su objetivo es documentar los accidentes viales que ocurren a lo largo del país y abogar por políticas públicas que contribuyan a resolver los problemas de movilidad urbana.

Una de sus actividades es la recolección de datos de notas periodísticas, tarea que realizaban de manera completamente manual.

Su trabajo nos inspiró a desarrollar un programa para apoyar al proyecto, automatizando cada una de las tareas del proceso tanto como fuera posible. El resultado fue una herramienta que toma como insumos los siguientes datos:

  • Las palabras clave de las noticias que se quieren encontrar en Google (ejemplo: “(atropella OR atropellada) -site:es”).
  • Una descripción de las variables o información que se desean extraer de cada nota periodística (ejemplo: “Extraer fecha del evento, edad de la víctima, transporte del victimario, transporte de la víctima y ubicación del accidente”).

Como resultado se genera una tabla de Excel, donde cada fila es uno de los sitios web que resultaron de la búsqueda con sus respectivas variables, además del enlace a la página y el texto de la nota.

Durante el desarrollo, una prioridad fue que esta herramienta fuera fácil de utilizar y pueda adaptarse a todo tipo de iniciativas de monitoreo de eventos en medios (como robos, feminicidios, corrupción), ajustando las palabras clave y las variables requeridas mencionadas anteriormente.

En este artículo exploraremos los pasos detrás del programa a través de las 3 acciones que realiza:

  1. Recolección de direcciones de noticias
  2. Extracción del texto de las notas de cada una de las direcciones
  3. Extracción de datos específicos dentro de cada texto

Recolección de direcciones

Para el primer paso, en nuestra primera versión no contábamos con una solución automatizada más allá de un plug-in en Google Chrome que recomendamos instalar para agilizar la recolección de forma manual.

Posteriormente, encontramos la plataforma de Apify, que a través de una API permite una automatización bastante sencilla de la recolección de links mostrados a partir de una búsqueda en Google. Si bien a partir de cierto volumen la aplicación llega a generar cargos, el bajo número de consultas empleado en el proyecto hace que ese no sea un problema.

Para nuestro caso, se utilizó el texto de la búsqueda de Google empleada en la recolección manual:

“(atropella OR atropellada OR atropellados OR atropelladas OR atropellado OR arrollado OR arrollada OR arrolla OR embiste) AND (muerte OR muerto OR muerta OR muere OR murió OR fallecido OR fallecida OR fallece OR falleció OR perece OR pereció OR cuerpo OR cadáver OR fatal OR mortal OR mata) -site:sv -site:es -site:cl -site:pe -site:ar -site:co -site:hn”

Extracción del texto de las notas de cada dirección

Para la extracción del texto se utilizó la librería Beautiful Soup, que permite manipular archivos HTML de manera sencilla.

Cada sitio de noticias cuenta con una estructura distinta, por lo que era necesario armar una rutina de búsqueda distinta en cada uno.

A través de un análisis de los datos históricos se buscó identificar los sitios de noticias que concentraran la mayor cantidad de noticias de accidentes viales para priorizar nuestros esfuerzos.

En el proceso, aprovechamos que las cadenas de periódicos tienden a utilizar la misma estructura para cada uno de sus sitios locales (por ejemplo, el periódico El Sol de México con sus ediciones de Michoacán, Chihuahua, Puebla, etc.) y formamos grupos para cada cadena, pues cada una requeriría armar una sola búsqueda para todos sus sitios.

Una vez agrupados, se procedió a trabajar en armar las búsquedas específicas para los sitios más prominentes.

Sin embargo, esto no significa que la información de los demás sitios haya sido ignorada. Como medida temporal, para todos ellos se utilizó una estructura más rudimentaria que extraía prácticamente todo contenido que fuera identificado como texto dentro del sitio, lo que implica en ocasiones extraer textos de publicidad u otros enlaces. Con el tiempo, esperamos realizar búsquedas estructuradas para cada uno de los sitios.

A pesar de tomar dicha medida, no conseguimos extraer información de todos los sitios. Esto debido a distintas razones:

  • Sitios como Reforma tienen bloqueado el acceso a bots.
  • Twitter no permite el acceso al contenido de sus tweets más que por medio de su API, que actualmente es de difícil acceso y tiene tarifas excesivamente altas.
  • Algunos sitios son segmentos de video, donde toda la información se comunica por ese medio y no a través de texto.

Extracción de datos específicos dentro de cada texto

Para la extracción de datos específicos, empezamos con una evaluación del valor que aportaba cada variable al análisis. Esto se debe a que, al principio, cada variable requería un esfuerzo distinto para poder conseguirla.

Tras una breve discusión, se determinó que de las +30 variables originales, se empezaría buscando únicamente la siguiente información:

  • Edad de la víctima
  • Medio de transporte de la víctima
  • Fecha del accidente
  • Ubicación del accidente

Solución inicial

Finalmente, buscamos extraer las variables a través de conjuntos de reglas particulares (por ejemplo, para la edad, se buscaba partes del texto que tuvieran la frase “… de edad”, y se procedía a extraer el número que apareciera inmediatamente antes de la frase), así como de algoritmos de machine learning que aprovechaban los datos históricos para determinar en nuevos artículos elementos como el medio de transporte de la víctima.

ChatGPT

Sin embargo, tras escuchar sugerencias de algunos colegas, se exploró la posibilidad de utilizar ChatGPT para esa tarea. Si bien en un principio se consideraba algo excesivo, valía la pena hacer el intento.

Tras crear una cuenta y familiarizarnos con la API, procedimos a probar varios modelos en muestras de notas periodísticas. Al final, se escogió el modelo “text-davinci-003”, el cual es una versión más sencilla de ChatGPT, pero que para los efectos de la tarea producía prácticamente los mismos resultados.

Ilustración de un caso consultado manualmente por medio del chat de ChatGPT

Ilustración de un caso consultado manualmente por medio del chat de ChatGPT como ejemplo

El modelo entregó resultados bastante positivos, coincidiendo con las respuestas extraídas manualmente en prácticamente todos los casos. Además de eso, el modelo fue igualmente efectivo para extraer algunas de las otras variables que habíamos dejado de lado en un inicio.

Ahora bien, al igual que Apify, el servicio es provisto por una empresa (en este caso OpenAI), por lo que su uso implica algunos costos. Afortunadamente, al inicio la plataforma te otorga unos créditos iniciales para utilizar la herramienta de manera gratuita. Adicionalmente, la estructura de costos está diseñada para atender grandes volúmenes de solicitudes (miles por hora). En nuestro caso, se tratan con decenas de manera diaria, por lo que los costos resultan bastante manejables.

El reto de las ubicaciones

Una de las variables principales presenta dificultades para su automatización. No referimos a la ubicación del accidente, la cual, si bien siempre aparece descrita en las noticias, el formato de esta llega a variar bastante, de la misma manera en la que varían las descripciones que uno hace cuando se le piden indicaciones de una ubicación.

Esto, en conjunto con el hecho de que los datos ocupados para análisis posteriores no son una dirección textual, si no coordenadas en el mapa hace que su recolección no sea sencilla.

Algunos ejemplos de direcciones extraídas, junto con sus coordenadas obtenidas por medio de la API de Google

En nuestra versión actual, ChatGPT realiza un buen trabajo para extraer el texto que describe la ubicación, lo cual representa un avance. Para la parte de conversión de la ubicación textual en coordenadas, ocupamos la API Maps de Google (que, una vez más, también puede llegar a generar costos, pero solo cuando se manejan volúmenes mucho mayores a los empleados aquí), la cual entrega resultados mixtos. Para algunos casos, como aquellos que marcan la dirección de un domicilio o negocio de manera bastante concreta, la herramienta da buenos resultados, mientras que para otros más ambiguos, como aquellos donde la descripción ubica el accidente en el tramo de una carretera acompañado de unas cuantas referencias, la herramienta llega a entregar simplemente el punto medio de la carretera entre los destinos que conecta. Se mantiene pendiente encontrar soluciones que permitan robustecer los resultados.

Contacto

Si tienes una idea para mejorar la herramienta o un proyecto de monitoreo en medios y crees que esta podría ayudarte en tu trabajo, no dudes en contactarnos:

--

--