AfriHate - Hate and Abusive Language for African Languages
Multilingual content-moderation annotation following the AfriHate scheme (Muhammad et al., NAACL 2025), a collection of hate speech and abusive language datasets for 15 African languages including Amharic, Hausa, Igbo, Yoruba, Swahili, Somali and isiZulu. Native speakers familiar with the regional culture assign each tweet a three-way label - hate, abusive, or neutral - and, when the tweet is hateful, mark the targeted attribute (e.g. ethnicity, religion, politics, gender). Sample items are mild, constructed illustrations that avoid real slurs or targeting of real groups; an English gloss is provided for reference only.
Configuration Fileconfig.yaml
This Potato config reproduces the annotation task. Save it as config.yaml and run potato start config.yaml to try it.
# AfriHate - Hate and Abusive Language for African Languages
# Based on Muhammad et al., NAACL 2025
# Paper: https://aclanthology.org/2025.naacl-long.92/
# Dataset: https://github.com/AfriHate/AfriHate
#
# AfriHate is a collection of hate speech and abusive language datasets for
# 15 African languages. Native speakers familiar with the regional culture
# label each tweet with a three-way category and, for hateful tweets, the
# targeted attribute.
#
# Primary labels:
# - Hate: attacks or dehumanizes people BECAUSE of a protected group
# attribute (ethnicity, religion, politics, gender, disability, etc.)
# - Abusive: insulting, offensive, or profane, but NOT targeting a protected
# group (e.g. a personal insult, general vulgarity)
# - Neutral: neither hateful nor abusive (normal speech)
#
# Target attribute (only for HATE tweets):
# ethnicity, religion, politics, gender, disability, other
#
# Annotation Guidelines:
# 1. Read the tweet in the source language (an English gloss is provided for
# reference in this showcase only).
# 2. Choose the single best primary label. The key test for HATE is whether
# the hostility is directed at a protected group ATTRIBUTE, not just an
# individual.
# 3. If (and only if) you chose Hate, mark which attribute(s) are targeted.
# 4. Judge the tweet as written; do not assume missing context.
annotation_task_name: "AfriHate - African Hate and Abusive Language"
task_dir: "."
data_files:
- sample-data.json
item_properties:
id_key: "id"
text_key: "text"
output_annotation_dir: "annotation_output/"
output_annotation_format: "json"
port: 8000
server_name: localhost
annotation_schemes:
# Step 1: three-way primary label
- annotation_type: radio
name: moderation_label
description: "How would you categorize this tweet?"
labels:
- "Hate"
- "Abusive"
- "Neutral"
keyboard_shortcuts:
"Hate": "1"
"Abusive": "2"
"Neutral": "3"
tooltips:
"Hate": "Attacks or dehumanizes people because of a protected-group attribute (ethnicity, religion, politics, gender, disability, etc.)"
"Abusive": "Insulting, offensive, or profane, but not targeting a protected group"
"Neutral": "Neither hateful nor abusive"
# Step 2: targeted attribute - only fill in when the label is Hate
- annotation_type: multiselect
name: hate_target
description: "If the tweet is HATE, which attribute(s) does it target? (leave blank otherwise)"
labels:
- "Ethnicity"
- "Religion"
- "Politics"
- "Gender"
- "Disability"
- "Other"
tooltips:
"Ethnicity": "Targets an ethnic, racial, or national group"
"Religion": "Targets a religious group or belief"
"Politics": "Targets a political affiliation or party"
"Gender": "Targets gender or sexual identity"
"Disability": "Targets disability or health condition"
"Other": "Targets some other protected attribute"
annotation_instructions: |
You will see a tweet written in an African language, with its language
identifier and (for this showcase only) an English gloss.
1. Assign one primary label:
- Hate: hostility aimed at people for belonging to a protected group
- Abusive: offensive/insulting but not aimed at a protected group
- Neutral: neither of the above
2. If you chose Hate, also mark which attribute(s) it targets.
The deciding question for Hate vs. Abusive is WHO the hostility targets:
a protected group attribute (Hate) versus an individual or nobody in
particular (Abusive).
html_layout: |
<div style="padding: 15px; max-width: 800px; margin: auto;">
<div style="background: #ecfdf5; border: 1px solid #a7f3d0; border-radius: 8px; padding: 12px; margin-bottom: 12px;">
<strong style="color: #065f46;">Language:</strong>
<span style="font-size: 15px; margin-left: 8px;">{{language}}</span>
</div>
<div style="background: #fef2f2; border: 1px solid #fecaca; border-radius: 8px; padding: 16px; margin-bottom: 8px;">
<strong style="color: #991b1b;">Tweet:</strong>
<p style="font-size: 17px; line-height: 1.7; margin: 8px 0 0 0;">{{text}}</p>
</div>
<div style="color: #6b7280; font-size: 13px; font-style: italic; margin-bottom: 16px;">
English gloss (reference only): {{gloss}}
</div>
</div>
allow_all_users: true
instances_per_annotator: 50
annotation_per_instance: 3
allow_skip: true
skip_reason_required: false
Sample Datasample-data.json
[
{
"id": "afh_001",
"language": "Swahili (swa)",
"text": "Hongera kwa wachezaji wetu, mmefanya kazi nzuri sana msimu huu.",
"gloss": "Congratulations to our players, you did great work this season."
},
{
"id": "afh_002",
"language": "Nigerian-Pidgin (pcm)",
"text": "You be complete mumu, you no fit do anything correct for this office.",
"gloss": "You are a complete fool, you can't do anything right in this office."
}
]
// ... and 8 more itemsGet This Design
Clone or download from the repository
Quick start:
git clone https://github.com/davidjurgens/potato-showcase.git cd potato-showcase/text/hate-speech-moderation/afrihate-abusive-language potato start config.yaml
Dataset & paper
Muhammad et al., NAACL 2025
Citation (BibTeX)
@inproceedings{muhammad-etal-2025-afrihate,
title = "{A}fri{H}ate: A Multilingual Collection of Hate Speech and Abusive Language Datasets for {A}frican Languages",
author = "Muhammad, Shamsuddeen Hassan and Abdulmumin, Idris and Ayele, Abinew Ali and Adelani, David Ifeoluwa and Yimam, Seid Muhie and others",
booktitle = "Proceedings of the 2025 Conference of the Nations of the Americas Chapter of the Association for Computational Linguistics: Human Language Technologies (Volume 1: Long Papers)",
month = apr,
year = "2025",
publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/2025.naacl-long.92"
}Details
Annotation Types
Domain
Use Cases
Tags
Found an issue or want to improve this design?
Open an IssueRelated Designs
Aya Red-Teaming - Multilingual Global and Local Harm Annotation
Multilingual safety red-teaming annotation, following the Aya Red-Teaming dataset from 'The Multilingual Alignment Prism' (Aakanksha et al., EMNLP 2024): the first human-annotated collection of harmful prompts across eight languages (English, Hindi, French, Spanish, Russian, Arabic, Serbian, Filipino). Native-speaker annotators judge whether a prompt is harmful, assign harm categories, and - the paper's key contribution - mark whether the harm is GLOBAL (universally recognized) or LOCAL (specific to a language or culture). Sample items are mild, constructed, non-operational illustrations only; they contain no actionable or graphic harmful content.
Dynamic Hate Speech Detection
Hate speech classification with fine-grained type labels based on the Dynamically Generated Hate Speech Dataset (Vidgen et al., ACL 2021). Classify content as hateful or not, then identify hate type (animosity, derogation, dehumanization, threatening, support for hateful entities) and target group.
GoEmotions - Fine-Grained Emotion Classification
Multi-label emotion classification with 27 emotion categories plus neutral, based on the Google Research GoEmotions dataset (Demszky et al., ACL 2020). Taxonomy covers 12 positive, 11 negative, and 4 ambiguous emotions designed for Reddit comment analysis.