Skip to content
Guides8 min read

Contrôle qualité pour l'annotation crowdsourcée

Bonnes pratiques pour assurer la qualité des annotations dans les projets d'annotation, incluant des stratégies pratiques que vous pouvez mettre en œuvre avec et au-delà de Potato.

Potato Team·

Contrôle qualité pour l'annotation crowdsourcée

Le contrôle qualité sépare les annotations utiles du bruit. Ce guide couvre les stratégies éprouvées pour assurer des données de haute qualité dans les projets d'annotation crowdsourcés et internes.

Aperçu du contrôle qualité

Un contrôle qualité efficace combine plusieurs stratégies :

  1. Vérifications d'attention : vérifier que les annotateurs sont engagés dans la tâche
  2. Redondance : collecter plusieurs annotations par item
  3. Métriques d'accord : mesurer la cohérence entre les annotateurs
  4. Formation et directives : s'assurer que les annotateurs comprennent la tâche
  5. Révision manuelle : échantillonner et vérifier la qualité des annotations

Vérifications d'attention via Surveyflow

Potato supporte les vérifications d'attention basiques via le système surveyflow. Vous pouvez insérer des pages d'enquête entre les lots d'annotation qui demandent aux annotateurs de confirmer qu'ils sont attentifs.

yaml
annotation_task_name: "Sentiment Annotation with Checks"
 
surveyflow:
  on: true
  order:
    - survey_instructions
    - annotation
    - survey_attention_check
    - annotation
    - survey_completion

Définissez les questions de vérification d'attention comme une page d'enquête :

yaml
# In your surveyflow survey definitions
survey_attention_check:
  - question: "To confirm you're paying attention, please select 'Strongly Agree'."
    type: radio
    options:
      - Strongly Disagree
      - Disagree
      - Neutral
      - Agree
      - Strongly Agree

Notez que le support intégré de vérification d'attention de Potato est limité. Pour des vérifications d'attention plus sophistiquées (détection automatique des échecs, exclusion des annotateurs, etc.), vous devrez implémenter des scripts de post-traitement ou utiliser les fonctionnalités de qualité intégrées de votre plateforme de crowdsourcing.

Redondance : annotations multiples par item

Collecter plusieurs annotations par item est l'une des méthodes de contrôle qualité les plus fiables. Configurez cela dans votre configuration de données :

yaml
annotation_task_name: "Multi-Annotator Sentiment Task"
 
data_files:
  - path: data.json
    list_as_text: false
    sampling: random
 
# Control how many annotators see each item through assignment logic
# This is typically managed through your annotator assignment system

Lors de l'utilisation de plateformes de crowdsourcing comme Prolific, vous pouvez :

  • Publier le même HIT plusieurs fois pour obtenir des annotations redondantes
  • Utiliser différents lots de travailleurs pour les mêmes données
  • Implémenter une logique d'attribution personnalisée dans votre pipeline de données

Mesurer l'accord inter-annotateurs

Bien que Potato ne calcule pas automatiquement les métriques d'accord pendant l'annotation, vous devriez les calculer lors du post-traitement. Les métriques courantes incluent :

Kappa de Cohen (deux annotateurs)

Pour les annotations catégorielles avec deux annotateurs :

python
from sklearn.metrics import cohen_kappa_score
 
# After collecting annotations
annotator1_labels = ["Positive", "Negative", "Positive", ...]
annotator2_labels = ["Positive", "Negative", "Neutral", ...]
 
kappa = cohen_kappa_score(annotator1_labels, annotator2_labels)
print(f"Cohen's Kappa: {kappa:.3f}")

Kappa de Fleiss (annotateurs multiples)

Pour trois annotateurs ou plus :

python
from statsmodels.stats.inter_rater import fleiss_kappa
import numpy as np
 
# Build a matrix of label counts per item
# Each row is an item, each column is a label category
ratings_matrix = np.array([
    [3, 0, 0],  # Item 1: 3 Positive, 0 Negative, 0 Neutral
    [2, 1, 0],  # Item 2: 2 Positive, 1 Negative, 0 Neutral
    [0, 0, 3],  # Item 3: 0 Positive, 0 Negative, 3 Neutral
    ...
])
 
kappa = fleiss_kappa(ratings_matrix)
print(f"Fleiss' Kappa: {kappa:.3f}")

Directives d'interprétation

Valeur KappaInterprétation
< 0.20Accord faible
0.21 - 0.40Accord passable
0.41 - 0.60Accord modéré
0.61 - 0.80Accord substantiel
0.81 - 1.00Accord quasi parfait

Items de référence (Gold Standard)

Les items de référence sont des items pré-étiquetés avec des réponses correctes connues que vous mélangez dans vos données d'annotation. Cela aide à identifier les annotateurs qui pourraient deviner ou ne pas être attentifs.

Créer des items de référence

  1. Créez un ensemble d'items avec des réponses correctes claires et sans ambiguïté
  2. Faites étiqueter ces items par des experts
  3. Mélangez-les dans vos données d'annotation régulières
json
[
  {
    "id": "gold_001",
    "text": "I absolutely love this product! Best purchase ever!",
    "is_gold": true,
    "gold_label": "Positive"
  },
  {
    "id": "gold_002",
    "text": "This is terrible. Complete waste of money. Worst experience.",
    "is_gold": true,
    "gold_label": "Negative"
  },
  {
    "id": "regular_001",
    "text": "The product arrived on time and works as expected.",
    "is_gold": false
  }
]

Analyser la performance sur les items de référence

Après la collecte, analysez la performance de chaque annotateur sur les items de référence :

python
import json
 
def calculate_gold_accuracy(annotations_file, gold_labels):
    with open(annotations_file) as f:
        annotations = json.load(f)
 
    annotator_scores = {}
 
    for item_id, item_annotations in annotations.items():
        if item_id in gold_labels:
            expected = gold_labels[item_id]
            for annotator, label in item_annotations.items():
                if annotator not in annotator_scores:
                    annotator_scores[annotator] = {'correct': 0, 'total': 0}
                annotator_scores[annotator]['total'] += 1
                if label == expected:
                    annotator_scores[annotator]['correct'] += 1
 
    for annotator, scores in annotator_scores.items():
        accuracy = scores['correct'] / scores['total']
        print(f"{annotator}: {accuracy:.1%} gold accuracy")
 
    return annotator_scores

Indicateurs de qualité basés sur le temps

Potato suit le chronométrage des annotations dans les fichiers de sortie. Utilisez ces données pour signaler les annotations potentiellement de faible qualité :

Analyser les données de chronométrage

python
import json
from statistics import mean, stdev
 
def analyze_timing(annotations_file):
    with open(annotations_file) as f:
        data = json.load(f)
 
    times = []
    for item in data.values():
        if 'time_spent' in item:
            times.append(item['time_spent'])
 
    avg_time = mean(times)
    std_time = stdev(times)
 
    # Flag annotations that are too fast (< 2 std below mean)
    threshold = max(avg_time - 2 * std_time, 2)  # At least 2 seconds
 
    flagged = [t for t in times if t < threshold]
    print(f"Average time: {avg_time:.1f}s")
    print(f"Flagged as too fast: {len(flagged)} items")

Contrôle qualité au niveau de la plateforme

Lors de l'utilisation de plateformes de crowdsourcing, exploitez leurs fonctionnalités de qualité intégrées :

Prolific

  • Utilisez les filtres de pré-sélection (taux d'approbation, études précédentes)
  • Définissez des exigences de temps de complétion minimum
  • Utilisez des questions de vérification d'attention dans votre pré-enquête
  • Vérifiez les soumissions avant d'approuver le paiement

MTurk

  • Exigez un taux d'approbation HIT minimum (>95%)
  • Utilisez des tests de qualification
  • Configurez l'approbation/le rejet automatique selon des critères
  • Bloquez les travailleurs qui échouent aux contrôles qualité

Vérifications qualité en post-traitement

Implémentez des vérifications automatisées sur les données collectées :

python
def quality_check_annotations(annotations_file):
    with open(annotations_file) as f:
        data = json.load(f)
 
    issues = []
 
    for annotator_id, items in group_by_annotator(data).items():
        labels = [item['label'] for item in items]
 
        # Check for single-label bias (always selecting same option)
        unique_labels = set(labels)
        if len(unique_labels) == 1 and len(labels) > 10:
            issues.append(f"{annotator_id}: Only used label '{labels[0]}'")
 
        # Check for position bias (always selecting first option)
        # Requires knowing option order in your schema
 
        # Check for very fast submissions
        times = [item.get('time_spent', 0) for item in items]
        avg_time = sum(times) / len(times) if times else 0
        if avg_time < 3:
            issues.append(f"{annotator_id}: Average time only {avg_time:.1f}s")
 
    return issues

Bonnes pratiques

  1. Commencez par la formation : utilisez la phase de formation de Potato pour intégrer les annotateurs avant le début de l'annotation réelle

  2. Rédigez des directives claires : des directives ambiguës conduisent à un désaccord qui ne concerne pas la qualité de l'annotateur

  3. Pilote d'abord : lancez un petit pilote pour identifier les problèmes avant le déploiement complet

  4. Mélangez les types de vérification : combinez vérifications d'attention, standards de référence et redondance

  5. Calibrez les seuils : commencez avec des seuils de qualité indulgents et resserrez en fonction des données observées

  6. Fournissez des retours : quand c'est possible, donnez aux annotateurs des retours pour les aider à s'améliorer

  7. Surveillez en continu : la qualité peut dériver avec le temps à mesure que les annotateurs se fatiguent

  8. Documentez les décisions : enregistrez comment vous gérez les cas limites et les problèmes de qualité

Résumé

Le contrôle qualité pour l'annotation nécessite une approche multicouche :

StratégieMise en œuvreQuand vérifier
Vérifications d'attentionEnquêtes SurveyflowPendant l'annotation
Standards de référenceMélangés dans les donnéesAprès collecte
RedondanceAnnotateurs multiples par itemAprès collecte
Métriques d'accordScripts PythonAprès collecte
Analyse de chronométrageHorodatages des annotationsAprès collecte
Fonctionnalités de plateformeParamètres Prolific/MTurkAvant/pendant la collecte

La plupart des analyses de contrôle qualité se font après la collecte des données via des scripts de post-traitement. Planifiez votre pipeline d'analyse avant de collecter les données pour vous assurer de capturer les informations dont vous avez besoin.

Prochaines étapes


Pour en savoir plus sur les flux de travail d'annotation, voir la documentation des schémas d'annotation.