Skip to content
intermediatetext

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.

Select all that apply:

Configuration Fileconfig.yaml

This Potato config reproduces the annotation task. Save it as config.yaml and run potato start config.yaml to try it.

yaml
# 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

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 items

Get This Design

View on GitHub

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)

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

radiomultiselect

Domain

NLPContent ModerationSocial MediaMultilingual NLP

Use Cases

Hate Speech DetectionAbusive Language DetectionContent ModerationAfrican Language NLP

Tags

hate-speechabusive-languagecontent-moderationafrican-languagesmultilinguallow-resourcemasakhaneafrihatenaacl2025

Found an issue or want to improve this design?

Open an Issue