Skip to content
Guides7 min read

इंटर-एनोटेटर सहमति मापना

Potato एनोटेशन प्रोजेक्ट के लिए Cohen का kappa, Fleiss का kappa और Krippendorff का alpha निकालिए और उनका मतलब समझिए, Python कोड उदाहरणों और व्याख्या के दिशानिर्देशों के साथ।

Potato Team

इंटर-एनोटेटर सहमति (IAA) यह नापती है कि अलग-अलग एनोटेटर एक ही आइटम को कितनी एकरूपता से लेबल करते हैं। सहमति ऊँची हो तो लेबल पर भरोसा किया जा सकता है। कम हो तो वजह आम तौर पर या तो कोई अस्पष्ट दिशानिर्देश होती है, या ऐसा कार्य जो अपने स्वभाव से ही व्यक्तिपरक है।

सहमति का मेट्रिक चुनना: दो रेटर पर Cohen का kappa, कई रेटर पर Fleiss का kappa, ordinal या अनुपस्थित डेटा पर Krippendorff का alphaकौन सा सहमति मेट्रिक इस्तेमाल करें

सहमति क्यों मापें?

इसके कुछ ठोस कारण हैं। कम सहमति आम तौर पर उन निर्देशों की ओर लौटाती है जिन्हें दोबारा लिखने की ज़रूरत है, यानी यह संख्या आपके दिशानिर्देशों की जाँच का भी काम करती है। यह यह भी बताती है कि कार्य असल में कितना कठिन है, क्योंकि कुछ सवालों का कोई एक सही जवाब होता ही नहीं। किन एनोटेटरों को और प्रशिक्षण चाहिए, यह भी पकड़ में आ जाता है। और अगर आप प्रकाशित कर रहे हैं तो समीक्षक सहमति का आँकड़ा माँगेंगे ही। आख़िर में, यह मेट्रिक तय करने में मदद करता है कि कई एनोटेटरों को एक लेबल में कैसे मिलाया जाए।

Potato इसे शुरू से आख़िर तक कैसे सँभालता है, इसके लिए स्रोत दस्तावेज़ देखें।

सहमति के मेट्रिक

Cohen का kappa (2 एनोटेटर)

श्रेणीबद्ध डेटा पर दो एनोटेटरों की तुलना के लिए:

text
κ = (Po - Pe) / (1 - Pe)

जहाँ:

  • Po = देखी गई सहमति
  • Pe = संयोग से अपेक्षित सहमति

व्याख्या:

Kappaव्याख्या
< 0संयोग से भी कम
0.01-0.20नाममात्र
0.21-0.40ठीक-ठाक
0.41-0.60मध्यम
0.61-0.80पर्याप्त
0.81-1.00लगभग पूर्ण

Fleiss का kappa (3+ एनोटेटर)

श्रेणीबद्ध डेटा पर तीन या उससे ज़्यादा एनोटेटरों के लिए:

yaml
quality_control:
  agreement:
    metrics:
      - fleiss_kappa

व्याख्या का पैमाना Cohen के kappa जैसा ही है।

Krippendorff का alpha

तीनों में सबसे लचीला यही है। यह किसी भी संख्या में एनोटेटरों के साथ चलता है, अनुपस्थित डेटा संभाल लेता है, और nominal, ordinal, interval तथा ratio डेटा पर काम करता है।

yaml
quality_control:
  agreement:
    metrics:
      - krippendorff_alpha
    alpha_level: nominal  # or ordinal, interval, ratio

व्याख्या:

  • α ≥ 0.80: भरोसेमंद
  • 0.67 ≤ α < 0.80: अस्थायी तौर पर स्वीकार्य
  • α < 0.67: भरोसे लायक नहीं

Potato में सहमति कॉन्फ़िगर करना

बुनियादी सेटअप

yaml
quality_control:
  agreement:
    enabled: true
    calculate_on_overlap: true
 
    metrics:
      - cohens_kappa
      - fleiss_kappa
      - krippendorff_alpha
 
    # Per annotation scheme
    per_scheme: true
 
    # Reporting
    report_interval: 100  # Every 100 annotations
    export_file: agreement_report.json

Overlap का कॉन्फ़िगरेशन

yaml
quality_control:
  redundancy:
    # How many annotators per item
    annotations_per_item: 3
 
    # Minimum overlap for calculations
    min_overlap_for_agreement: 2
 
    # Sampling for agreement
    agreement_sample_size: 100  # Calculate on 100 items
    agreement_sample_method: random  # or stratified, all

सहमति निकालना

डैशबोर्ड में

Potato एडमिन डैशबोर्ड में सहमति के मेट्रिक दिखाता है:

yaml
quality_control:
  dashboard:
    show_agreement: true
    agreement_chart: true
    update_frequency: 60  # seconds

API से

bash
# Get current agreement metrics
curl http://localhost:8000/api/quality/agreement
 
# Response:
{
  "overall": {
    "fleiss_kappa": 0.72,
    "krippendorff_alpha": 0.75
  },
  "per_scheme": {
    "sentiment": {
      "fleiss_kappa": 0.78,
      "krippendorff_alpha": 0.80
    },
    "topic": {
      "fleiss_kappa": 0.65,
      "krippendorff_alpha": 0.68
    }
  },
  "sample_size": 150,
  "annotator_pairs": 10
}

CLI से

bash
# Calculate agreement from output files
potato agreement --annotations annotation_output/ --output agreement_report.json
 
# With specific metric
potato agreement --annotations annotation_output/ --metric krippendorff --level ordinal

अलग-अलग एनोटेशन प्रकारों पर सहमति

श्रेणीबद्ध (Radio, Multiselect)

yaml
quality_control:
  agreement:
    schemes:
      sentiment:
        type: nominal
        metrics: [cohens_kappa, fleiss_kappa]
 
      urgency:
        type: ordinal  # Low < Medium < High
        metrics: [krippendorff_alpha]

Likert पैमाने

yaml
quality_control:
  agreement:
    schemes:
      quality_rating:
        type: ordinal
        metrics: [krippendorff_alpha, weighted_kappa]
 
        # Weighted kappa for ordinal
        weighting: linear  # or quadratic

Span एनोटेशन

श्रेणीबद्ध लेबल के मुक़ाबले span ज़्यादा पेचीदा हैं, क्योंकि दो एनोटेटर लेबल पर सहमत होकर भी इस बात पर असहमत हो सकते हैं कि वह ठीक कहाँ शुरू और कहाँ ख़त्म होता है। NER के लिए अलग इंतज़ाम चाहिए:

yaml
quality_control:
  agreement:
    schemes:
      entities:
        type: span
        span_matching: overlap  # or exact, token
 
        # What to compare
        compare: label_and_span  # or label_only, span_only
 
        # Overlap threshold for "match"
        overlap_threshold: 0.5
 
        metrics:
          - span_f1
          - span_precision
          - span_recall

रैंकिंग

yaml
quality_control:
  agreement:
    schemes:
      preference_rank:
        type: ranking
        metrics:
          - kendall_tau
          - spearman_rho

Pairwise बनाम कुल सहमति

Pairwise (हर जोड़े पर)

yaml
quality_control:
  agreement:
    pairwise: true
    output_matrix: true  # Agreement matrix
 
# Output:
# annotator1 × annotator2: κ = 0.75
# annotator1 × annotator3: κ = 0.68
# annotator2 × annotator3: κ = 0.82

कुल (सभी एनोटेटर)

yaml
quality_control:
  agreement:
    overall: true
    metrics:
      - fleiss_kappa  # Designed for 3+ annotators
      - krippendorff_alpha

कम सहमति से निपटना

दिक़्क़त वाली जगहें पहचानिए

yaml
quality_control:
  agreement:
    diagnostics:
      enabled: true
 
      # Items with most disagreement
      show_disagreed_items: true
      disagreement_threshold: 0.5
 
      # Labels with most confusion
      confusion_matrix: true
 
      # Annotators with low agreement
      per_annotator_agreement: true

कम सहमति पर क्या करें

yaml
quality_control:
  agreement:
    alerts:
      - threshold: 0.6
        action: notify
        message: "Agreement below 0.6 - review guidelines"
 
      - threshold: 0.4
        action: pause
        message: "Agreement critically low - pausing task"
 
    # Automatic guideline reminders
    show_guidelines_on_low_agreement: true
    guideline_threshold: 0.5

पूरा कॉन्फ़िगरेशन

yaml
annotation_task_name: "Agreement-Tracked Annotation"
 
quality_control:
  # Redundancy setup
  redundancy:
    annotations_per_item: 3
    assignment_method: random
 
  # Agreement calculation
  agreement:
    enabled: true
 
    # Metrics
    metrics:
      - fleiss_kappa
      - krippendorff_alpha
 
    # Per-scheme configuration
    schemes:
      sentiment:
        type: nominal
        metrics: [fleiss_kappa, cohens_kappa]
 
      intensity:
        type: ordinal
        metrics: [krippendorff_alpha]
        alpha_level: ordinal
 
      entities:
        type: span
        span_matching: overlap
        overlap_threshold: 0.5
        metrics: [span_f1]
 
    # Calculation settings
    calculate_on_overlap: true
    min_overlap: 2
    sample_size: all  # or number
 
    # Pairwise analysis
    pairwise: true
    pairwise_output: agreement_matrix.csv
 
    # Diagnostics
    diagnostics:
      confusion_matrix: true
      disagreed_items: true
      per_annotator: true
 
    # Alerts
    alerts:
      - metric: fleiss_kappa
        threshold: 0.6
        action: notify
 
    # Reporting
    report_file: agreement_report.json
    report_interval: 50
 
  # Dashboard
  dashboard:
    show_agreement: true
    charts:
      - agreement_over_time
      - per_scheme_agreement
      - annotator_comparison

आउटपुट रिपोर्ट

json
{
  "timestamp": "2024-10-25T15:30:00Z",
  "sample_size": 500,
  "annotators": ["ann1", "ann2", "ann3"],
 
  "overall_agreement": {
    "fleiss_kappa": 0.72,
    "krippendorff_alpha": 0.75
  },
 
  "per_scheme": {
    "sentiment": {
      "fleiss_kappa": 0.78,
      "confusion_matrix": {
        "Positive": {"Positive": 180, "Negative": 5, "Neutral": 15},
        "Negative": {"Positive": 8, "Negative": 165, "Neutral": 12},
        "Neutral": {"Positive": 12, "Negative": 10, "Neutral": 93}
      }
    }
  },
 
  "pairwise": {
    "ann1_ann2": 0.75,
    "ann1_ann3": 0.70,
    "ann2_ann3": 0.72
  },
 
  "per_annotator": {
    "ann1": {"avg_agreement": 0.73, "items_annotated": 500},
    "ann2": {"avg_agreement": 0.74, "items_annotated": 500},
    "ann3": {"avg_agreement": 0.71, "items_annotated": 500}
  },
 
  "most_disagreed_items": [
    {"id": "item_234", "disagreement_rate": 1.0},
    {"id": "item_567", "disagreement_rate": 0.67}
  ]
}

कुछ अच्छी आदतें

सहमति प्रोजेक्ट के अंत का इंतज़ार किए बिना शुरू में ही निकाल लीजिए, क्योंकि तब तक दिशानिर्देश सुधारने का वक़्त निकल चुका होता है। वही मेट्रिक चुनिए जो आपके डेटा पर बैठता हो: nominal, ordinal या span। सहमति कम निकले तो एनोटेटरों पर दोष डालने से पहले भीतर झाँकिए, क्योंकि गड़बड़ी अक्सर निर्देशों में होती है। प्रकाशन में यह आँकड़ा ज़रूर दीजिए। और स्वीकार्य सीमा शुरू करने से पहले तय कीजिए, नतीजा देख लेने के बाद नहीं।

एनोटेटरों के असहमत होने पर उनकी दक्षता का अनुमान लगाने के बारे में और पढ़ने के लिए MACE दस्तावेज़ देखें।

अगले क़दम


सहमति का पूरा दस्तावेज़ उपयोगकर्ता प्रबंधन पर है।