Identificación de Objetivos de Desarrollo Sostenible en base a tweets

Antonio Linde Medina
Saturdays.AI
Published in
7 min readJul 23, 2020

Este proyecto consiste en identificar si un texto hace referencia a un Objetivo de desarrollo sostenible (ODS en adelante) y tratar de clasificar dicho texto con uno o varios ODS al que hace referencia.

El proyecto se enmarca en los ODS y en la llamada Agenda 2030, creada por Naciones Unidas en el encuentro de la COP21 celebrada en 2015 en París. En este encuentro, los países adheridos a Naciones Unidas llegan al Acuerdo de París donde se consensúan unos Objetivos de Desarrollo Sostenible que debe abordar cada país con medidas particulares.

Existen organizaciones, administraciones públicas y también individuos que, muchas veces sin saberlo, están abordando algún o algunos ODS. Queremos ver en qué ODS se está contribuyendo más.

Planteamiento del problema

Queremos clasificar tweets en si tratan de un Objetivo de Desarrollo Sostenible (ODS) o no. En caso afirmativo, también queremos saber a que ODS, de los 17 que hay, se está referenciando.

No tenemos ningún corpus sobre ODS. Ni datos etiquetados. Lo único de lo que disponemos es de los tweets.

Datos

Disponemos de tweets recogidos durante aproximadamente un año con los hashtags #ods, #agenda2030, #sostenibilidad.

Los tweets están almacenados en una base de datos PostgreSQL. Para crear el clasificador obtuvimos un dataset con una parte del contenido de la base de datos. El dataset contiene tweets en varios idiomas. Nos centraremos únicamente en los tweets en castellano.

A continuación podemos ver una muestra del texto contenido en los tweets.

#promotoresods les desea feliz año. Nuestro lugar nos necesita, esperamos contar con el apoyo de todos para lograr los objetivos de la #agenda2030 y hacer de nuestro planeta un lugar #saludable y #sustentable.
ESPERAMOS CONTAR CON SU AYUDA
#NODEJARANADIEATRAS https://t.co/HcU9TYWwID

---
Aplicación de un riego de agua depurada con enzimas naturales sobre grava-cemento,en Bayas #Castrillón.

El resultado es un #pavimento #ecológico que protege el firme y prolongar su vida útil.

#Sostenibilidad #Innovación #Pavitek10años #pavimentación #workinprogress #Pavitek https://t.co/G5EHapBEz2

---
??Es lunes de estreno ????????
Los esperamos a las 19:30 en @CANAL_13C para viajar al paralelo 63 en el polo norte ?? y conocer la ciudad ?? universitaria de Trondheim ????

@NoruegaEnChile @ONUChile @PactoGlobal @diariosustentab #Agenda2030 https://t.co/0FNXo8cPDi

---
A una década para cumplir con los objetivos de la #agenda2030, nos preparamos para enfrentar grandes retos. Desde la #desigualdad hasta el #cambioclimático, conoce algunos de los desafíos que enfrentó el mundo en 2019.?? https://t.co/1kSh4vS9yL #LoMásLeído https://t.co/UZzCyVyX1k

---
???Nº 329
??#HomenajeAlMunicipalismo en el @Senadoesp, #40AñosDeDemocraciaLocal.
??La #FEMP en #COP25
??Poniendo cara a los #ODS, casos prácticos: #ODS2.

??https://t.co/HiejHrKUOZ https://t.co/fAeD4UUfEx

Preparar los datos

Como podemos ver más arriba el texto de los tweets necesita una limpieza. Para ello nos hemos inspirado en el tratamiento que se hace en el artículo Python NLTK: Twitter Sentiment Analysis [Natural Language Processing (NLP)]

Estas son las operaciones realizadas sobre el texto de los tweets.

  • Eliminar emojis y caracteres inválidos.
  • Separar los hashtags con camel-case en diferentes palabras. Además de eliminar la almohadilla (#). Por ejemplo. #HomenajeAlMunicipalismo, quedaría así: homenaje al municipalismo.
  • Eliminar letras sueltas y múltiples espacios.
  • Convertir todas las palabras a minúsculas.
  • Utilizando la librería NLP spacy, obtener el lema de la palabra. Es decir palabras como desea o entramos se convierten en desear y entrar.

Clasificación

Al no contar con datos etiquetados para poder entrenar un clasificador nos planteamos hacer lo siguiente:

  • Construir una lista de palabras representativas de cada ODS.
  • Clasificar el texto por su semejanza con alguna de las listas anteriores.

Lista de palabras

Nuestro experto en el tema elaboró una lista de palabras características de cada ODS. El listado completo se puede encontar en esta tabla.

Similitud entre textos

Actualmente existe una gran cantidad de modelos ya entrenados y listos para usarse bien como librería bien como servicio web.

En nuestro caso vamos ha utilizar spacy. Una librería de procesamiento del lenguaje natural. Hay disponibles modelos para varios idiomas.

Calcular la similitud entre dos textos con spacy es sencillo. A continuación se muestra un ejemplo.

Lo primero que hay que hacer es procesar los textos con spacy para tener dos objetos de tipo spacy.tokens.doc.Doc que pueden compararse utilizando el método similarity. El resultado que nos devuelve el método es un número entre 0 y 1. Donde 0 significa que no se parecen nada y 1 que son idénticos.

Para clasificar los tweets lo que haremos será calcular la similitud que tiene el texto del tweet con cada una de las listas de palabras. Con esto tendremos un vector con 17 valores entre 0 y 1 de la similitud del texto con cada ODS.

Ahora establecemos un umbral a partir del cual decidimos que el texto referencia a un ODS. En nuestro caso elegimos 0.7. Con este umbral, el ejemplo anterior se clasificaría como ODS1, ODS2, ODS3, ODS4, ODS5, ODS8, ODS9, ODS10, ODS12, ODS15 y ODS16. Está claro que un tweet se puede clasificar en más de un ODS.

¡Y esto hay que hacerlo para cada tweet!.

Resultados

La siguiente gráfica muestra los tweets clasificados en cada ODS.

Número de tweets clasificados por ODS
Número de tweets clasificados por ODS

A continuación se incluye un histograma la frecuencia de ODS por tweet. Hay algo más de 10.000 tweets que no referencian ningún ODS. Casi 2.000 tweets se clasifican con un único ODS (que no tiene por que ser el mismo). Unos 1.500 tweets se clasifican referenciando a dos ODS. Así con el resto.

ODS por tweet

Evaluación del modelo

Para evaluar el modelo construimos un conjunto de evaluación con textos que sabemos a que ODS referencian. Los textos son los siguientes:

Lo que esperaríamos es que los textos de ODS se clasifiquen según el ODS que describen y los otros documentos no hagan referencia a ningún ODS.

La siguiente tabla muesta el resultado.

La clasificación entre ODS y no ODS parece que funciona bastante bien. No así la distinción entre ODS. Como veíamos en el histograma de más arriba los textos tienden a clasificarse en muchos ODS. No se está discriminando lo suficiente.

Para confirmar lo anterior vamos ha hacer lo siguiente. Comparemos las listas de palabras entre ellas.

Similitud entre las listas de palabras de los tweets de ODS
Similitud entre las listas de palabras

Notar que las etiquetas de los ejes empiezan en 0 (uno menos que el ODS).

Lo que nos indica este gráfico es que las listas son muy similares (según spacy.similarity). Por lo que es normal que no distingamos entre un ODS y otro.

Conclusiones

Aunque hemos utilizado un método poco ortodoxo y no distinguimos entre ODS, estamos clasificando bastante bien si un texto hace referencia o no a un ODS.

  • En base al diccionario de palabras, se puede categorizar el grado de similitud de los tweets con los diferentes ODS. Hay palabras que se asocian directamente a varios ODS, debido a que tocan el mismo área.
  • El grado de similitud entre las palabras y los ODS lo hemos establecido en un 70%. Quizás podríamos ser más restrictivos y subir dicho grado a un 90%, para que el resultado fuese más preciso.
  • El 40.87% de los tweets no están relacionados con ningún ODS debido a la baja calidad del tweet, porque apenas contenían información o texto válido. Una gran parte del proyecto lo hemos destinado a la limpieza de los datos, para partir de una calidad óptima de información.
  • La cantidad de ODS por tweet es muy similar entre los 2 y 10 ODS.

Refinamiento del modelo

El procedimiento utilizado para clasificar los textos depende en gran medida del listado de palabras asignadas a cada ODS. Revisando los resultados al aplicar el modelo a textos clasificados previamente (como los incluidos en table.md) podríamos ajustar la lista de palabras y el umbral utilizados.

Elegir las palabras y/o la librería utilizada de manera que la similitud entre cada conjunto no sea tan alta.

Siguientes pasos

  • Los tweets llevan asociadas las posiciones geográficas desde donde se emite el tweet, esto nos permitiría ver en qué poblaciones de España (o del mundo), se está dando visibilidad a los ODS.
  • Los tweets se generan desde cuentas específicas y se podrían ver cuántas cuentas hacen referencias a empresas. De esta manera podríamos analizar la información asociando las empresas a su sector de actividad empresarial y determinar que tipología de empresas están más comprometidas.
  • Otro tema que se puede realizar es añadir más diccionarios en otros idiomas, ya que, solo nos hemos basado en aquellos tweets escritos en castellano, pero se podría realizar algo similar en otros idiomas.
  • También podemos utilizar una librería de análisis de sentimiento para saber si el impacto del ODS en el texto analizado está siendo positivo o negativo.
  • Con el procedimiento descrito sería sencillo implementar un microservicio que clasificara texto en tiempo real. Este microservicio lo podrían consumir otras aplicaciones, un bot, etc.

Créditos

Este artículo forma parte de uno de los proyectos de la primera edición de Saturdays.AI Mallorca.

Mentor

  • Mar Muñoz

Autores

  • Antonio Linde
  • Miquel Oliver
  • Benyamin Benyaagoub
  • Carles Serrano

Todo el código y los datos utilizados están en https://github.com/michelangelocasablancas/ods

--

--