Skip to content

Latest commit

 

History

History
352 lines (234 loc) · 18.7 KB

README-PT.md

File metadata and controls

352 lines (234 loc) · 18.7 KB

Monitor do Discurso Político Misógino (PMDM em inglês)

Political Misogynistic Discourse Monitor é um aplicativo da web e uma API que detecta discurso de ódio contra mulheres em espanhol e português.

Este projeto faz parte do 2021 JournalismAI Collab Challenges, uma iniciativa global que reúne organizações de mídia para explorar soluções inovadoras para melhorar o jornalismo por meio do uso de tecnologias de Inteligência Artificial. Ele foi desenvolvido como parte do grupo das Américas no Collab Challenges, que tinha como objetivo Como podemos usar as tecnologias de IA para inovar as técnicas de coleta de notícias e de reportagens investigativas? em colaboração entre AzMina (Brasil), La Nación (Argentina), CLIP (Colômbia) e Data Crítica (México). Em todo o percurso tivemos o apoio do Knight Lab, da Northwestern University, para o desenvolvimento de nossos trabalhos.

JournalismAI é um projeto do Polis – o centro de estudos em jornalismo da London School of Economics and Political Science - e é patrocinado pelo Google News Initiative. Se quiser saber mais sobre Collab Challenges e outras atividades do JournalismAI, inscreva-se na newsletter ou entre em contato com a equipe através do e-mail hello@journalismai.info

API exemplo de uso

Membros da equipe:

Agradecemos a Ivan Vladimir por toda ajuda no desenvolvimento do software e da aplicação web; e ao IIMAS (Instituto de Investigaciones en Matemáticas Aplicadas e en Sistemas), da UNAM, por hospedar o projeto.


Contents


Introdução

Este trabalho é uma tentativa de acelerar o desenvolvimento do MonitorA, um projeto de AzMina com InternetLab and Institute Update, que reuniu evidências e percepções de ataques misóginos sistemáticos de candidatas nas eleições locais brasileiras de 2020.

De acordo com o relatório Violence Against Women in Politics, este tipo de violência é um impedimento à participação das mulheres na esfera política, onde as mulheres de comunidades marginalizadas são afetadas de forma desproporcional. A ONU Mulheres afirma que, no contexto da América Latina, as mulheres ocupam apenas 30% dos assentos parlamentares. Além disso, a organização destaca que “a igualdade de gênero nos cargos mais altos do poder não será alcançada por mais 130 anos”.

Os fatos mencionados nos levam a analisar como a violência contra as mulheres é perpetrada e tem impacto na sua participação. Queremos relatar esse tipo de desinformação e ataques em toda a América Latina em um esforço para motivar novas narrativas onde as mulheres tenham um espaço seguro em seu envolvimento na política.

Por esse motivo, embora este modelo de IA seja capaz de identificar a violência contra as mulheres em diferentes contextos, queremos enfocar a misoginia no discurso político como um estudo de caso na América Latina. Em nosso projeto, defendemos que a automação da detecção de discurso misógino é apenas uma ferramenta para ajudar a identificar ataques contra mulheres em meio a um grande volume de dados no Twitter. A ferramenta desenvolvida é importante para que o sistema destaque o conteúdo que pode ser analisado por um moderador humano posteriormente.


Dados

Como os colaboradores são de países latino-americanos, esse modelo foi treinado com tweets em espanhol e português, postados de 2020 a 2021. Recuperamos 4.179 tweets do Twitter em formato 'csv'.

Estão faltando 270 tweets do banco de dados que usamos para treinar o modelo e do banco de dados que compartilhamos neste repositório, pois não foi possível recuperar os IDs dessas postagens. Todos os valores da análise dos dados pertencem ao treinamento do banco de dados.

database training database repository
4179 3909
  1. Criação do corpus:

Criamos um dicionário em espanhol e outro em português com termos e frases misóginas. Junto com isso, fizemos uma lista de nomes de usuários para políticos que têm destaque nos países onde atua e um número significativo de seguidores de modo que suas postagens tenham possibilidade de maior alcance na rede.

No entanto, consideramos que os termos e frases misóginas não seriam abrangentes o suficientes para detectar os diferentes tipos de violência verbais que as mulheres podem ser alvo na redes, por isso decidimos fazer uma segunda lista com foco nas possíveis ofensas raciais e voltada à orientação sexual (negras, indígenas e LGBTQIA+) de mulheres políticas, jornalistas e ativistas do Brasil, Argentina, Colômbia e México.

Os tweets mencionando em ambas as listas foram coletados do Twitter usando Meltwater e filtrados pelos dicionários a partir de expressões regulares.

  1. Classificação:

O arquivo de dados possui três colunas:

  • ID: Como a política do Twitter impede o compartilhamento de mensagens de tweets, incluímos apenas o ID de cada tweet, considerando que os IDs podem ser baixados e podem ser transformados no texto original usando as ferramentas disponíveis.

  • Classificação: tweets são etiquetados com o rótulo 1 se forem misóginos ou 0 se não forem. O discurso misógino foi positivo em 2.637 tweets e negativo em 1.542 tweets.

Tuits per classes

  • Idioma: Existe um rótulo para o idioma do tweet, es para espanhol and pt para português. Há 2.087 tweets em espanhol e 2.092 em português.

Tuits per language

  1. Método de classificação:

A classificação para este banco de dados de detecção de misoginia foi realizada por seis pessoas (cinco mulheres e um homem) cujos primeiros idiomas são o espanhol ou o português e que se baseiam no país de cada conjunto de dados (Brasil, Argentina, Colômbia e México). Para validar a classificação, os tweets passaram por dois verificadores separadamente. Se a verificação realizada pela segunda pessoa correspondesse com a verificação feita pela primeira, a classificação permanecia na base de dados.


Metodologia

Para a criação do classificador, utilizamos cinco Colaboratory Python Notebooks:

  • Análise de dados: Análise básica e estatística dos dados.
  • Treinamento e avaliação do modelos (2 versões): Treina e avalia um modelo, um para Transformers e outro para Adapters.
  • Dados de rotulagem (2 versões): Rotula os dados do formulário de entrada do caderno ou de um arquivo, um para Transformers e outro para Adapters.
  1. Pré-processamento dos tweets

Há várias etapas de pré-processamento no processamento de linguagem natural que foram aplicadas aos dados:

  • Caixa Baixa: Todas as palavras em minúscula. (e.g., GitHub → github)
  • Palavras irrelevantes: Remoção de palavras que são muito comuns e que não fornecem informações úteis. (ex.: preposições)
  • Demojize: Alteração de emojis para representação textual. (ex.: ☺️ → :smiling_face:)
  • URLs: Substituição de URLs por $URL$ (ex.: https://github.com/ → $URL$)
  • Mentions: Substituição de menções por $MENTION$ (ex.: @github → $MENTION$)
  • Hashtags: Substituição de hashtags por $HASHTAG$ (ex.: #github → $HASHTAG$)
  • Emojis: Substituição de emojis por $EMOJI$ (ex.: 😃 → $EMOJI$)
  • Smileys: Substituição de sorrisos por $SMILEY (ex.: :) → $SMILEY)
  • Numbers: Substituição de números por $NUMBER$ (ex.: 4 → $NUMBER$)
  • Escaped characters: Substituição de escaped characters por $ESCAPE_CHAR$ (ex.: char(2) → $ESCAPE_CHAR$)

Junto com isso, seguimos uma metodologia de aprendizado de máquina na qual usamos parte dos dados rotulados para treinar um modelo que, em seguida, é testado na outra parte dos dados. Durante o treinamento, validamos o progresso do modelo usando uma terceira parte dos dados.

Split Percentage Tweets
Train 80% 3,343 (1673 pt, 1669 es)
Test 10% 418 (210 pt, 209 es)
Validation 10% 418 (209 pt, 209 es)
  1. Análise de dados

Esta seção mostra algumas estatísticas e gráficos dos dados classificados.

  • Estatística vocabulário

Frequency Description
count 19063 Number of different words
mean 3.444841 The average number words appear
std 13.935922 The standard deviation associated to the words
min 1 The minimum number that a word appears
25% 1 Up to 25% of the words appear
50% 1 Up to 50% of the words appear
75% 2 Up to 75% of the words appear
max 1062 The maximum number that a word appears
  • Frequência do vocabulário

Este gráfico mostra o vocabulário completo dos dados:

Vocabulary frequencies

  • Top 50 das palavras mais frequentes

Este gráfico mostra as cinquenta palavras mais comuns nos dados:

Top 50 word frequencies

  • Tamanho dos tweets

Estes gráficos mostram o número de tweets com um determinado comprimento:

Histograms of length of tokens Histograms of length of chars

  • Nuvem de palavra

Esta é uma nuvem de palavras com as palavras mais comuns:

Wordcloud


Modelos Pré-Treinados

Testamos vários modelos de transformadores e adaptadores. No entanto cardiffnlp/twitter-xlm-roberta-base foi o que apresentou melhor desempenho no F1 score:

Model Type both es pt
cardiffnlp/twitter-xlm-roberta-base Multilingual 0.8728 0.9191 0.8235
neuralmind/bert-base-portuguese-cased Portuguese - - 0.875
dccuchile/bert-base-spanish-wwm-uncased Spanish - 0.8985 -
mudes/multilingual-base Multilingual 0.8641 0.8929 0.8339
neuralmind/bert-base-portuguese-cased Portuguese - - 0.8496
PlanTL-GOB-ES/roberta-base-bne Spanish - 0.9027 -

Para mais informações sobre o desempenho de todos os modelos, consulte o relatório técnico.


  • Arquitetura do Sistema

Esta é a estrutura de fluxo de trabalho que seguimos para o projeto:

Arquitetura do Sistema


Para permitir a comunicação com a API, precisamos de uma biblioteca HTTP para fazer uma solicitação-resposta. Existem algumas bibliotecas para fazer solicitações HTTP em Python. No entanto, faremos uso de solicitações por ser bem documentado e simples.

  • Requests Library

Instalando com conda:

conda install requests

Instalando com pip:

pip install requests
  • POST Request

O método POST é usado quando queremos enviar dados para serem processados no servidor. Abaixo, um exemplo de sintaxe:

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

Para obter mais informações, consulte este guia.

  • Valores dos parâmetros

Parameter Description
url A string with the endpoint
headers A dict to send to the url
json A dict to send to the url
files A dict of files to send to the url
data A dict or list of tuples to send to the url
  • Status Code

Mostra o resultado quando uma solicitação é enviada. As respostas podem ser agrupadas em cinco categorias:

  1. Informational 100-199
  2. Succesful 200-299
  3. Redirection 300-399
  4. Client error 400-499
  5. Server error 500-599

Para obter mais informações, verifique este guia.

Classifying Text

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()

Default tweet arguments:

{
  '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'
}

Classifying Files

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()

Outros exemplos

Para mais exemplos, veja este Jupyter Notebook


Trabalho futuro

Queremos criar conjuntos de dados de países latino-americanos não incluídos neste momento no interesse de manter o treinamento do modelo. Além disso, usaremos a API para agilizar a detecção e analisar instâncias de discurso misógino nas redes sociais.

Estamos cientes de que o gerenciamento de uma API ainda não é muito acessível para muitas redações da região devido a requisitos técnicos, por isso queremos documentar e metodizar aplicativos de uso que esperamos inspirar e ajudar outras organizações a trabalhar com esta ferramenta.


Contate-nos

Se você quiser colaborar ou apenas saber mais sobre o projeto, por favor, entre em contato conosco:


Trabalho relacionado

violentometro-online -> Documentação

Bibliografia