Skip to content

Latest commit

 

History

History
339 lines (225 loc) · 18.3 KB

README-ES.md

File metadata and controls

339 lines (225 loc) · 18.3 KB

Monitor de Discurso Misógino Político (PMDM en inglés)

El Monitor del Discurso Político Misógino es una aplicación web y una API que detecta el discurso de odio contra mujeres en español y portugués.

Este proyecto forma parte del 2021 JournalismAI Collab Challenges, una iniciativa global que reúne a organizaciones de medios de comunicación para explorar soluciones innovadoras para mejorar el periodismo mediante el uso de tecnologías de IA. Se desarrolló como parte del grupo de Américas del Collab Challenges que se centró en ¿Cómo podríamos utilizar las tecnologías de IA para innovar la recopilación de noticias y las técnicas de reportaje e investigación? en colaboración entre AzMina (Brasil), La Nación (Argentina), CLIP (Colombia) y Data Crítica (México) con el apoyo del Knight Lab de la Universidad Northwestern.

JournalismAI es un proyecto de Polis -el grupo de reflexión sobre periodismo de la London School of Economics and Political Science- y está patrocinado por Google News Initiative. Si quieres saber más sobre los Collab Challenges y otras actividades de JournalismAI, suscríbete al newsletter o pónte en contacto con el equipo a través de [email protected]

API ejemplo de uso

Contenidos


Introducción

Esta colaboración es un intento de acelerar el desarrollo de MonitorA, un proyecto de AzMina con InternetLab e Institute Update, que reunió pruebas y conocimientos sobre los ataques misóginos sistemáticos a las mujeres candidatas en las elecciones locales brasileñas de 2020.

Según el informe Violencia contra las mujeres en la política, este tipo de violencia es un elemento disuasorio para la participación de las mujeres en la esfera política, donde las mujeres de comunidades marginadas se ven afectadas de forma desproporcionada. ONU Mujeres afirma que en el contexto latinoamericano, las mujeres apenas ocupan el 30% de los asientos parlamentarios. Además, ONU Mujeres destaca que "la igualdad de género en los más altos puestos de poder no se alcanzará hasta dentro de 130 años". Los hechos mencionados nos llevan a analizar cómo la violencia contra las mujeres se perpetra y repercute en su participación. Queremos denunciar este tipo de desinformación y ataques en toda América Latina, en un esfuerzo por motivar nuevas narrativas donde las mujeres tengan un espacio seguro en su participación en la política.

Por lo anterior, aunque este modelo de IA es capaz de identificar la violencia contra las mujeres en general, queremos centrarnos en la misoginia en el discurso político como caso de estudio en América Latina. En nuestro proyecto, apoyamos que la automatización de la detección del discurso misógino es sólo una herramienta para ayudar a identificar los ataques contra las mujeres entre un gran volumen de datos en Twitter, por lo que el sistema destaca el contenido que puede ser analizado por un moderador humano después.


Datos

Dado que las colaboradoras somos de países latinoamericanos, este modelo se entrenó con tuits en español y portugués publicados entre 2020 y 2021. Recuperamos 4179 tuits de Twitter en formato 'csv'.

Faltan 270 tuits de la base de datos que usamos para entrenar el modelo y de la base de datos que compartimos en este repositorio ya que no pudimos recuperar los IDs de esos tuits. Todas las cantidades del análisis de datos pertenecen a la base de datos de entrenamiento.

entrenamiento de la base de datos repositorio de la base de datos
4179 3909
  1. Creación de Corpus:

Creamos un diccionario en español y otro en portugués con términos y frases misóginas. Junto con eso, hicimos una lista de nombres de usuario de políticos actuales. Sin embargo, consideramos que esas cuentas no serían lo suficientemente inclusivas, así que decidimos hacer una segunda lista exclusivamente para mujeres diversas (negras, indígenas y LGBTQIA+) políticas, periodistas y activistas de Brasil, Argentina, Colombia y México. Por lo tanto, los tweets que mencionaban ambas listas de nombres de usuario se recopilaron de Twitter utilizando Meltwater y se filtraron por los diccionarios con expresiones regulares.

  1. Etiquetado:

El archivo de datos incluye tres columnas:

  • ID: Dado que la política de Twitter impide compartir los mensajes de los tuits, sólo incluimos el ID de cada uno de ellos, teniendo en cuenta que los IDs pueden descargarse y pueden transformarse en el texto original utilizando herramientas disponibles.

  • Clasificación: Los tuits se anotan con la etiqueta "1" si son misóginos o "0" si no lo son. El discurso misógino fue positivo en 2.637 tuits y negativo en 1.542.

Tuits por clase

  • Idioma: Hay una etiqueta para el idioma del tuit, es para el español y pt para el portugués. Hay 2087 tweets en español y 2092 en portugués.

Tuits per idioma

  1. Acuerdo entre Anotadores:

La anotación de esta base de datos para detectar misoginia fue realizada por seis anotadoras humanas (cinco mujeres y un hombre) cuyas lenguas maternas son el español o el portugués y que radican en el país de cada conjunto de datos (Brasil, Argentina, Colombia y México). Para validar la anotación, todas las etiquetas de clasificación contaron con una verificadora diferente de la primera anotadora. Si la verificadora estaba de acuerdo con la etiqueta, la clasificación se mantenía. En caso contrario, el tweet se eliminaba de la base de datos.


Metodología

Para crear el clasificador, hemos hecho uso de cinco Python Colaboratory Notebooks:

  • Análisis de datos: Análisis y estadísticas básicas de los datos.
  • Entrenar y evaluar el modelo (2 versiones): Entrena un modelo y lo evalúa, uno para Transformers y otro para Adapters.
  • Etiquetado de datos (2 versiones): Etiqueta los datos desde el formulario de entrada del cuaderno o desde un archivo, una para Transformers y otra para Adapters.

  1. Preprocesamiento de Tuits

Hay varios pasos de preprocesamiento en el Procesamiento del Lenguaje Natural que se pueden aplicar a los datos:

  • Lowers: Todas las palabras en minúsculas. (p.ej. GitHub → github)
  • Stop words: Elimina las palabras que son muy comunes pero que no aportan información útil. (p.ej. preposiciones)
  • Demojize: Cambia los emojis por una representación textual. (p.ej. ☺️ → :smiling_face:)
  • URLs: Sustituye las URL por $URL$ (p.ej. https://github.com/ → $URL$)
  • Mentions: Sustituye las menciones por $MENTION$ (p.ej. @github → $MENTION$)
  • Hashtags: Sustituye los hashtags por $HASHTAG$ (p.ej. #github → $HASHTAG$)
  • Emojis: Sustituye los emojis por $EMOJI$ (p.ej. 😃 → $EMOJI$)
  • Smileys: Sustituye los smileys por $SMILEY (p.ej. :) → $SMILEY)
  • Numbers: Sustituye los números por $NUMBER$ (p.ej. 4 → $NUMBER$)
  • Escaped characters: Sustituye los caracteres escapados por $ESCAPE_CHAR$ (p.ej. char(2) → $ESCAPE_CHAR$)

Cabe mencionar que obtuvimos mejores resultados con el texto en minúsculas.

Además, seguimos una [metodología] de aprendizaje automático (https://en.wikipedia.org/wiki/Training,_validation,_and_test_sets) en la que utilizamos una parte de los datos etiquetados para entrenar un modelo que luego se prueba con otra parte de los datos. Durante el entrenamiento validamos el progreso del modelo utilizando una tercera parte de los datos.

División Porcentaje Tuits
Entrenamiento 80% 3,343 (1673 pt, 1669 es)
Prueba 10% 418 (210 pt, 209 es)
Validación 10% 418 (209 pt, 209 es)

  1. Análisis de datos

Esta sección muestra algunas estadísticas y gráficos de los datos etiquetados.

  • Estadísticas de vocabulario:

Frecuencia Descripción
count 19063 Número de palabras diferentes
mean 3.444841 Media de palabras que aparecen
std 13.935922 Desviación estándar asociada a las palabras
min 1 Número mínimo en que aparece una palabra
25% 1 Hasta el 25% de las palabras que aparecen
50% 1 Hasta el 50% de las palabras que aparecen
75% 2 Hasta el 75% de las palabras que aparecen
max 1062 Número máximo que aparece una palabra
  • Frecuencia del vocabulario

Este gráfico muestra el vocabulario completo de los datos:

Frecuencia del vocabulario

  • 50 palabras más frecuentes

Este gráfico muestra las cincuenta palabras más comunes en los datos:

50 palabras más frecuentes

  • Histogramas de la longitud de los tuits

Estos gráficos muestran el número de tuits con una longitud determinada:

Histogramas de la longitud de los tokens Histogramas de la longitud de los caracteres

  • Nube de Palabras

Esta es una nube de palabras con las palabras más comunes:

Nube de Palabras


  1. Modelos Pre-entrenados

Probamos varios modelos de Transformers y Adapters. Sin embargo, cardiffnlp/twitter-xlm-roberta-base fue el que obtuvo el mejor rendimiento en F1 score:

Modelo Tipo Ambos es pt
cardiffnlp/twitter-xlm-roberta-base Multilingual 0.8728 0.9191 0.8235
neuralmind/bert-base-portuguese-cased Portugués - - 0.875
dccuchile/bert-base-spanish-wwm-uncased Español - 0.8985 -
mudes/multilingual-base Multilingual 0.8641 0.8929 0.8339
neuralmind/bert-base-portuguese-cased Portugués - - 0.8496
PlanTL-GOB-ES/roberta-base-bne Español - 0.9027 -

Para más información sobre el desempeño de los modelos, consula este informe técnico.


  1. Arquitectura del Sistema

Esta es la estructura del flujo de trabajo que seguimos para el proyecto:

Arquitectura del sistema


Para permitir la comunicación con la API, necesitamos una biblioteca HTTP para hacer una petición-respuesta. Hay unas cuantas bibliotecas para hacer peticiones HTTP en Python. Sin embargo, haremos uso de requests debido a que está bien documentada y es sencilla.

  • Requests Library

Instalando el paquete conda:

conda install requests

Instalación del paquete con pip:

pip install requests
  • POST Request

El método POST se utiliza cuando queremos enviar datos para ser procesados al servidor. Este es un ejemplo de la sintaxis:

requests.post(url, headers={key: value}, json={key: value}, data={key: value})

Para más información sobre los métodos de petición HTTP, consulta esta guía.

  • Valores de los parámetros

Parámetro Descripción
url Una cadena con el parámetro
headers Un dictado para enviar a la url
json Un dictado para enviar a la url
files Un dictado de archivos para enviar a la url
data Un dict o una lista de tuplas para enviar a la url
  • Código de estado

El método de código de estado muestra el resultado cuando se envía una solicitud. Las respuestas pueden agruparse en cinco categorías:

  1. Informativa 100-199
  2. Exitoso 200-299
  3. Redirección 300-399
  4. Error del cliente 400-499
  5. Error del servidor 500-599

Para más información sobre los códigos de estado de respuesta HTTP, consulta esta guía.

Clasificación de texto

import requests

url = 'https://turing.iimas.unam.mx/pmdm/api/classify'

headers = {'access-token': 'token'}

tweet = {'tweet': 'text to classify'}

response = requests.post(url, headers=headers, json=tweet)

print(response.status_code)

response.json()

Argumentos por defecto de los tuits:

{
  'tweet': 'string',
  'use_lower': 'false',
  'demojize': 'true',
  'process_urls': 'true',
  'process_mentions': 'true',
  'process_hashtags': 'true',
  'process_emojis': 'false',
  'process_smileys': 'false',
  'process_numbers': 'false',
  'process_escaped_chars': 'false'
}

Clasificación de archivos

import requests

url = 'https://turing.iimas.unam.mx/pmdm/api/classify_file'

headers = {'access-token': 'token'}

files = {'uploaded_file': open('filename', 'rb')}

# Tweet arguments required
data = {
        'model': 'es',
        'use_lower': 'false', 
        'demojize': 'true', 
        'process_urls':'true', 
        'process_mentions': 'true', 
        'process_hashtags': 'true', 
        'process_emojis': 'false', 
        'process_smileys': 'false', 
        'process_numbers': 'false', 
        'process_escaped_chars': 'false'}

response = requests.post(url, headers=headers, files=files, data=data)

print(response.status_code)

response.json()

Más ejemplos

Para más ejemplos, consulta este Jupyter Notebook


Trabajo futuro

Para trabajo futuro nos gustaría crear conjuntos de datos de países latinoamericanos no incluidos en este momento con el fin de mantener el entrenamiento del modelo. Además, utilizaremos la API para agilizar la detección y analizar los casos de discurso misógino en las redes sociales.

Como somos conscientes de que el manejo de una API es aún poco accesible para muchas redacciones de la región debido a los requerimientos técnicos, queremos documentar y metodizar aplicaciones de uso que esperamos inspiren y ayuden a otras organizaciones a trabajar con esta herramienta.


Contacto

Si quieres colaborar o simplemente saber más sobre el proyecto, pónte en contacto con nosotras:


Proyectos Relacionados

violentometro-online -> Documentation

Bibliografía