Trabajo:Análisis de sesgos sobre un algoritmo de medición de toxicidad - colaboración con Newtral

De FdIwiki ELP
Saltar a: navegación, buscar
Análisis de sesgos sobre un algoritmo de medición de toxicidad
Autores: Grupo 4
Pablo Daurell Marina (GII 4º A) (2021/22)
Belén García Puente (GII 4º A) (2021/22)
Ela Katherine Shepherd Arévalo (GII 4º A) (2021/22)
Miquel Vera Ramis (GII 4º A) (2021/22)
Alberto García Doménech (GII 4º A) (2021/22)
Fernando Bellot Rodríguez (GIS 4º A) (2021/22)
Mateo González de Miguel (GIC 4º A) (2021/22)
Información general:
Repositorio: Github
Licencia del proyecto: MIT License
Colaboradores: Newtral



Introducción

El objetivo de este proyecto de impacto social es ayudar a una entidad que haga una labor social como es el caso de la detección y concienciación de las fake news. Dicha entidad, con la que hemos tenido la suerte de colaborar,es uno de los medios de comunicación de fact-checking más famosos de este ámbito en España: Newtral.

¿Qué es Newtral?

Newtral es una startup tecnológica, medio de comunicación y productora audiovisual centrada en combatir la transmisión de la desinformación política. El fact-checking es una de sus principales áreas de trabajo. Newtral utiliza la Inteligencia Artificial para digitalizar procesos periodísticos como el fact-checking, hacerlos más eficientes y maximizar su alcance a la sociedad, mediante técnicas punteras como el deep learning. Actualmente Newtral está investigando la monitorización del discurso de odio en la política española mediante técnicas de IA, que es el objeto de este trabajo.

Primer contacto con Newtral

Al principio creímos que sería algo difícil contactar con ellos, pero una vez nos decidimos a hacerlo nos respondieron de forma cordial y rápida. Nuestro primer contacto con Newtral fue vía email con la rama de Newtral Educación, donde comentamos quiénes éramos y nos redirigieron con el apartado Tecnológico de Newtral. Tras contactar con ellos, realizamos una reunión en la que comentamos de qué iba nuestro trabajo social, presentando nuestros conocimientos a nivel de informática. A partir de ahí nos comentaron que estaban desarrollando un modelo de Machine Learning para detectar toxicidad en Tweets de políticos españoles, y que les vendría bien contar con la ayuda un equipo ajeno al desarrollo del modelo que les ayudase a encontrar diferentes sesgos en una primera versión de este.

Trabajo a realizar

Inicialmente nos hablaron sobre un modelo de Google similar: Perspective API sobre el que ya se había realizado alguna investigación similar para encontrar sesgos, como HateCheck: Functional Tests for Hate Speech Detection Models.

A partir de aquí, tras hojear el paper para tener ideas iniciales, nos compartieron el dataset en formato csv con más de 13,000 tweets ya clasificados tanto por el algoritmo de Newtral como por la Perspective API, para que empezásemos a hacer pruebas (dataset_newtral_ucm.csv).

Con todo esto, el objetivo era buscar los sesgos que pudiera tener la versión actual del algoritmo de Newtral a la hora de clasificar la toxicidad de los tweets.

Originalidad

Queríamos que nuestro trabajo estuviera relacionado con las fake news. Siguiendo los consejos del profesor, contactamos con Newtral con el objetivo de poder ayudarles en su labor de verificación de fake news. Así promoveríamos de alguna manera el fact-checking, además de ayudar a una empresa asegurando un impacto.

Impacto esperado

Trabajando con Newtral el impacto es directo al ayudar directamente a una empresa, dándoles feedback para poder mejorar su modelo. A su vez, Newtral tiene un gran impato en la sociedad con su labor de fact-checking, mucho más impacto que podríamos tener nosotros solos realizando cualquier otro tipo de trabajo en este campo.

Evolución del proyecto

Decidimos realizar reuniones semanales con Newtral (vía videoconferencia) con el fin de concretar nuestros avances de esa semana y que nos compartiesen sus opiniones y posibles problemas y soluciones que podríamos explorar.

Primera parte - Análisis del dataset

Inicialmente empezamos a analizar los datos inmediatos que podíamos sacar del csv que nos proporcionaron, para tener una información orientativa a la hora de buscar los sesgos posteriormente.

El csv tenía las siguientes columnas:

  • twitter_id: ID de Twitter correspondiente al tweet. Se puede usar como identificador único del tweet. No debería haber repetidos.
  • text: texto del tweet. Son todos tweets originales, con lo cual en ningún caso está el texto de una respuesta, un retweet o un quote.
  • toxicity: predicción de toxicidad de Perspective API entre 0 y 1. La solemos binarizar en 0.5 por defecto.
  • sev_toxicity: predicción de toxicidad severa de Perspective API entre 0 y 1. No la hemos usado.
  • profanity: predicción de “profanity” de Perspective API entre 0 y 1. No estamos muy seguros de su definición.
  • threat: predicción de amenaza de Perspective API entre 0 y 1.
  • degree1, degree2, degree3: cada uno de las tres anotaciones realizadas por anotadores humanos en Newtral respecto al problema que tenemos definido como Decibelios (valoración del grado de crispación, agresividad, confrontación, en el discurso político). Sus posibles valores son:
    • 0: el tweet no contiene crispación.
    • 1: el tweet contiene algo de crispación, pero no está acompañado por unas formas agresivas, violentas, etc.
    • 2: el tweet contiene crispación y su contenido es agresivo, violento, etc.
  • degree_final: etiqueta final que utilizamos en nuestros modelos agregando las anotaciones anteriores de 3 personas. Sus valores también son 0, 1, 2. Se asigna el valor mayoritario siempre que lo hay. La única excepción es 0-1-2 (cada persona otorga un valor distinto), entonces se asigna un 1 por ser el valor medio.
  • degree_predicted: predicción de Decibelios que hace nuestro modelo. Sus valores posibles son 0, 1, 2.
  • degree_confidence: confianza en la predicción de Decibelios de “degree_predicted”. Es un valor entre 0 y 1 que, cuanto más alto, más seguro está el modelo del valor predicho. Lo calculamos haciendo unas transformaciones sobre los logits de salida de la red neuronal. Somos conscientes de que, por el funcionamiento del modelo que usamos y cómo produce las probabilidades, la mayoría están en valores cercanos al 99% y eso dificulta su interpretación.
  • annotation_date: fecha en la que fue anotado el tweet respecto a la definición de Decibelios.
  • slug: nombre normalizado del político autor del tweet.
  • twitter_url: URL del político autor del tweet.
  • party_slug: nombre normalizado del partido político al que pertenece el autor del tweet.
  • parliamentary_group_slug: nombre normalizado del grupo parlamentario al que pertenece el autor del tweet. No siempre hay una asignación 1 a 1 entre partido y grupo parlamentario. Por ejemplo, existen el grupo mixto y el grupo plural en el que se juntan diferentes partidos que no han obtenido suficiente representación para obtener grupo propio. También puede haber casos raros de personas que abandonan su partido y se integran en el grupo mixto, por ejemplo


En esta fase analizamos el dataset, tanto con la información proporcionada por la Perspective API como por el modelo de Newtral, aunque en fases posteriores lo único que nos importa es el modelo de Newtral.

Lo primero que decidimos hacer fue calcular la toxicidad media de los tweets de cada partido político según la Perspective API y la predicción del modelo de Newtral, para entender cómo trabajar con los datos y tener una idea inicial del comportamiento que tiene el algoritmo, permitiéndonos saber dónde podríamos encontrar los sesgos.

  • Lista de los partidos con tweets más tóxicos según el modelo de Newtral, calculada sumando los valores de toxicidad (0, 1 o 2) de cada tweet de un partido político y dividiéndolo por el total de tweets de ese partido (obteniendo un valor continuo comprendido entre 0 y 2):

Toxicidad media por partidos políticos

A partir de aquí, sacamos además la toxicidad media de los tweets de cada político dentro de su correspondiente partido y por último , ordenamos los políticos por su toxicidad media, independientemente de su partido político.


Aparte de este análisis político, queríamos ver cuáles eran las palabras que repetían más en los tweets que el modelo identificaba como tóxicos, para encontrar palabras clave que podrían generar un nivel de toxicidad más alto.

  • Lista de las palabras más tóxicas según el modelo de Newtral, con la toxicidad media de la palabra (en este caso siempre el máximo: 2) y el número de apariciones:

Top 10 palabras más tóxicas

De aquí sacamos qué partidos puede ser que generen más toxicidad, y qué palabras pueden llevar a un tweet a ser clasificado como tóxico (insultos, temas controvertidos, ...). Esto nos ayudó para las siguientes fases.

Todo esto se lo fuimos comentando a Newtral en las diversas reuniones.

Este trabajo se puede ver con más detalle, junto con los resultados obtenidos, en el Notebook del repositorio de Github.

Segunda parte - Pruebas con el modelo

Para la siguiente fase, nos proporcionaron el acceso a una API para poder acceder al modelo sin depender del dataset ya generado, lo que nos permitió realizar más pruebas con los textos que quisiéramos en cualquier momento.

A diferencia del dataset en el que nos pasaron anteriormente donde los tweets se clasificaban en toxic y very toxic, ahora el modelo nos devuelve un valor continuo para toxic y otro para very toxic.

Basándonos en los métodos que utilizaban en el paper de HateCheck, establecimos ciertos patrones que serían interesantes investigar:

  • Comparar uso con odio de insultos con uso sin odio
  • Diferenciar insultos de palabras malsonantes
  • Tener en cuenta erratas
  • Tener en cuenta negaciones
  • Diferenciar entre preguntas y afirmaciones
  • Diferenciar entre mensajes de odio o mensajes que hacen referencia a ese odio
  • Tener en cuenta las diferencias entre odio a grupos protegidos y no protegidos

Con ello, empezamos a hacer pruebas a mano escribiendo tweets artificiales con los diferentes sesgos que aparecían en el paper. Ahí encontramos los siguientes indicios de sesgo:

  • "Odio a (grupos desfavorecidos)" aparecía menos tóxico que a un grupos favorecidos (Grupos desfavorecidos: inmigrantes, mujeres, homosexuales, ...)
  • Añadir "comunista" o "fascista" a cualquier mensaje aumenta la toxicidad
  • Añadir "para la sociedad" aumenta la toxicidad
  • Añadir palabras como "lacra" u "obstáculo" aumenta la toxicidad
  • Añadir interrogaciones al final aumenta la toxicidad
  • Palabras como "no" y "más", así como las negaciones aumentan la toxicidad independientemente del contexto
  • Usar el femenino aumenta levemente la toxicidad
  • El algoritmo diferencia entre mayúscula, minúscula y palabras con tilde

Al compartir toda esa información con Newtral nos confirmaron que se cumplían sus principales sospechas, y junto a todo esto redirigimos el enfoque del trabajo a centrarnos en el contexto político, ya en la tercera fase.

Tercera parte - Creación y análisis de datos

En esta parte nuestro objetivo era automatizar las pruebas con el modelo. Para ello, nos centramos en generar csv a partir de llamadas a la API con tweets modificados del dataset original. Con ello hemos creado una serie de csv que se pueden encontrar en el repositorio de Github, documentados en el archivo Guiacsv.md.

Toxicidad en tweets con y sin tildes

A raíz del primer dataset que nos proporcionaron, recogemos los tweets que tienen tildes, medimos su toxicidad y comparamos con el mismo tweet sin tildes. Al final, medimos la media para ver si es más tóxico usando tildes o sin usarlas. Todo esto se recoge en un csv.

Analizando el csv obtenido recogiendo los casos en los que la diferencia de toxicidad era relevante, vimos que en general tras quitarle las tildes a un tweet, independientemente de lo tóxico que fuera antes, se volvía algo más tóxico. Con esto, podríamos afirmar que el modelo tiene un sesgo hacia que los tweets sin tildes son más tóxicos (hablándolo con Newtral llegamos a la conclusión de que este sesgo puede venir de que los mensajes con más faltas de ortografía suelen tener más odio).


Media de Toxicidad de tweets con/sin tildes

Ejemplo de tweet original con tildes
Ejemplo de tweet modificado sin tildes

Este trabajo se puede ver con más detalle, junto con los resultados obtenidos, en el Notebook (Sesgos_tildes) del repositorio de Github.

Toxicidad en tweets que mencionan al fascismo o al comunismo

Como vimos en la fase anterior, al añadir esta palabra a cualquier tweet aumentaba su toxicidad, por lo que decidimos analizarlo más en profundidad.

A raíz del primer dataset que nos proporcionaron, recogemos los tweets que contienen las palabras "fascismo", "comunismo", "fascista" y "comunista". Medimos su toxicidad, modificamos el tweet cambiando la aparición de "fascismo/fascista" por "comunismo/comunista" y viceversa para analizar si había cambios en la toxicidad.

Analizando el csv obtenido, encontramos que en los tweets donde aparece "fascismo/fascista" se identifican como más tóxicos que otros tweets en los que aparezca "comunismo/comunista".

En la fase anterior ya habíamos concluido que el algoritmo tiene un sesgo hacia estas palabras, y ahora comprobamos que ese sesgo es algo más prominente hacia "fascismo/fascista"


Media de Toxicidad de tweets con cada palabra (comunista/comunismo y fascista/fascismo)

Ejemplo de tweet con la palabra comunista
Ejemplo de tweet con la palabra fascista


Este trabajo se puede ver con más detalle, junto con los resultados obtenidos, en el Notebook (Sesgos_comunista_fascista) del repositorio de Github.

Toxicidad en tweets que mencionan a partidos políticos

A raíz del primer dataset que nos proporcionaron, recogemos los tweets que mencionan a alguno de los siguientes partidos políticos españoles:

  • Ciudadanos
  • Podemos/Unidas Podemos
  • PP
  • PSOE
  • VOX

En cada tweet mencionando a un partido, cambiamos esa mención por cada partido de la lista. Medimos la toxicidad del tweet con el partido original y con las modificaciones para ver cuál de las menciones hacía que el tweet fuera más tóxico. Con esto se generaron varios datasets, uno por cada partido.

Analizando todos estos cambios de menciones vemos que, por lo general, cambiar cualquier mención a un partido por una mención a VOX o Podemos/Unidas Podemos lo vuelve más tóxico inmediatamente. De aquí se puede concluir que hay un sesgo en el algoritmo que hace que al mencionar alguno de estos dos partidos el tweet se vuelva más tóxico independientemente del contexto.


Ejemplo de tweet con la palabra "Ciudadanos"
Ejemplo del mismo tweet cambiando "Ciudadanos" por "Vox"


Este trabajo se puede ver con más detalle, junto con los resultados obtenidos, en el Notebook (Sesgos-partidos) del repositorio de Github.

Toxicidad en tweets que mencionan a líderes políticos

A raíz del primer dataset que nos proporcionaron, recogemos los tweets que mencionan a alguno de los siguientes líderes políticos (tanto los nombres propios como su usuario de Twitter):

  • Pablo Casado
  • Isabel Díaz Ayuso
  • Santiago Abascal
  • Rocío Monasterio
  • Pedro Sánchez
  • Pablo Iglesias
  • Yolanda Díaz
  • Inés Arrimadas
  • Albert Rivera

Al igual que con los partidos políticos anteriormente, cambiamos cada mención a un líder político por una mención a cada uno de los otros líderes políticos viendo cuál de las modificaciones vuelve al tweet más tóxico, y a partir de esto generamos un dataset con los datos obtenidos.

Analizando todo esto, parece que los tweets en los que se menciona a Santiago Abascal, Rocío Monasterio, Pedro Sánchez y Pablo Iglesias son más tóxicos que el resto. Con esto vemos que hay un sesgo en el que simplemente por mencionar a estos políticos se identifica un tweet como más tóxico. Esto encaja con el apartado anterior, ya que tanto Abascal, Monasterio e Iglesias pertenecen a los partidos que mostraban ser más tóxicos si se mencionaban. Además Pedro Sánchez es el presidente del gobierno por tanto la mayoría de las críticas de la oposición van a caer sobre él.


Ejemplo de tweet mencionando a "Inés Arrimadas"
Ejemplo del mismo tweet cambiando "Inés Arrimadas" por "Pablo Iglesias"


Este trabajo se puede ver con más detalle, junto con los resultados obtenidos, en el Notebook (Sesgos-nombres-politicos) del repositorio de Github.

Toxicidad de tweets con emojis

Una de las ideas que se comentaron en una de las reuniones fue el posible impacto que puede tener la aparición de emojis en los tweets. Aunque parezca de broma, muchos de los emojis que están disponibles se pueden utilizar con maldad, como por ejemplo con significados machistas, racistas, homófobos, de mofa hacia alguien... Por ello nos propusimos a investigar por esta rama.

Para empezar, comenzamos sacando los tweets que contenían emojis (ordenados por toxicidad) lo cual nos dio una visión global por la que empezar. Con este primer paso, no podíamos sacar conclusiones, ya que la toxicidad de los tweets no tenía por qué estar relacionada directamente con los emojis. Así que la solucion que dimos a este problema fue generar nuestro propio dataset en formato csv en el cual contamos las veces que aparecen los posibles emojis con su toxicidad, media de toxicidad, tweet más tóxico, etc. Esto nos daba un enfoque más certero sobre el tema y lo que nos sorprendió fue que el emoji "🌈" era de los más tóxicos y que cuando en una frase normal poníamos dicho emoji, subía la toxicidad desproporcionadamente.

Para terminar, generamos el último dataset con la ayuda del anterior en el cual nos centramos en reemplazar emojis de tweets con una toxicidad media-baja, por los emojis más toxicos del dataset anterior. Con esto conseguimos analizar los posibles emojis que pueden estar acarreando más toxicidad sin motivo en algunos casos.


Este trabajo se puede ver con más detalle, junto con los resultados obtenidos, en el Notebook (Sesgos-emojis) del repositorio de Github.

Toxicidad de tweets contradictorios

Hablando con Newtral, nos dijeron que una idea interesante sobre la que investigar era analizar mensaje que empiecen con una toxicidad negativa y que a mitad de discurso cambien a una toxicidad positiva o viceversa; o tweets con algún toque de ironía. En general tweets que puedan interpretarse con una toxicidad contraria a la que realmente tienen.

Para llevar esto a cabo, escribimos varios tweets a mano imitando este comportamiento, algunos inspirados en tweets reales escritos por los políticos españoles, y los etiquetamos según su toxicidad real (1: Tóxico, 0: No tóxico). Aquellos tweets denominados como tóxicos están escritos de manera que no haya palabras que hayamos visto que el modelo detecta como tóxicas, pero que el mensaje del texto sea tóxico. Muchos de estos tweets tóxicos contienen ironía o sarcasmo como manera de burlarse de una persona, partido o idea. Por otro lado, aquellos tweets denominados como no tóxicos contienen palabras que hemos visto que el modelo denomina como tóxicas (insultos, las palabras "comunista" o "fascista", etc.)

Algunos ejemplos:

  • "Si tan pésimo y tan horriblemente pobre es nuestro país, explicadme por qué el sueldo medio son 2000 euros" (ejemplo de tweet sin toxicidad pero con un inicio que puede llevar a confusión ("[...] tan pésimo y tan horriblemente pobre [...]"))
  • "@PP desde luego para hacernos reír sois los mejores, vaya panda de analfabetos" (ejemplo de tweet tóxico pero con un inicio que puede llevar a confusión ("[...] hacernos reír sois los mejores [...]"))
  • "Gracias por destruir a la derecha de este país, traidor" (ejemplo de tweet tóxico pero con un inicio que puede llevar a confusión ("Gracias por [...]"))

Tras haber escrito y etiquetado varios tweets, pasamos cada tweet al modelo de Newtral para ver que toxicidad les asignaba.

Tanto los tweets escritos con sus etiquetas como el resultado de pasarlos por el algoritmo se agrupó en un mismo fichero para generar un dataset con el que poder trabajar: tweets_contradictorios.csv

Finalmente, comparamos la clasificación del modelo con la que habíamos hecho manualmente y generamos la matriz de confusión con los resultados obtenidos:

Matriz de confusión

Con este último análisis podemos ver que la predicciones correctas (verdaderos positivos + verdaderos negativos) y la incorrectas (falsos positivos + falsos negativos) constituyen ambas un 50% aproximadamente.


Este trabajo se puede ver con más detalle, junto con los resultados obtenidos, en el Notebook (Tweets_contradictorios) del repositorio de Github.

Conclusión

De todo este análisis hemos encontrado unos indicios de sesgos, mencionados en la Segunda parte. Además hemos confirmado los siguientes sesgos del modelo:

  • Un tweet es más tóxico si no lleva tildes
  • Un tweet que mencione "fascismo/fascista" o "comunismo/comunista" es más tóxico
  • Un tweet que contenga "fascismo/fascista" es más tóxico que uno que contenga "comunismo/comunista"
  • Un tweet que mencione a Vox o Podemos/Unidas Podemos es más tóxico
  • Un tweet que mencione a Santiago Abascal, Rocío Monasterio, Pedro Sánchez o Pablo Iglesias es más tóxico
  • Un tweet con los siguientes emojis: "🤥, 🤮, ⛔, 🌈, ❌, 🤡, 🤬, 😡, 🇪🇸, 🌹, 🚫" suele ser más toxico
  • A esta versión del modelo le cuesta identificar si un tweet es tóxico o no si presenta sarcasmo o contradicción

Viendo todo esto por encima también podemos concluir que la mayoría de estos sesgos pueden nacer de que los tweets con los que se ha entrenado el modelo ya estaban sesgados de por sí, ya que hay ciertos sectores políticos que se comportan de una manera más tóxica, haciendo que el modelo los identifique así.

Impacto obtenido

Con el trabajo realizado, hemos conseguido encontrar varios sesgos del modelo, que han sido reportados a Newtral, a lo largo de varias reuniones, para que los tengan en cuenta. Además se ha creado código para poder tratar los datos producidos por el modelo y varios datasets con información relevante para la detección de estos sesgos. Todos estos archivos se encuentran disponibles en un repositorio público de Github bajo una licencia libre, que además ha sido compartido con Newtral, para que puedan utilizarlos y seguir profundizando en los sesgos de su modelo.

Para corroborar nuestra colaboración, Rubén Míguez Pérez, responsable de la parte tecnológica de Newtral, nos envió este correo resumiendo en qué ha consistido la colaboración y confirmando que nuestro trabajo les será útil para mejorar su modelo y poder usarlo en un entorno de producción en el futuro:

Correo Newtral

Links

  • Github del proyecto: Github
  • Modelo de Newtral: Modelo (Las conclusiones de este proyecto se sacaron de una de las primeras versiones de este modelo, las versiones futuras podrían corregir algunos de estos asuntos y se accederían a través de este mismo enlace)

Agradecimientos

Al equipo de Newtral, sobre todo a los miembros con los que hemos tenido más contacto: