Skip to content
intermediateaudio

HatEval - Multilingual Detection of Hate Speech Against Immigrants and Women

Detection and classification of hate speech targeting immigrants and women on Twitter, including fine-grained annotation of target range (individual vs. generic) and aggressiveness. Based on SemEval-2019 Task 5 (HatEval).

1:42Classify this audio:HappySadAngryNeutralSubmit

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
# HatEval - Multilingual Detection of Hate Speech
# Based on Basile et al., SemEval 2019
# Paper: https://aclanthology.org/S19-2007/
# Dataset: https://competitions.codalab.org/competitions/19935
#
# HatEval targets hate speech against immigrants and women. Following the
# official protocol, annotators complete two subtasks:
#   Task A (HS): binary detection of hate speech.
#   Task B: for hateful tweets, the target range (TR) and aggressiveness (AG).
#
# Task A - Hate Speech (HS):
# - Hateful: The tweet contains hate speech against immigrants or women
# - Not Hateful: The tweet does not contain hate speech
#
# Task B - Target Range (TR): applies only when the tweet is hateful
# - Individual: hate directed at a specific individual
# - Generic: hate directed at a group / class of people
#
# Task B - Aggressiveness (AG): applies only when the tweet is hateful
# - Aggressive: the tweet incites harm or aggressive action
# - Not Aggressive: hateful but without inciting aggression

annotation_task_name: "HatEval - Hate Speech Detection"
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:
  - annotation_type: radio
    name: hate_speech
    description: "Task A (HS): Does this tweet contain hate speech against immigrants or women?"
    labels:
      - "Hateful"
      - "Not Hateful"
    keyboard_shortcuts:
      "Hateful": "1"
      "Not Hateful": "2"
    tooltips:
      "Hateful": "The tweet contains hate speech against immigrants or women"
      "Not Hateful": "The tweet does not contain hate speech"

  - annotation_type: radio
    name: target_range
    description: "Task B (TR): If hateful, is the target an individual or a group?"
    labels:
      - "Individual"
      - "Generic"
    tooltips:
      "Individual": "Hate directed at a specific person"
      "Generic": "Hate directed at a group or class of people"

  - annotation_type: radio
    name: aggressiveness
    description: "Task B (AG): If hateful, is the tweet aggressive?"
    labels:
      - "Aggressive"
      - "Not Aggressive"
    tooltips:
      "Aggressive": "The tweet incites harm or aggressive action against the target"
      "Not Aggressive": "Hateful but does not incite aggression"

annotation_instructions: |
  You will be shown a tweet. Your task is to:
  1. Task A (HS): Determine whether the tweet contains hate speech against
     immigrants or women (hateful vs. not hateful).
  2. Task B: If the tweet is hateful, judge the target range (individual vs.
     generic group) and whether the tweet is aggressive.
  Leave the Task B fields unanswered when the tweet is not hateful.

html_layout: |
  <div style="padding: 15px; max-width: 800px; margin: auto;">
    <div style="background: #fefce8; border: 1px solid #fde68a; border-radius: 8px; padding: 12px; margin-bottom: 12px;">
      <strong style="color: #a16207;">Target Group:</strong>
      <span style="font-size: 15px;">{{target_group}}</span>
    </div>
    <div style="background: #f0f9ff; border: 1px solid #bae6fd; border-radius: 8px; padding: 16px; margin-bottom: 16px;">
      <strong style="color: #0369a1;">Tweet:</strong>
      <p style="font-size: 16px; line-height: 1.7; margin: 8px 0 0 0;">{{text}}</p>
    </div>
  </div>

allow_all_users: true
instances_per_annotator: 50
annotation_per_instance: 2
allow_skip: true
skip_reason_required: false

Sample Datasample-data.json

json
[
  {
    "id": "hateval_001",
    "text": "These immigrants are ruining our country. They should all go back where they came from. #buildthewall",
    "target_group": "Immigrants"
  },
  {
    "id": "hateval_002",
    "text": "Just had the most amazing tacos from the new Mexican restaurant downtown. Highly recommend!",
    "target_group": "None"
  }
]

// ... 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/semeval/2019/task05-hateval
potato start config.yaml

Dataset & paper

Basile et al., SemEval 2019

Citation (BibTeX)

bibtex
@inproceedings{basile-etal-2019-semeval,
    title = "{S}em{E}val-2019 Task 5: Multilingual Detection of Hate Speech Against Immigrants and Women in {T}witter",
    author = "Basile, Valerio and Bosco, Cristina and Fersini, Elisabetta and Nozza, Debora and Patti, Viviana and Rangel Pardo, Francisco Manuel and Rosso, Paolo and Sanguinetti, Manuela",
    booktitle = "Proceedings of the 13th International Workshop on Semantic Evaluation",
    month = jun,
    year = "2019",
    address = "Minneapolis, Minnesota, USA",
    publisher = "Association for Computational Linguistics",
    url = "https://aclanthology.org/S19-2007/",
    doi = "10.18653/v1/S19-2007",
    pages = "54--63"
}

Details

Annotation Types

radiomultiselect

Domain

SemEvalNLPHate Speech DetectionSocial Media

Use Cases

Hate Speech DetectionContent ModerationSocial Media Analysis

Tags

semevalsemeval-2019shared-taskhate-speechtwitterhatevalcontent-moderation

Found an issue or want to improve this design?

Open an Issue