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 [email protected]
Membros da equipe:
- Bárbara Libório
- Marina Gama Cubas
- Helena Bertho Dias
- Gabriela Bouret
- Jose Luis Peñarredonda
- Fernanda Aguirre
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.
- Introdução
- Dados
- Metodologia
- Documentação da API
- Trabalhos futuros
- Trabalho relacionado
- Bibliografia
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.
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 |
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.
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.
- Idioma: Existe um rótulo para o idioma do tweet,
es
para espanhol andpt
para português. Há 2.087 tweets em espanhol e 2.092 em português.
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.
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.
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) |
Esta seção mostra algumas estatísticas e gráficos dos dados classificados.
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 |
Este gráfico mostra o vocabulário completo dos dados:
Este gráfico mostra as cinquenta palavras mais comuns nos dados:
Estes gráficos mostram o número de tweets com um determinado comprimento:
Esta é uma nuvem de palavras com as palavras mais comuns:
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.
Esta é a estrutura de fluxo de trabalho que seguimos para o projeto:
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.
Instalando com conda:
conda install requests
Instalando com pip:
pip install requests
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.
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 |
Mostra o resultado quando uma solicitação é enviada. As respostas podem ser agrupadas em cinco categorias:
- Informational
100
-199
- Succesful
200
-299
- Redirection
300
-399
- Client error
400
-499
- Server error
500
-599
Para obter mais informações, verifique este guia.
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'
}
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()
Para mais exemplos, veja este Jupyter Notebook
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.
Se você quiser colaborar ou apenas saber mais sobre o projeto, por favor, entre em contato conosco:
violentometro-online -> Documentação
- Datasheets for Datasets
- Ethical and technical challenges of AI in tackling hate speech
- Detección de Discurso de Odio en Redes Sociales mediante Transformers y Natural Language Processing
- Violência Política de Gênero: as diferenças entre os ataques recebidos por mulheres e seus oponentes
- Tackling Online Abuse and Disinformation Targeting Women in Politics
- #ShePersisted: why gendered disinformation