Skip to content
Tutorials5 min read

Créer une tâche d'analyse de sentiment

Construisez une tâche complète de classification de sentiment avec des boutons radio, des infobulles et des raccourcis clavier pour un étiquetage efficace.

Potato Team·

Créer une tâche d'analyse de sentiment

L'analyse de sentiment est une tâche fondamentale du NLP, et Potato facilite la collecte d'étiquettes de sentiment de haute qualité. Dans ce tutoriel, nous allons construire une interface d'annotation de sentiment prête pour la production avec toutes les fonctionnalités.

Aperçu du projet

Nous allons créer une interface pour annoter des publications sur les réseaux sociaux avec :

  • Classification de sentiment à trois voies (Positif, Négatif, Neutre)
  • Notes de confiance pour chaque annotation
  • Explications textuelles optionnelles
  • Raccourcis clavier pour la rapidité
  • Mesures de contrôle qualité

Configuration complète

Voici le fichier config.yaml complet :

yaml
annotation_task_name: "Social Media Sentiment Analysis"
 
# Data configuration
data_files:
  - "data/tweets.json"
 
item_properties:
  id_key: id
  text_key: text
 
# Annotation interface
annotation_schemes:
  # Primary sentiment label
  - annotation_type: radio
    name: sentiment
    description: "What is the overall sentiment of this post?"
    labels:
      - name: Positive
        tooltip: "Expresses happiness, satisfaction, or approval"
        keyboard_shortcut: "1"
      - name: Negative
        tooltip: "Expresses sadness, frustration, or disapproval"
        keyboard_shortcut: "2"
      - name: Neutral
        tooltip: "Factual, objective, or lacks emotional content"
        keyboard_shortcut: "3"
    required: true
 
  # Confidence rating
  - annotation_type: likert
    name: confidence
    description: "How confident are you in your sentiment label?"
    size: 5
    min_label: "Not confident"
    max_label: "Very confident"
    required: true
 
  # Optional explanation
  - annotation_type: text
    name: explanation
    description: "Why did you choose this label? (Optional)"
    textarea: true
    required: false
    placeholder: "Explain your reasoning..."
 
# Guidelines
annotation_guidelines:
  title: "Sentiment Annotation Guidelines"
  content: |
    ## Votre tâche
    Classifiez le sentiment exprimé dans chaque publication sur les réseaux sociaux.
 
    ## Étiquettes
 
    **Positif** : L'auteur exprime des émotions ou opinions positives
    - Bonheur, enthousiasme, gratitude
    - Éloge, recommandations, approbation
    - Exemples : "J'adore !", "Meilleure journée !", "Fortement recommandé"
 
    **Négatif** : L'auteur exprime des émotions ou opinions négatives
    - Colère, frustration, tristesse
    - Plaintes, critiques, désapprobation
    - Exemples : "Service horrible", "Tellement déçu", "Pire expérience"
 
    **Neutre** : Factuel ou sans sentiment clair
    - Nouvelles, annonces, questions
    - Opinions mixtes ou équilibrées
    - Exemples : "Le magasin ouvre à 9h", "Quelqu'un a essayé ?"
 
    ## Conseils
    - Concentrez-vous sur le sentiment de l'auteur, pas le sujet
    - Le sarcasme doit être étiqueté selon le sens voulu
    - En cas de doute, baissez votre note de confiance
 
# User management
automatic_assignment:
  on: true
  sampling_strategy: random
  labels_per_instance: 1
  instance_per_annotator: 100

Format des données d'exemple

Créez data/tweets.json :

json
{"id": "t001", "text": "Just got my new laptop and I'm absolutely loving it! Best purchase of the year! #happy"}
{"id": "t002", "text": "Waited 2 hours for customer service and they still couldn't help me. Never shopping here again."}
{"id": "t003", "text": "The new coffee shop on Main Street opens tomorrow at 7am."}
{"id": "t004", "text": "This movie was okay I guess. Some good parts, some boring parts."}
{"id": "t005", "text": "Can't believe how beautiful the sunset was tonight! Nature is amazing."}

Exécuter la tâche

Démarrez le serveur d'annotation :

bash
potato start config.yaml

Accédez à http://localhost:8000 et connectez-vous pour commencer à annoter.

Comprendre l'interface

Zone d'annotation principale

L'interface affiche :

  1. Le texte à annoter (avec URLs, mentions et hashtags surlignés)
  2. Les boutons radio de sentiment avec infobulles
  3. L'échelle de Likert de confiance
  4. La zone de texte d'explication optionnelle

Flux de travail clavier

Pour une efficacité maximale :

  1. Lisez le texte
  2. Appuyez sur 1, 2 ou 3 pour le sentiment
  3. Cliquez sur le niveau de confiance (ou utilisez la souris)
  4. Appuyez sur Entrée pour soumettre

Suivi de la progression

L'interface affiche :

  • La progression actuelle (par ex. « 15 / 100 »)
  • Le temps restant estimé
  • Les statistiques de session

Format de sortie

Les annotations sont enregistrées dans annotations/username.jsonl :

json
{
  "id": "t001",
  "text": "Just got my new laptop and I'm absolutely loving it!...",
  "annotations": {
    "sentiment": "Positive",
    "confidence": 5,
    "explanation": "Clear expression of happiness with the purchase"
  },
  "annotator": "john_doe",
  "timestamp": "2026-01-15T14:30:00Z"
}

Ajouter le contrôle qualité

Vérifications d'attention

Ajoutez des items de référence pour vérifier l'attention des annotateurs :

yaml
quality_control:
  attention_checks:
    enabled: true
    frequency: 10  # Every 10th item
    items:
      - text: "I am extremely happy and satisfied! This is the best!"
        expected:
          sentiment: "Positive"
      - text: "This is absolutely terrible and I hate it completely."
        expected:
          sentiment: "Negative"

Accord inter-annotateurs

Pour les projets de recherche, activez les annotations multiples :

yaml
automatic_assignment:
  on: true
  sampling_strategy: random
  labels_per_instance: 3  # Each item annotated by 3 people
  instance_per_annotator: 50

Analyser les résultats

Exportez et analysez vos annotations :

python
import json
from collections import Counter
 
# Load annotations
annotations = []
with open('annotations/annotator1.jsonl') as f:
    for line in f:
        annotations.append(json.loads(line))
 
# Sentiment distribution
sentiments = Counter(a['annotations']['sentiment'] for a in annotations)
print(f"Sentiment distribution: {dict(sentiments)}")
 
# Average confidence
confidences = [a['annotations']['confidence'] for a in annotations]
print(f"Average confidence: {sum(confidences)/len(confidences):.2f}")

Prochaines étapes


Explorez plus de types d'annotation dans notre documentation.