Diferencia entre revisiones de «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
m (Primera parte - Análisis del dataset)
 
(46 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
==Objetivo del proyecto==
+
{| border="0" class="infobox" style="width:350px; line-height: 1.4em; text-align:left; padding:.23em;border: 1px solid #B4BBC8;background-color: #f9f9f9;color: #000;margin: .5em 0 .7em 1.2em;padding: .4em;clear: right;float: right;font-size: 90%;line-height: 1.5em;"
 +
|+ align="center" style="background:#0645ad; color:white"|<big>'''Análisis de sesgos sobre un algoritmo de medición de toxicidad'''</big>
 +
|-
 +
| colspan="2" style="text-align:center;background-color:#DCEAEC;"| '''Autores: Grupo 4'''
 +
|-
 +
| colspan="2"  | [https://github.com/pablodll Pablo Daurell Marina] (GII 4º A) (2021/22)
 +
|-
 +
| colspan="2"  | [https://github.com/beleen3103 Belén García Puente] (GII 4º A) (2021/22)
 +
|-
 +
| colspan="2"  | [https://github.com/Elaphernelia Ela Katherine Shepherd Arévalo] (GII 4º A) (2021/22)
 +
|-
 +
| colspan="2"  | [https://github.com/MiquelVera Miquel Vera Ramis] (GII 4º A) (2021/22)
 +
|-
 +
| colspan="2"  | [https://github.com/AlbertoGarciaDomenech Alberto García Doménech] (GII 4º A) (2021/22)
 +
|-
 +
| colspan="2"  | [https://github.com/ferbellot Fernando Bellot Rodríguez] (GIS 4º A) (2021/22)
 +
|-
 +
| colspan="2"  | [https://github.com/matgon Mateo González de Miguel] (GIC 4º A) (2021/22)
 +
|-
 +
|-
 +
|colspan="2" style="text-align:center;background-color:#DCEAEC;" | '''Información general:'''
 +
|-
 +
|
 +
|-
 +
|'''Repositorio:    '''    ||'''[https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets Github]'''
 +
|-
 +
|
 +
|-
 +
|'''Licencia del proyecto:    '''    ||'''[https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets/blob/main/LICENSE MIT License]'''
 +
|-
 +
|
 +
|-
 +
|'''Colaboradores:    '''    ||'''[https://www.newtral.es/ Newtral]'''
 +
|}
  
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, ha sido con una de los medios de comunicación de fact checking más famosos de este ámbito en España, Newtral.
 
  
Resumidamente, Newtral realiza varias iniciativas con el fin de transparentar y verificar la información que existe sobre ciertos políticos y noticias en general. Nuestra tarea es ayudar a esta empresa a encontrar ciertos sesgos sobre la identificación de toxicidad en un algoritmo que recoge datos de twitter.
 
  
==Primer contacto con Newtral==
 
  
Al principio creímos que sería algo imposible contactar con ellos pero una vez nos decidimos a hacerlo, nos respondieron de forma cordial y rápida. Nuestro primer contacto con Newtral fue en una reunión en la que comentamos cómo podríamos brindar nuestra ayuda hacia esta asociación, con esto sacamos dos conclusiones: Ayudar en el aspecto de la educación social o en uno más tecnológico y práctico. Nos decantamos por este segundo, decidiendo buscar información sobre sesgos que pueda tener el algoritmo que estaban desarrollando sobre la toxicidad que pueden generar ciertas citas en redes sociales.
+
==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 [https://es.wikipedia.org/wiki/Verificación_de_hechos 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 [https://es.wikipedia.org/wiki/Verificación_de_hechos fact-checking] es una de sus principales áreas de trabajo. Newtral utiliza la Inteligencia Artificial para digitalizar procesos periodísticos como el [https://es.wikipedia.org/wiki/Verificación_de_hechos 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: [https://perspectiveapi.com/ Perspective API] sobre el que ya se había realizado alguna investigación similar para encontrar sesgos, como [https://arxiv.org/abs/2012.15606 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 ([https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets/blob/main/data/dataset_newtral_ucm.csv 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==
 
==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.
  
Para empezar con este trabajo necesitábamos hacer uso de una base de datos o dataset más o menos grande, con lo que poder analizar y sacar conclusiones de estos sesgos y dar nuestro feedback a la empresa. Esto nos lo facilitó Newtral, dándonos un fichero csv con más de 13.000 tweets de políticos españoles, además de ciertas guías e información sobre el algoritmo que usa google y el que usan ellos.
+
===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.
  
Con esto, nuestro trabajo empezó obteniendo la media de toxicidad de los partidos políticos principales en España y ordenándolos de mayor a menor, de aquí tendríamos un punto de partida de donde sacar conclusiones sobre dónde indagar para poder extraer ciertos 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.<br/>
 +
*'''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.<br/>
 +
*'''toxicity''': predicción de toxicidad de Perspective API entre 0 y 1. La solemos binarizar en 0.5 por defecto.<br/>
 +
*'''sev_toxicity''': predicción de toxicidad severa de Perspective API entre 0 y 1. No la hemos usado.<br/>
 +
*'''profanity''': predicción de “profanity” de Perspective API entre 0 y 1. No estamos muy seguros de su definición.<br/>
 +
*'''threat''': predicción de amenaza de Perspective API entre 0 y 1.<br/>
 +
*'''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:<br/>
 +
**'''0''': el tweet no contiene crispación.<br/>
 +
**'''1''': el tweet contiene algo de crispación, pero no está acompañado por unas formas agresivas, violentas, etc.<br/>
 +
**'''2''': el tweet contiene crispación y su contenido es agresivo, violento, etc.<br/>
 +
*'''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.<br/>
 +
*'''degree_predicted''': predicción de Decibelios que hace nuestro modelo. Sus valores posibles son 0, 1, 2.<br/>
 +
*'''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.<br/>
 +
*'''annotation_date''': fecha en la que fue anotado el tweet respecto a la definición de Decibelios.<br/>
 +
*'''slug''': nombre normalizado del político autor del tweet.<br/>
 +
*'''twitter_url''': URL del político autor del tweet.<br/>
 +
*'''party_slug''': nombre normalizado del partido político al que pertenece el autor del tweet.<br/>
 +
*'''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<br/>
  
Para encontrar dichos sesgos, utilizamos la api de Newtral (toxic tweets in spanish politics) en la que poder comprobar a mano diferentes textos que compartan similitudes para poder separarlos y clasificarlos. Algunas de las palabras que aparecían en estos textos, los cuales en cuanto el algoritmo las reconocía las marcaba como tóxicas o muy tóxicas, son las siguientes:
 
 
<br/>
 
<br/>
*“Comunistas”<br/>
+
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.
*“Fascistas”<br/>
+
*“Señala”<br/>
+
*“Obstáculo”<br/>
+
*“La Derecha” / “La Izquierda”<br/>
+
*“Las élites”<br/>
+
*“Todo”<br/>
+
  
Además de palabras, terminamos descubriendo que dependiendo del formato en el que esté el texto y su ortografía, los resultados podrían cambiar en algunos casos desmedidamente. Por ejemplo, el algoritmo diferencia entre frases bien escritas y escritas erróneamente, sesgo que tiene sentido cuando pensamos en una persona que escribe dicha frase para hacer mofa de alguien o algo, pero no debería ser así con frases sin tildar o sin signos de puntuación ya que es un fallo ortográfico muy común.  
+
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.
  
Otra diferenciación que encontramos fue al probar la frase “odio a...” seguido de cualquier colectivo (transexuales, homosexuales, heterosexuales...), lo cual resultaba en que al insertar un colectivo protegido, este lo reconoció con más toxicidad que uno no tan protegido. Asimismo, el agregar un signo de exclamación al final de la frase, reducía su toxicidad.
+
* 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):
  
Por último, otros sesgos que encontramos más razonables, fueron los siguientes: La diferenciación entre mayúsculas y minúsculas (la toxicidad es mayor cuantas más mayúsculas haya, ya que coloquialmente simula un grito) y el aumento de signos de interrogación (la toxicidad es directamente proporcional al número de interrogaciones).
+
<br/>[[Archivo:ToxicidadMediaPartido.png|miniatura|300px|centro|Toxicidad media por partidos políticos]]<br/>
 +
 
 +
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:
 +
<br/>[[Archivo:PrimerasPalabrasToxicas.png|miniatura|300px|centro|Top 10 palabras más tóxicas]]<br/>
 +
 
 +
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 [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets/blob/main/analysis_notebooks/Analisis_Dataset_Newtral.ipynb Notebook] del repositorio de [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets Github]''.
 +
 
 +
===Segunda parte - Pruebas con el modelo===
 +
Para la siguiente fase, nos proporcionaron el acceso a una [https://huggingface.co/spaces/Newtral/toxic-tweets-in-spanish-politics 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 [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets Github], documentados en el archivo [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets/blob/main/data/Guiacsv.md 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).
 +
 
 +
<br/>[[Archivo:tildes_datos.png|miniatura|500px|centro|Media de Toxicidad de tweets con/sin tildes]]
 +
 
 +
<br/>[[Archivo:Tildes1.png|miniatura|1100px|centro|Ejemplo de tweet original con tildes]]
 +
[[Archivo:Tildes2.png|miniatura|1100px|centro|Ejemplo de tweet modificado sin tildes]]<br/>
 +
 
 +
''Este trabajo se puede ver con más detalle, junto con los resultados obtenidos, en el Notebook [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets/blob/main/analysis_notebooks/Sesgos_tildes.ipynb (Sesgos_tildes)] del repositorio de [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets 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"
 +
 
 +
<br/>[[Archivo:Comunista_datos.png|miniatura|500px|centro|Media de Toxicidad de tweets con cada palabra (comunista/comunismo y fascista/fascismo)]]
 +
 
 +
<br/>[[Archivo:TweetComunista1.png|miniatura|1000px|centro|Ejemplo de tweet con la palabra comunista]]
 +
[[Archivo:TweetFascista1.png|miniatura|1000px|centro|Ejemplo de tweet con la palabra fascista]]<br/>
 +
 
 +
<br/>''Este trabajo se puede ver con más detalle, junto con los resultados obtenidos, en el Notebook [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets/blob/main/analysis_notebooks/Sesgos_comunista_fascista.ipynb (Sesgos_comunista_fascista)] del repositorio de [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets 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.
 +
 
 +
<br/>[[Archivo:CambioPartido1.png|miniatura|850px|centro|Ejemplo de tweet con la palabra "Ciudadanos"]]
 +
[[Archivo:CambioPartido2.png|miniatura|850px|centro|Ejemplo del mismo tweet cambiando "Ciudadanos" por "Vox"]]<br/>
 +
 
 +
<br/>''Este trabajo se puede ver con más detalle, junto con los resultados obtenidos, en el Notebook [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets/blob/main/analysis_notebooks/Sesgos-partidos.ipynb (Sesgos-partidos)] del repositorio de [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets 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.
 +
 
 +
<br/>[[Archivo:CambioPolitico1.png|miniatura|850px|centro|Ejemplo de tweet mencionando a "Inés Arrimadas"]]
 +
[[Archivo:CambioPolitico2.png|miniatura|850px|centro|Ejemplo del mismo tweet cambiando "Inés Arrimadas" por "Pablo Iglesias"]]<br/>
 +
 
 +
<br/>''Este trabajo se puede ver con más detalle, junto con los resultados obtenidos, en el Notebook [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets/blob/main/analysis_notebooks/Sesgos-nombres-politicos.ipynb (Sesgos-nombres-politicos)] del repositorio de [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets 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.
 +
 
 +
<br/>''Este trabajo se puede ver con más detalle, junto con los resultados obtenidos, en el Notebook [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets/blob/main/analysis_notebooks/Sesgos-emojis.ipynb (Sesgos-emojis)] del repositorio de [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets 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: '''[https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets/blob/main/data/tweets_contradictorios.csv 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:
 +
[[Archivo:Tweets_contradictorios_matriz_confusion.png|miniatura|300px|centro|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.
 +
 
 +
<br/>''Este trabajo se puede ver con más detalle, junto con los resultados obtenidos, en el Notebook [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets/blob/main/analysis_notebooks/Tweets_contradictorios.ipynb (Tweets_contradictorios)] del repositorio de [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets Github]''.
  
 
==Conclusión==
 
==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 [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets 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:
 +
[[Archivo:Correo_newtral.png|miniatura|830px|centro|Correo Newtral]]
 +
 +
==Links==
 +
*Github del proyecto: [https://github.com/AlbertoGarciaDomenech/SesgosToxicidadTweets Github]<br/>
 +
*Modelo de Newtral: [https://huggingface.co/Newtral/xlm-r-finetuned-toxic-political-tweets-es 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==
 
==Agradecimientos==
 
Al equipo de  Newtral, sobre todo a los miembros con los que hemos tenido más contacto:<br/>
 
Al equipo de  Newtral, sobre todo a los miembros con los que hemos tenido más contacto:<br/>
*Rubén Míguez Pérez<br/>
+
*[https://es.linkedin.com/in/rubenmiguez/en Rubén Míguez Pérez]<br/>
*Javier Beltrán Jorba<br/>
+
*[https://es.linkedin.com/in/javierbeltranj/es Javier Beltrán Jorba]<br/>
*Sara Estévez Manteiga<br/>
+
*[https://es.linkedin.com/in/saraestevezmanteiga Sara Estévez Manteiga]<br/>
 
+
==Integrantes del grupo de trabajo==
+
*Pablo Daurell Marina<br/>
+
*Belén García Puente<br/>
+
*Ela Katherine Shepherd Arévalo<br/>
+
*Miquel Vera Ramis<br/>
+
*Alberto García Doménech<br/>
+
*Fernando Bellot Rodríguez<br/>
+
*Mateo González de Miguel<br/>
+
  
  
 
[[Categoría:Curso 2021-2022]]
 
[[Categoría:Curso 2021-2022]]

Última revisión de 20:11 9 ene 2022

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: