Publicado por primera vez en El País
¿Conocéis la cuenta de Twitter New New York Times? Es una cuenta creada por Max Bittker que tuitea las palabras que se publican por primera vez en la historia del New York Times.
pretentiousless
— New New York Times (@NYT_first_said) July 7, 2023
El proyecto siempre me ha parecido una maravilla. Hace unos meses me propuse como reto hacer lo mismo con el periódico El País y el resultado lo he llamado Primera vez en El País. El proyecto ha sido más complejo de lo que pensé en un principio, pero fui capaz de ir solucionando los problemas técnicos que me fui encontrando. A continuación, explico cómo funciona el bot del NYT y cómo funciona el que creado para El País.
¿Cómo funciona New New York Times?
Según explica Bittker en el repositorio de Github del proyecto y en la web del proyecto, el proceso consta de los siguientes pasos:
- Scrapear los artículos de la portada de la edición digital del periódico.
- Tokenizar el texto de los artículos. Es decir, separar el texto por palabras.
- Filtrar palabras que no son relevantes como nombres propios, números, caracteres especiales, URLs, nombres de usuario de redes sociales, etc…
- Las palabras que quedan después del primer filtro, se contrastan primero con un conjunto de palabras publicadas previamente, y por último con la API oficial del NYT con la que se puede buscar en la base de datos de los más de 13 millones de artículos publicados por el periódico desde 1851.
- Si hay alguna palabra que pasa los anteriores filtros un script de python publica en Twitter la palabra.
¿Cómo funciona Primera vez en El País?
Como el creador reconoce, el filtro más importante para saber si una palabra es de nueva publicación es el de la API del NYT. El País, desgraciadamente, no tiene una API pública parecida, y por lo tanto esto supone un obstáculo considerable a la hora de imitar el proyecto con el diario español.
Es cierto que, a cambio de no tener un servicio API que me facilitase la vida, lo que sí tiene El País es una hemeroteca con todos sus artículos digitalizados que se remonta hasta su fundación en 1974. Al no ser un periódico tan longevo como el NYT, es posible scrapear su hemeroteca, y almacenar todos sus artículos (o la gran mayoría) en una base de datos con la que comprobar las palabras que se van publicando diariamente.
Por lo tanto, el primer paso fue scrapear todos los artículos posibles de esta hemeroteca, tokenizar los textos y almacenar las palabras únicas en una base de datos SQL. El resultado es una tabla con unas 310 palabras únicas.
La razón por la que me pareció más conveniente almacenar las palabras sueltas en una tabla en vez de los textos completos tiene que ver con la optimización de las queries. Una query que pretenda saber si una palabra determinada ha aparecido previamente en un conjunto de centenares de miles de titulares y cuerpos de noticia puede llegar a tardar varios minutos incluso si la tabla tiene un índice full text. Sin embargo, una query sobre una tabla de una sola columna que contiene poco más de 310.000 palabras sueltas (y no textos largos en cada registro) apenas tardará unos segundos y obtiene un resultado igual o más preciso. Si consideramos que al día se publican en El País alrededor de 8.000 palabras únicas es perfectamente comprensible que la diferencia entre unos segundos y unos minutos es fundamental.
Este conjunto de palabras únicas (como he dicho, más de 300.000) es la principal instancia con la que puedo descartar el grueso de las palabras que se publican cada día en el periódico. Sin embargo, tras hacer pruebas me di cuenta de que está lejos de ser infalible. Decenas de palabras pasaban este filtro pero luego se podían encontrar en El País empleando Google o su propio buscador. El siguiente paso, entonces, debía ser hacer uso de estos dos motores de búsqueda.
El problema de Google es que para hacer uso de su buscador a través de un lenguaje de programación hay que usar una API que es de pago pero que permite hacer, de forma gratuita, 100 búsquedas al día. Por tanto, pensé que este filtro pudisese ser el último paso del proceso. Antes de llegar a ese paso, decidí hacer un script en R que navegase al buscador de El País y realizase búsquedas de las palabras que habían pasado el primer filtro. Este filtro es bastante preciso, ya que está buscando en su propia base de datos, pero es algo lento y en ocasiones da errores. Estos errores acaban suponiendo que al paso final llegan muy pocas palabras (alrededor de una decena) pero algunas de ellas pueden haber sido publicadas previamente. Para acabar de pulir el proceso, hago uso de la API de Google con apoyándome en parámetros de búsqueda para asegurarme de que los resultados son del dominio de elpais.com y de que el termino se encuentra de forma exacta en el resultado.
Si hay palabras que pasan estos tres filtros, se almacenan en una tabla de la base de datos. A lo largo del día, otro script comprueba si hay palabras en esa tabla, selecciona una de ellas y publica un tuit en la cuenta de ElPaisFirstSaid y otro en la cuenta ElPaisSaidWhere con el contexto y el enlace al artículo. Después de hacer esto, el script elimina la palabra tuiteada de la tabla de palabras no publicadas y la añade a la de palabras ya publicadas. Esta tarea se ejecuta cada pocos minutos a través de una tarea cron.
El resultado final no es ni exhaustivo ni certero al 100%. Todavía se cuelan algunas palabras sin interés como términos en otros idiomas o alfabetos, verbos conjugados con pronombres enclíticos (p.e.: acércamelo), o erratas (aunque esto último, como dice el creador del proyecto original, forma parte del encanto del bot). A pesar de esto, reconozco que el resultado es muy satisfactorio y he disfrutado mucho creandolo porque me ha obligado a profundizar mis conocimientos sobre distintos temas como bases de datos, APIs o expresiones regulares (regex).
queeritud
— Primera vez en El País (@ElPaisFirstSaid) August 30, 2023
Como siempre me gusta hacer, todo el código se puede encontrar en su repositorio de Github.