Skip to content
intermediatetext

Sentiment Composition of Phrases (SCL) via Best-Worst Scaling

Rate the sentiment of short phrases using Best-Worst Scaling to study how sentiment composes. Each 4-tuple mixes single words with phrases built from negators, modals, and degree adverbs (e.g. 'good', 'not good', 'very good', 'hardly good'); annotators pick the most positive and most negative phrase, yielding real-valued scores that reveal how modifiers shift sentiment. This is the design behind the NRC Sentiment Composition Lexicons - SCL-OPP (opposing-polarity phrases) and SCL-NMA (negators, modals, adverbs) - by Kiritchenko & Mohammad, with an Arabic Twitter variant from SemEval-2016 Task 7.

Submit

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
# Sentiment Composition of Phrases (SCL) via Best-Worst Scaling
# Based on the NRC Sentiment Composition Lexicons:
#   - Kiritchenko & Mohammad (NAACL 2016), "Sentiment Composition of Words
#     with Opposing Polarities" (SCL-OPP)
#   - Kiritchenko & Mohammad (WASSA 2016), "The Effect of Negators, Modals,
#     and Degree Adverbs on Sentiment Composition" (SCL-NMA)
#   - Arabic Twitter terms from SemEval-2016 Task 7 (Kiritchenko, Mohammad,
#     Salameh).
#
# Goal: measure how sentiment COMPOSES - how a negator ("not"), a modal
# ("might"), or a degree adverb ("very", "hardly") changes the sentiment of
# a word or phrase. Studying single words and their modified forms in the
# same annotation shows, for example, that "not good" is less positive than
# "good" but usually not as negative as "bad".
#
# Best-Worst Scaling (BWS / MaxDiff) annotation design:
#   - Each item is a tuple of FOUR phrases (words and/or modified phrases).
#   - The annotator picks the MOST POSITIVE phrase and the MOST NEGATIVE
#     phrase in the tuple.
#   - Every phrase appears in several 4-tuples; a real-valued sentiment
#     score in [-1, +1] is later computed as (proportion chosen most
#     positive) - (proportion chosen most negative).
#
# Multilingual note: sample data includes English tuples and an Arabic
# Twitter tuple. Judge sentiment within the language of the tuple.
#
# Annotation guidelines:
#   1. Judge the phrase as a whole, accounting for negators/modifiers.
#   2. "Most positive" and "most negative" must be two DIFFERENT phrases.
#   3. If all four seem neutral, still pick the relatively most positive and
#      most negative.
#   4. Use Skip only if you cannot read the language of the tuple.

annotation_task_name: "Sentiment Composition (BWS)"
task_dir: "."

data_files:
  - sample-data.json

item_properties:
  id_key: "id"
  text_key: "prompt"
  text_display_key: "prompt"
  list_display_key: "options"

output_annotation_dir: "annotation_output/"
output_annotation_format: "json"

annotation_schemes:
  - annotation_type: radio
    name: most_positive
    description: "Which phrase is the MOST POSITIVE?"
    labels:
      - "Phrase 1"
      - "Phrase 2"
      - "Phrase 3"
      - "Phrase 4"

  - annotation_type: radio
    name: most_negative
    description: "Which phrase is the MOST NEGATIVE?"
    labels:
      - "Phrase 1"
      - "Phrase 2"
      - "Phrase 3"
      - "Phrase 4"

allow_all_users: true
instances_per_annotator: 100
annotation_per_instance: 4
allow_skip: true
skip_reason_required: false

Sample Datasample-data.json

json
[
  {
    "id": "scl_001",
    "prompt": "Which phrase is most positive vs. most negative?\n\nPhrase 1: good\nPhrase 2: not good\nPhrase 3: very good\nPhrase 4: bad",
    "options": [
      "good",
      "not good",
      "very good",
      "bad"
    ]
  },
  {
    "id": "scl_002",
    "prompt": "Which phrase is most positive vs. most negative?\n\nPhrase 1: happy\nPhrase 2: hardly happy\nPhrase 3: extremely happy\nPhrase 4: not happy at all",
    "options": [
      "happy",
      "hardly happy",
      "extremely happy",
      "not happy at all"
    ]
  }
]

// ... and 6 more items

Try it live — no install

Boot the real Potato server in your browser (WebAssembly) and annotate with this exact config. Nothing leaves your machine.

▶ Run live in your browser

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/emotion-sentiment/scl-sentiment-composition-bws
potato start config.yaml

Dataset & paper

Kiritchenko & Mohammad, NAACL 2016

Citation (BibTeX)

bibtex
@inproceedings{kiritchenko-mohammad-2016-sentiment,
    title = "Sentiment Composition of Words with Opposing Polarities",
    author = "Kiritchenko, Svetlana and Mohammad, Saif",
    booktitle = "Proceedings of the 2016 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies",
    month = jun,
    year = "2016",
    address = "San Diego, California",
    publisher = "Association for Computational Linguistics",
    url = "https://aclanthology.org/N16-1128",
    pages = "1102--1108"
}

Details

Annotation Types

radio

Domain

NLPSentiment AnalysisLexicon BuildingMultilingual

Use Cases

Sentiment IntensitySentiment CompositionBest-Worst Scaling

Tags

best-worst-scalingmaxdiffsentiment-compositionscl-oppscl-nmanegationmodalsadverbsarabicmohammad

Found an issue or want to improve this design?

Open an Issue