Structural Diff APIحالات الـ diff

حالات الـ diff

مثال إدخال/إخراج واحد لكل حالة. بدون غموض.

يُسنِد المحرك حالة واحدة بالضبط لكل صف أصلي بعد المحاذاة بـ 8 مراحل. SPLIT وMERGED هما الحالتان الوحيدتان اللتان تُعطيان صفاً واحداً يُقابل عدة صفوف مخرجة (أو العكس). تُظهر هذه الصفحة الحمولة الأدنى التي تُطلق كل حالة بشكل موثوق، وبنية الاستجابة المتوقعة، وسياق سير العمل.

ملاحظة على خط أنابيب المحرك

تعالج خوارزمية الـ 8 مراحل كل صف أصلي مقابل كل صف مُعاد وتُسنِد أفضل حالة بناءً على التشابه النصي وقرب الطوابع الزمنية والتحقق الهيكلي. تُشغَّل المراحل بالترتيب: تطابق دقيق → تشابه عالٍ → كشف تقسيم → كشف دمج → تطابقات ضعيفة → الصفوف الباقية.

عند تكرار النتائج لبناء ملخص عدد، تخطَّ الصفوف حيث يحتوي notes على "Source row". هذه عبوات MERGED (واحدة لكل أصل ممتص) ولا يجب عدّها مرتين.
UNCHANGED

UNCHANGED

تحتوي كلا النسختين على صف بمحتوى متطابق عبر جميع الأعمدة المُعيَّنة (بعد تطبيع المسافات).

Original

  "original": [{ "speaker": "Alice", "transcript": "Good morning everyone." }],

Reworked

  "reworked": [{ "speaker": "Alice", "transcript": "Good morning everyone." }]

API Result

json
{
  "status": "UNCHANGED",
  "notes": "exact match",
  "snapData": ["Alice", "Good morning everyone."],
  "currData": ["Alice", "Good morning everyone."]
}
json
{
  "original": [{ "speaker": "Alice", "transcript": "Good morning everyone." }],
  "reworked": [{ "speaker": "Alice", "transcript": "Good morning everyone." }]
}
json
{
  "status": "UNCHANGED",
  "notes": "exact match",
  "snapData": ["Alice", "Good morning everyone."],
  "currData": ["Alice", "Good morning everyone."]
}

When you see this

كل صف قبله المُدقِّق دون أي تغيير. يمثل عادةً 20–60% من الصفوف حسب مستوى التحرير.

Request note

النص ومحتوى جميع الأعمدة المُعيَّنة يجب أن يكون متطابقاً. الحالة والترقيم مهمان.

Response note

كلٌّ من snapData وcurrData موجودان ومتطابقان. حقل notes يساوي "exact match" أو "high similarity match".

Workflow context

معدل UNCHANGED مرتفع جداً (>90%) قد يُشير إلى أن المُدقِّق لم يراجع النص بشكل كامل. معدل منخفض جداً (<10%) قد يُشير إلى جودة ضعيفة للنموذج أو تحرير مبالغ فيه.

MODIFIED

MODIFIED

طابق المحرك صفاً من الأصل بصف في reworked، لكن قيمة عمود واحدة على الأقل تغيرت.

Transcript diff example

Original

[{ "speaker": "Doctor", "transcript": "I've been having headaches for the past two weeks" }]

Reworked

[{ "speaker": "Doctor", "transcript": "I've been having headaches for the past 2 weeks" }]

API Result

json
{
  "status": "MODIFIED",
  "notes": "transcript changed",
  "transcriptDiff": [
    { "type": "equal",  "value": "I've been having headaches for the past " },
    { "type": "delete", "value": "two weeks" },
    { "type": "insert", "value": "2 weeks" }
  ],
  "snapData": ["Doctor", "I've been having headaches for the past two weeks"],
  "currData": ["Doctor", "I've been having headaches for the past 2 weeks"]
}

Live transcriptDiff rendering

Example rendering of transcriptDiff tokens

Thanks, Sarah. gGlad to be here I haI've been looking forward to this conversation for weeks.

When you see this

تصحيحات نصية، تعديلات الترقيم، تنسيق الأرقام، تصحيحات أسماء المتحدثين، تعديلات الطوابع الزمنية أو تسميات المشاعر.

Request note

الصف يجب أن يوجد في كلتا النسختين بتشابه كافٍ لأن يقوم المحرك بمطابقة واثقة.

Response note

عند تغير عمود transcript، تتضمن الاستجابة مصفوفة transcriptDiff مع رموز diff على مستوى الحروف.

Workflow context

صفوف MODIFIED هي هدف المراجعة الرئيسي. كل واحدة تمثل تصحيحاً أجراه المُدقِّق. CER وWER تُحسب من هذه التغييرات.

ADDED

ADDED

لصف في reworked لا مطابق في original. استنفد المحرك جميع مراحل المطابقة دون إيجاد مصدر.

json
{
  "original": [{ "speaker": "Agent", "transcript": "Let me pull up your account." }],
  "reworked": [
    { "speaker": "Agent",    "transcript": "Let me pull up your account." },
    { "speaker": "Customer", "transcript": "Thank you." }
  ]
}
json
{
  "results": [
    { "status": "UNCHANGED", "notes": "exact match", ... },
    {
      "status": "ADDED",
      "notes": "new row in reworked",
      "currData": ["Customer", "Thank you."]
    }
  ]
}

When you see this

أضاف المُدقِّق مقطعاً غيَّبه الذكاء الاصطناعي. أسباب شائعة: مقطع هادئ لم يُكتشف، عدم اكتشاف تبديل رمز، أو تقسيم يظهر كـ ADDED إذا كان كشف التقسيم معطلاً.

Request note

فعِّل enableSplits: false إذا أردت أن تظهر كل التقسيمات كـ MODIFIED + ADDED بدلاً من التسمية الهيكلية SPLIT.

Response note

currData فقط موجود (لا snapData). حقل notes يساوي "new row in reworked".

Workflow context

يُخبرك عدد ADDED بكم مقطع فاته الذكاء الاصطناعي. مع DELETED يُعطيك جودة التجزئة.

DELETED

DELETED

لصف في original لا مطابق في reworked. حذفه المُدقِّق كلياً.

json
{
  "original": [
    { "speaker": "Host", "transcript": "Welcome to the show." },
    { "speaker": "[noise]", "transcript": "[background music fades]" }
  ],
  "reworked": [
    { "speaker": "Host", "transcript": "Welcome to the show." }
  ]
}
json
{
  "results": [
    { "status": "UNCHANGED", "notes": "exact match", ... },
    {
      "status": "DELETED",
      "notes": "row removed from reworked",
      "snapData": ["[noise]", "[background music fades]"]
    }
  ]
}

When you see this

نسخ الذكاء الاصطناعي ضجيجاً كنص منطوق، إنتاج تعبير خاطئ، أو إنشاء مقطع مكرر عند الحدود.

Request note

صف DELETED يعني أن المُدقِّق اتخذ قرار حذف صريح — يختلف عن MODIFIED حيث تغير المحتوى فقط.

Response note

snapData فقط موجود (لا currData). حقل notes يساوي "row removed from reworked".

Workflow context

دلالة DELETED غير المتوقعة في مرحلة مراجعة على تنظيف أكثر عدوانية من المتوقع أو مشاكل جودة في النموذج.

SPLIT

SPLIT

يُقابل صف أصلي واحد صفّين أو أكثر من الصفوف المُعادة المتتالية التي تُعيد بناء النص الأصلي مجتمعةً.

One row → two rows

Original

[{
  "speaker": "Candidate",
  "transcript": "For new users we relied on content-based filtering. For new items we used metadata clustering to find similar items with existing ratings."
}]

Reworked

[
  { "speaker": "Candidate", "transcript": "For new users, we relied on content-based filtering." },
  { "speaker": "Candidate", "transcript": "For new items, we used metadata clustering to find similar items with existing ratings." }
]

API Result

json
{
  "status": "SPLIT",
  "notes": "split into 2 rows",
  "originalRow": {
    "transcript": "For new users we relied on content-based filtering. For new items..."
  },
  "reworkedRows": [
    { "transcript": "For new users, we relied on content-based filtering." },
    { "transcript": "For new items, we used metadata clustering..." }
  ]
}

When you see this

قرر المُدقِّق أن مقطع الذكاء الاصطناعي كان طويلاً جداً ويحتوي على تعبيرين مختلفين أو التفافين للحديث، فقسّمه عند حد طبيعي.

Request note

الصف الأصلي يجب أن يكون مشابهاً بما يكفي للنص المجمَّع للصفوف المُعادة. تُفحص أيضاً معقولية الطوابع الزمنية إن وُجدت.

Response note

إدخال الصف الأصلي له status: "SPLIT". SER (معدل خطأ التجزئة) يُزاد بهذا الصف.

Workflow context

التقسيمات هي أكثر التغييرات الهيكلية أهمية بين طبقات التدقيق. عدد مرتفع يُشير إلى أن الطبقة السابقة كانت تُجزِّئ بشكل ناقص.

MERGED

MERGED

تُقابل صفّان أصليان أو أكثر صفاً مُعاداً واحداً حيث نصّه قريب من النص المجمَّع للأصليات.

Two rows → one merged row (+ two source rows in response)

Original

[
  { "speaker": "Elena", "transcript": "That resonates with our work at the localization lab." },
  { "speaker": "Elena", "transcript": "Standard Arabic models fail on Tunisian input." }
]

Reworked

[{
  "speaker": "Elena",
  "transcript": "That resonates with our work at the localization lab — standard Arabic models fail on Tunisian input."
}]

API Result

json
{
  "results": [
    {
      "status": "MERGED",
      "notes": "merged from 2 rows",
      "reworkedRow": {
        "transcript": "That resonates with our work at the localization lab — standard Arabic models fail on Tunisian input."
      }
    },
    {
      "status": "MERGED",
      "notes": "Source row 1/2 · merged into reworked row 0",
      "snapData": ["Elena", "That resonates with our work at the localization lab."]
    },
    {
      "status": "MERGED",
      "notes": "Source row 2/2 · merged into reworked row 0",
      "snapData": ["Elena", "Standard Arabic models fail on Tunisian input."]
    }
  ]
}

When you see this

قرر المُدقِّق أن المقاطع المتتالية يجب أن تُدمج. شائع عند الإفراط في التجزئة عند توقفات التنفس أو حدود الترقيم.

Request note

الصفوف الأصلية الممتصة يجب أن يكون لها تشابه نصي مجمَّع كافٍ. تظهر أيضاً في النتائج كإدخالات "Source row".

Response note

صف النتيجة المدموجة الرئيسي له status: "MERGED". كل صف أصلي ممتص يظهر مع notes: "Source row N/M · merged into reworked row X". تصفيتها في العدود.

Workflow context

عدد MERGED مرتفع يُشير إلى الإفراط في تجزئة الذكاء الاصطناعي. مع SPLIT، يُخبرك نسبتهما ما إذا كان الذكاء الاصطناعي يميل نحو الإفراط أو التقصير في التجزئة.

transcriptDiff: diff على مستوى الحروف

لصفوف MODIFIED حيث تغير عمود transcript، تتضمن الاستجابة مصفوفة transcriptDiff. كل رمز يحمل type ("EQUAL" أو "DELETE" أو "INSERT") وحقل text (الحروف). ملاحظة: الأنواع بالأحرف الكبيرة. هذا الحقل غائب عند تعيين enableInlineDiff: false.

"EQUAL" — حروف موجودة في كلتا النسختين (اعرضها كنص عادي)
"DELETE" — حروف موجودة فقط في الأصل (اشطبها أو لوّن بالأحمر)
"INSERT" — حروف موجودة فقط في reworked (لوّن بالأخضر)
json
"transcriptDiff": [
  { "type": "equal",  "value": "I've been having headaches for the past " },
  { "type": "delete", "value": "two" },
  { "type": "insert", "value": "2" },
  { "type": "equal",  "value": " weeks" }
]

الصفوف المصدرية (عبوة MERGED)

عند كشف MERGE، تتضمن مصفوفة النتائج كلاً من صف النتيجة المدموجة وإدخال "Source row" لكل أصل ممتص. الصفوف المصدرية لها status: "MERGED" وnotes تبدأ بـ "Source row N/M · merged into reworked row X".

js
// تخطِّي الصفوف المصدرية عند بناء ملخص العدد
const primaryResults = results.filter(
  r => !(r.status === "MERGED" && r.notes?.includes("Source row"))
)

العدّ الصحيح للحالات

طول مصفوفة results = originalRows + الصفوف الزائدة من SPLIT + الصفوف المصدرية من MERGED. استخدم هذا الجدول لبناء عدود صحيحة:

الحالةاستراتيجية العدّملاحظة
UNCHANGEDعُدَّ الكل
MODIFIEDعُدَّ الكل
ADDEDعُدَّ الكل
DELETEDعُدَّ الكل
SPLITعُدَّ الكلإدخال واحد لكل صف أصلي مقسَّم بصرف النظر عن عدد الصفوف المنتجة
MERGEDعُدَّ فقط الصفوف حيث notes لا تحتوي على "Source row"الصفوف المصدرية إدخالات تتبع للأصليات الممتصة — تخطَّها في العدود
دليل حالات الـ diff · Structural Diff API · تطوير Mohamed Yaakoubi← العودة إلى Structural Diff API