इंटर-एनोटेटर सहमति मापना
Potato एनोटेशन प्रोजेक्ट के लिए Cohen का kappa, Fleiss का kappa और Krippendorff का alpha निकालिए और उनका मतलब समझिए, Python कोड उदाहरणों और व्याख्या के दिशानिर्देशों के साथ।
इंटर-एनोटेटर सहमति (IAA) यह नापती है कि अलग-अलग एनोटेटर एक ही आइटम को कितनी एकरूपता से लेबल करते हैं। सहमति ऊँची हो तो लेबल पर भरोसा किया जा सकता है। कम हो तो वजह आम तौर पर या तो कोई अस्पष्ट दिशानिर्देश होती है, या ऐसा कार्य जो अपने स्वभाव से ही व्यक्तिपरक है।
कौन सा सहमति मेट्रिक इस्तेमाल करें
सहमति क्यों मापें?
इसके कुछ ठोस कारण हैं। कम सहमति आम तौर पर उन निर्देशों की ओर लौटाती है जिन्हें दोबारा लिखने की ज़रूरत है, यानी यह संख्या आपके दिशानिर्देशों की जाँच का भी काम करती है। यह यह भी बताती है कि कार्य असल में कितना कठिन है, क्योंकि कुछ सवालों का कोई एक सही जवाब होता ही नहीं। किन एनोटेटरों को और प्रशिक्षण चाहिए, यह भी पकड़ में आ जाता है। और अगर आप प्रकाशित कर रहे हैं तो समीक्षक सहमति का आँकड़ा माँगेंगे ही। आख़िर में, यह मेट्रिक तय करने में मदद करता है कि कई एनोटेटरों को एक लेबल में कैसे मिलाया जाए।
Potato इसे शुरू से आख़िर तक कैसे सँभालता है, इसके लिए स्रोत दस्तावेज़ देखें।
सहमति के मेट्रिक
Cohen का kappa (2 एनोटेटर)
श्रेणीबद्ध डेटा पर दो एनोटेटरों की तुलना के लिए:
κ = (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+ एनोटेटर)
श्रेणीबद्ध डेटा पर तीन या उससे ज़्यादा एनोटेटरों के लिए:
quality_control:
agreement:
metrics:
- fleiss_kappaव्याख्या का पैमाना Cohen के kappa जैसा ही है।
Krippendorff का alpha
तीनों में सबसे लचीला यही है। यह किसी भी संख्या में एनोटेटरों के साथ चलता है, अनुपस्थित डेटा संभाल लेता है, और nominal, ordinal, interval तथा ratio डेटा पर काम करता है।
quality_control:
agreement:
metrics:
- krippendorff_alpha
alpha_level: nominal # or ordinal, interval, ratioव्याख्या:
- α ≥ 0.80: भरोसेमंद
- 0.67 ≤ α < 0.80: अस्थायी तौर पर स्वीकार्य
- α < 0.67: भरोसे लायक नहीं
Potato में सहमति कॉन्फ़िगर करना
बुनियादी सेटअप
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.jsonOverlap का कॉन्फ़िगरेशन
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 एडमिन डैशबोर्ड में सहमति के मेट्रिक दिखाता है:
quality_control:
dashboard:
show_agreement: true
agreement_chart: true
update_frequency: 60 # secondsAPI से
# 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 से
# 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)
quality_control:
agreement:
schemes:
sentiment:
type: nominal
metrics: [cohens_kappa, fleiss_kappa]
urgency:
type: ordinal # Low < Medium < High
metrics: [krippendorff_alpha]Likert पैमाने
quality_control:
agreement:
schemes:
quality_rating:
type: ordinal
metrics: [krippendorff_alpha, weighted_kappa]
# Weighted kappa for ordinal
weighting: linear # or quadraticSpan एनोटेशन
श्रेणीबद्ध लेबल के मुक़ाबले span ज़्यादा पेचीदा हैं, क्योंकि दो एनोटेटर लेबल पर सहमत होकर भी इस बात पर असहमत हो सकते हैं कि वह ठीक कहाँ शुरू और कहाँ ख़त्म होता है। NER के लिए अलग इंतज़ाम चाहिए:
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रैंकिंग
quality_control:
agreement:
schemes:
preference_rank:
type: ranking
metrics:
- kendall_tau
- spearman_rhoPairwise बनाम कुल सहमति
Pairwise (हर जोड़े पर)
quality_control:
agreement:
pairwise: true
output_matrix: true # Agreement matrix
# Output:
# annotator1 × annotator2: κ = 0.75
# annotator1 × annotator3: κ = 0.68
# annotator2 × annotator3: κ = 0.82कुल (सभी एनोटेटर)
quality_control:
agreement:
overall: true
metrics:
- fleiss_kappa # Designed for 3+ annotators
- krippendorff_alphaकम सहमति से निपटना
दिक़्क़त वाली जगहें पहचानिए
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कम सहमति पर क्या करें
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पूरा कॉन्फ़िगरेशन
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आउटपुट रिपोर्ट
{
"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 दस्तावेज़ देखें।
अगले क़दम
- गुणवत्ता नियंत्रण से सहमति सुधारिए
- कैलिब्रेशन के लिए प्रशिक्षण चरण जोड़िए
- सहमति की जानकारी के साथ डेटा एक्सपोर्ट करना सीखिए
सहमति का पूरा दस्तावेज़ उपयोगकर्ता प्रबंधन पर है।