Hace unos días participé en el Hackathon Iberia, organizado por AWS e Intel. Este es el proyecto con el que quedé en tercera posición 🥉.

Objetivo del Hackathon:

Es un Hackathon for Good, en concreto se buscaban soluciones (apps o análisis de datos) que resolvieran problemas relacionados con Sostenibilidad y Medioambiente, Inclusión y Accesibilidad, o Colectivos Desfavorecidos. Más info en la web oficial 🔗.

 

Proyecto presentado:

El código fuente del proyecto y el dataset creado los he dejado disponibles en este repositorio de github 🔗.

 

❓ Problema que se quiere resolver

La desinformación (o fake news) es la información errónea que se da, generalmente de manera intencionada.

Esta desinformación perjudica frecuentemente a colectivos desfavorecidos, como inmigrantes, refugiados, pobres, niños, adolescentes, ancianos, mujeres víctimas de violencia de género, personas con discapacidad…

🏋️‍♀️ Impacto Social

 

💡 Solución propuesta

Nuestro objetivo es, a partir de una secuencia de entrada (ejemplo: el título de una noticia), ayudar a identificar si es potencialmente:

  • a) 🥸 Desinformación,
  • b) ⚠️ Una noticia relevante,
  • c) 💤 Una noticia no interesante.

Para ello, primero generaremos un Dataset de noticias de Meneame.net, las cuales están accesibles de forma pública a través de internet. Meneame.net es un portal donde los usuarios envían noticias y los usuarios votan las más interesantes (con «meneos» positivos o votos negativos).

En Meneame.net hay casi 4 Millones de noticias, cada una de las cuales puede estar en 1 de estos estados:

  • «Publicada», es una noticia que ha recibido muchos votos positivos y pocos votos negativos en proporción, por tanto se considera una noticia con probabilidad muy alta de ser veraz y relevante. Un ejemplo:

ejemplo-noticia-publicada.png

  • «Descartada»: es una noticia que ha recibido muchos votos negativos y ya no aparece en la web ni puede recibir más votos. Suele ser una noticia falsa, clickbait (que solo busca el click) o duplicada. Un ejemplo:

ejemplo-noticia-descartada.png

  • Encolada (pendiente de publicarse en portada): es una noticia que aún no ha sido publicada en la portada porque no ha recibido suficientes votos positivos en comparación con el nº de votos negativos. En este estado pueden haber noticias de 2 tipos: noticias poco interesantes (sin casi votos) o noticias polémicas (muchos votos positivos y muchos votos negativos). Los 2 ejemplos:

ejemplo-noticia-encolada-con-pocos-votos.png

ejemplo-noticia-encolada-con-muchos-votos-negativos-y-meneos.png

  • «Abuse»: son las noticias que incumplen las normas de uso de Meneame (ejemplo: spam). Existen muy pocas noticias en esta categoría, omitiremos esta categoría en el entrenamiento de la red neuronal.

  • Auto descartadas: noticias que el propio usuario que las ha enviado las ha descartado después (normalmente, al darse cuenta que otro usuario la había publicado antes). Hay muy pocas noticias en esta categoría, omitiremos esta categoría en el entrenamiento de la red neuronal.

En este proyecto se propone utilizar Natural language processing (NLP), en concreto una red neuronal de tipo Transformer, para la clasificación de futuras noticias.

Como Dataset de entrenamiento se utilizarán las noticias de Meneame.net, las cuales son públicas. Se ha generado un Dataset con las noticias, y han sido automáticamente clasificadas en categorías (categorías: relevante, no relevante, polémica, descartada) a partir de las columnas del dataset (votos, votos negativos, estado).

Un esquema resumen:

meneame-predictions-small.png

En el repositorio de github encontrarás el cuarderno jupyter que puedes ejecutar paso a paso para generar el dataset, para entrenar el modelo y para evaluarlo.

 

⏭️ Trabajo futuro y mejoras

Estas son algunas de las tareas que me gustaría hacer a futuro, ya que el Hackathon tiene duración limitada y no da tiempo a todo:

  • Ampliar el Dataset de meneame. Aunque eldataset que se ha generado durante el hackathon incluye deceneas de miles de noticias (etiquetadas como Relevante, no interesante, descartada o polémica), aún se puede ampliar dicho dataset hasta llegar a los 4 millones de noticias que hay registradas en Meneame.net.
  • El dataset puede limpiarse para probar si el modelo entrena mejor y genera mejores predicciones. Por ejemplo, se puede quitar de los titulares los caracteres extraños, pasar a minúscula, etc…
  • Probar a concatenar el titular de la noticia y su entradilla, antes del entrenamiento.
  • Probar diferentes arquitecturas de Transformers y diferentes tamaños (ejemplos: BERT base, BERT large, RoBERTa base, RoBERTa large, etc…).
  • Ajustar los hiperparámetros del modelo. Este es uno de los pasos que más tiempo puede llevar hasta dar con la combinación óptima.
  • La parte de publicar la inferencia en SageMaker no me ha terminado de funcionar, posiblemente porque estoy creando mal el Docker. Sí que está funcionando la inferencia desde este cuaderno Jupyter.

 

Vídeo del anuncio de los ganadores: