قياس الأفضل والأسوأ
تعليق مقارن كفء بقياس الأفضل والأسوأ في Potato — يولّد ثلاثيات المقارنة تلقائيًّا ويحوّل الاختيارات إلى درجات جودة متصلة.
جديد في الإصدار 2.3.0
قياس الأفضل والأسوأ (BWS)، المعروف أيضًا باسم قياس أقصى فرق (MaxDiff)، طريقة تعليق مقارنة تُعرض فيها على المُعلّقين مجموعة من العناصر (أربعة عادةً) ويُطلب منهم اختيار العنصر الأفضل والعنصر الأسوأ وفق معيار ما. ينتج BWS درجات عددية موثوقة من أحكام ثنائية بسيطة، ويحتاج تعليقات أقل بكثير من مقاييس التقييم المباشر لبلوغ القوة الإحصائية نفسها.
يفيد BWS خصوصًا حين:
- تعاني التقييمات الرقمية المباشرة من تحيّز المُعلّقين (استخدام المقياس يتفاوت بين الأشخاص)
- تحتاج ترتيبًا موثوقًا لمئات أو آلاف العناصر
- يكون بُعد الجودة نسبيًّا بطبيعته (مثلًا "أي ترجمة أكثر سلاسة؟")
- تريد تعظيم المعلومات لكل تعليق (كل حكم BWS يوفّر بتّات أكثر من تقييم ليكرت)
واجهة قياس الأفضل والأسوأ للتعليق المقارن في Potato
الإعداد الأساسي
annotation_schemes:
- annotation_type: bws
name: fluency
description: "Select the BEST and WORST translation by fluency"
# Items to compare
# Tuple size (how many items shown at once)
tuple_size: 4 # typically 4; valid range is 3-8
# Labels for best/worst buttons
best_description: "Most Fluent"
worst_description: "Least Fluent"
# Display options
# Validation
label_requirement:
required: true # must select both best and worstصيغة البيانات
يجب أن يحتوي كل عنصر في ملف بياناتك على قائمة عناصر للمقارنة. ويولّد Potato الثلاثيات من هذه القائمة تلقائيًّا.
الخيار 1: كل العناصر في عنصر واحد
إذا كان لديك مجموعة واحدة من العناصر لترتيبها (مثلًا ترجمات جملة واحدة):
{
"id": "sent_001",
"source": "The cat sat on the mat.",
"translations": [
{"id": "sys_a", "text": "Le chat s'est assis sur le tapis."},
{"id": "sys_b", "text": "Le chat a assis sur le tapis."},
{"id": "sys_c", "text": "Le chat etait assis sur le mat."},
{"id": "sys_d", "text": "Le chat se tenait sur le tapis."}
]
}الخيار 2: مجموعات مولّدة مسبقًا
إذا أردت تحكمًا كاملًا في أي العناصر تظهر معًا، فوفّر مجموعات مولّدة مسبقًا:
{
"id": "tuple_001",
"translations": [
{"id": "sys_a", "text": "Le chat s'est assis sur le tapis."},
{"id": "sys_b", "text": "Le chat a assis sur le tapis."},
{"id": "sys_c", "text": "Le chat etait assis sur le mat."},
{"id": "sys_d", "text": "Le chat se tenait sur le tapis."}
]
}التوليد التلقائي للمجموعات
حين تكون قائمة عناصرك أطول من حجم المجموعة، يولّد Potato المجموعات تلقائيًّا. وتضمن خوارزمية التوليد:
- ظهور كل عنصر في العدد نفسه تقريبًا من المجموعات
- ظهور كل زوج من العناصر معًا في مجموعة واحدة على الأقل (لتسجيل نسبي موثوق)
- توازن المجموعات بحيث لا يظهر عنصر دائمًا أولًا أو أخيرًا
اضبط توليد المجموعات:
annotation_schemes:
- annotation_type: bws
name: fluency
tuple_size: 4لمجموعة من N عنصرًا بحجم مجموعة T وقيمة tuples_per_item تساوي K، يولّد Potato نحو N * K / T مجموعة إجمالًا.
طرائق التوليد
balanced_incomplete (الافتراضية): تستخدم تصميم كتل ناقصة متوازنة لتعظيم الكفاءة الإحصائية. يظهر كل عنصر بالتكرار نفسه، ويكون ظهور الأزواج معًا منتظمًا قدر الإمكان. موصى بها لمعظم حالات الاستخدام.
random: تأخذ عينات عشوائية من المجموعات مع الإعادة. أسرع لمجموعات العناصر الكبيرة جدًّا (N > 10,000) لكنها أقل كفاءة إحصائيًّا. استخدمها حين لا يكون التوازن الدقيق حاسمًا.
توليد المجموعات مسبقًا عبر سطر الأوامر
في المشاريع واسعة النطاق، ولّد المجموعات مقدّمًا:
python -m potato.bws generate-tuples \
--items data/items.jsonl \
--tuple-size 4 \
--tuples-per-item 5 \
--output data/tuples.jsonl \
--seed 42طرائق التسجيل
بعد التعليق، يحسب Potato درجات العناصر من أحكام BWS بثلاث طرائق.
1. العدّ (الافتراضية)
أبسط الطرائق. درجة كل عنصر هي نسبة المرات التي اختير فيها "الأفضل" ناقص نسبة المرات التي اختير فيها "الأسوأ":
Score(item) = (best_count - worst_count) / total_appearances
تتراوح الدرجات من -1.0 (الأسوأ دائمًا) إلى +1.0 (الأفضل دائمًا).
python -m potato.bws score \
--config config.yaml \
--method counting \
--output scores.csv2. برادلي-تيري
يلائم نموذج برادلي-تيري على المقارنات الزوجية التي تستلزمها أحكام BWS. فكل اختيار لـ"الأفضل" يستلزم تفضيل العنصر الأفضل على سائر عناصر المجموعة؛ وكل اختيار لـ"الأسوأ" يستلزم تفضيل سائر العناصر على الأسوأ.
ينتج برادلي-تيري درجات على مقياس لوغاريتم الأرجحية بخصائص إحصائية أفضل من العدّ، خصوصًا مع البيانات المتفرقة.
python -m potato.bws score \
--config config.yaml \
--method bradley_terry \
--max-iter 1000 \
--tolerance 1e-6 \
--output scores.csv3. بلاكيت-لوس
تعميم لبرادلي-تيري ينمذج الترتيب الكامل الذي يستلزمه حكم كل مجموعة (الأفضل > العناصر الوسطى > الأسوأ). ويستخلص بلاكيت-لوس معلومات من كل تعليق أكثر مما يستخلصه برادلي-تيري.
python -m potato.bws score \
--config config.yaml \
--method plackett_luce \
--output scores.csvمقارنة طرائق التسجيل
| الطريقة | السرعة | كفاءة البيانات | تتعامل مع البيانات المتفرقة | النموذج الإحصائي |
|---|---|---|---|---|
| العدّ | سريعة | منخفضة | نعم | لا يوجد (وصفية) |
| برادلي-تيري | متوسطة | متوسطة | متوسط | مقارنة زوجية |
| بلاكيت-لوس | أبطأ | عالية | متوسط | ترتيب كامل |
في معظم المشاريع، يكون برادلي-تيري أفضل خيار افتراضي. استخدم العدّ للتحليل الاستكشافي السريع وبلاكيت-لوس حين تحتاج أقصى كفاءة إحصائية من تعليقات محدودة.
إعداد التسجيل في YAML
يمكنك أيضًا ضبط التسجيل مباشرةً في إعدادات المشروع للحساب التلقائي:
annotation_schemes:
- annotation_type: bws
name: fluency
tuple_size: 4التكامل مع لوحة تحكم المشرف
تتضمن لوحة تحكم المشرف تبويبًا مخصصًا لـ BWS يعرض:
- توزيع الدرجات: مدرّج تكراري لدرجات العناصر الحالية
- تقدّم التعليق: كم مجموعة عُلّقت مقابل الإجمالي
- التغطية لكل عنصر: كم مرة شُوهد كل عنصر
- اتساق المُعلّقين: موثوقية التنصيف لدرجات BWS
- تقارب الدرجات: مخطط خطي يوضح كيف تستقر الدرجات كلما جُمعت تعليقات أكثر
اطّلع على تحليلات BWS من سطر الأوامر:
python -m potato.bws stats --config config.yamlBWS Statistics
==============
Schema: fluency
Items: 200
Tuples: 250 (annotated: 180 / 250)
Annotations: 540 (3 annotators)
Score Summary (Bradley-Terry):
Mean: 0.02
Std: 0.43
Range: -0.91 to +0.87
Top 5 Items:
sys_d: 0.87 (±0.08)
sys_a: 0.72 (±0.09)
sys_f: 0.65 (±0.10)
sys_b: 0.51 (±0.11)
sys_k: 0.48 (±0.09)
Split-Half Reliability: r = 0.94
أبعاد BWS المتعددة
يمكنك تشغيل عدة مخططات BWS على مجموعة العناصر نفسها لتقييم أبعاد جودة مختلفة:
annotation_schemes:
- annotation_type: bws
name: fluency
description: "Select BEST and WORST by fluency"
tuple_size: 4
best_description: "Most Fluent"
worst_description: "Least Fluent"
- annotation_type: bws
name: adequacy
description: "Select BEST and WORST by meaning preservation"
tuple_size: 4
best_description: "Most Accurate"
worst_description: "Least Accurate"يتشارك المخططان المجموعات نفسها (يولّد Potato مجموعة واحدة من الثلاثيات لكل items_key)، فيرى المُعلّقون كل مجموعة مرة واحدة لكنهم يقدّمون حكمين.
صيغة المخرجات
تُحفَظ تعليقات BWS لكل مجموعة على حدة:
{
"id": "tuple_001",
"annotations": {
"fluency": {
"best": "sys_d",
"worst": "sys_c"
},
"adequacy": {
"best": "sys_a",
"worst": "sys_c"
}
},
"annotator": "user_1",
"timestamp": "2026-03-01T14:22:00Z"
}مثال كامل
إعداد كامل لتقييم أنظمة الترجمة الآلية:
annotation_task_name: "MT System Ranking (BWS)"
task_dir: "."
data_files:
- "data/mt_tuples.jsonl"
item_properties:
id_key: id
text_key: source
instance_display:
fields:
- key: source
type: text
display_options:
label: "Source Sentence"
annotation_schemes:
- annotation_type: bws
name: overall_quality
description: "Select the BEST and WORST translation"
tuple_size: 4
best_description: "Best Translation"
worst_description: "Worst Translation"
output_annotation_dir: "output/"
export_annotation_format: "jsonl"قراءات إضافية
- المقارنة الزوجية -- مقارنة أبسط بين عنصرين
- مقاييس ليكرت -- بديل التقييم المباشر
- التقييم المتعدد -- تقييمات مباشرة متعددة الأبعاد
- صيغ التصدير -- صدّر بيانات BWS للتحليل
للاطلاع على تفاصيل التنفيذ، انظر التوثيق المصدري.