Skip to content

قياس الأفضل والأسوأ

تعليق مقارن كفء بقياس الأفضل والأسوأ في Potato — يولّد ثلاثيات المقارنة تلقائيًّا ويحوّل الاختيارات إلى درجات جودة متصلة.

جديد في الإصدار 2.3.0

قياس الأفضل والأسوأ (BWS)، المعروف أيضًا باسم قياس أقصى فرق (MaxDiff)، طريقة تعليق مقارنة تُعرض فيها على المُعلّقين مجموعة من العناصر (أربعة عادةً) ويُطلب منهم اختيار العنصر الأفضل والعنصر الأسوأ وفق معيار ما. ينتج BWS درجات عددية موثوقة من أحكام ثنائية بسيطة، ويحتاج تعليقات أقل بكثير من مقاييس التقييم المباشر لبلوغ القوة الإحصائية نفسها.

يفيد BWS خصوصًا حين:

  • تعاني التقييمات الرقمية المباشرة من تحيّز المُعلّقين (استخدام المقياس يتفاوت بين الأشخاص)
  • تحتاج ترتيبًا موثوقًا لمئات أو آلاف العناصر
  • يكون بُعد الجودة نسبيًّا بطبيعته (مثلًا "أي ترجمة أكثر سلاسة؟")
  • تريد تعظيم المعلومات لكل تعليق (كل حكم BWS يوفّر بتّات أكثر من تقييم ليكرت)

واجهة التعليق بقياس الأفضل والأسوأواجهة قياس الأفضل والأسوأ للتعليق المقارن في Potato

الإعداد الأساسي

yaml
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: كل العناصر في عنصر واحد

إذا كان لديك مجموعة واحدة من العناصر لترتيبها (مثلًا ترجمات جملة واحدة):

json
{
  "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: مجموعات مولّدة مسبقًا

إذا أردت تحكمًا كاملًا في أي العناصر تظهر معًا، فوفّر مجموعات مولّدة مسبقًا:

json
{
  "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 المجموعات تلقائيًّا. وتضمن خوارزمية التوليد:

  • ظهور كل عنصر في العدد نفسه تقريبًا من المجموعات
  • ظهور كل زوج من العناصر معًا في مجموعة واحدة على الأقل (لتسجيل نسبي موثوق)
  • توازن المجموعات بحيث لا يظهر عنصر دائمًا أولًا أو أخيرًا

اضبط توليد المجموعات:

yaml
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) لكنها أقل كفاءة إحصائيًّا. استخدمها حين لا يكون التوازن الدقيق حاسمًا.

توليد المجموعات مسبقًا عبر سطر الأوامر

في المشاريع واسعة النطاق، ولّد المجموعات مقدّمًا:

bash
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 (الأفضل دائمًا).

bash
python -m potato.bws score \
  --config config.yaml \
  --method counting \
  --output scores.csv

2. برادلي-تيري

يلائم نموذج برادلي-تيري على المقارنات الزوجية التي تستلزمها أحكام BWS. فكل اختيار لـ"الأفضل" يستلزم تفضيل العنصر الأفضل على سائر عناصر المجموعة؛ وكل اختيار لـ"الأسوأ" يستلزم تفضيل سائر العناصر على الأسوأ.

ينتج برادلي-تيري درجات على مقياس لوغاريتم الأرجحية بخصائص إحصائية أفضل من العدّ، خصوصًا مع البيانات المتفرقة.

bash
python -m potato.bws score \
  --config config.yaml \
  --method bradley_terry \
  --max-iter 1000 \
  --tolerance 1e-6 \
  --output scores.csv

3. بلاكيت-لوس

تعميم لبرادلي-تيري ينمذج الترتيب الكامل الذي يستلزمه حكم كل مجموعة (الأفضل > العناصر الوسطى > الأسوأ). ويستخلص بلاكيت-لوس معلومات من كل تعليق أكثر مما يستخلصه برادلي-تيري.

bash
python -m potato.bws score \
  --config config.yaml \
  --method plackett_luce \
  --output scores.csv

مقارنة طرائق التسجيل

الطريقةالسرعةكفاءة البياناتتتعامل مع البيانات المتفرقةالنموذج الإحصائي
العدّسريعةمنخفضةنعملا يوجد (وصفية)
برادلي-تيريمتوسطةمتوسطةمتوسطمقارنة زوجية
بلاكيت-لوسأبطأعاليةمتوسطترتيب كامل

في معظم المشاريع، يكون برادلي-تيري أفضل خيار افتراضي. استخدم العدّ للتحليل الاستكشافي السريع وبلاكيت-لوس حين تحتاج أقصى كفاءة إحصائية من تعليقات محدودة.

إعداد التسجيل في YAML

يمكنك أيضًا ضبط التسجيل مباشرةً في إعدادات المشروع للحساب التلقائي:

yaml
annotation_schemes:
  - annotation_type: bws
    name: fluency
    tuple_size: 4

التكامل مع لوحة تحكم المشرف

تتضمن لوحة تحكم المشرف تبويبًا مخصصًا لـ BWS يعرض:

  • توزيع الدرجات: مدرّج تكراري لدرجات العناصر الحالية
  • تقدّم التعليق: كم مجموعة عُلّقت مقابل الإجمالي
  • التغطية لكل عنصر: كم مرة شُوهد كل عنصر
  • اتساق المُعلّقين: موثوقية التنصيف لدرجات BWS
  • تقارب الدرجات: مخطط خطي يوضح كيف تستقر الدرجات كلما جُمعت تعليقات أكثر

اطّلع على تحليلات BWS من سطر الأوامر:

bash
python -m potato.bws stats --config config.yaml
text
BWS 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 على مجموعة العناصر نفسها لتقييم أبعاد جودة مختلفة:

yaml
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 لكل مجموعة على حدة:

json
{
  "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"
}

مثال كامل

إعداد كامل لتقييم أنظمة الترجمة الآلية:

yaml
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"

قراءات إضافية

للاطلاع على تفاصيل التنفيذ، انظر التوثيق المصدري.