حالات الـ diff
مثال إدخال/إخراج واحد لكل حالة. بدون غموض.
يُسنِد المحرك حالة واحدة بالضبط لكل صف أصلي بعد المحاذاة بـ 8 مراحل. SPLIT وMERGED هما الحالتان الوحيدتان اللتان تُعطيان صفاً واحداً يُقابل عدة صفوف مخرجة (أو العكس). تُظهر هذه الصفحة الحمولة الأدنى التي تُطلق كل حالة بشكل موثوق، وبنية الاستجابة المتوقعة، وسياق سير العمل.
ملاحظة على خط أنابيب المحرك
تعالج خوارزمية الـ 8 مراحل كل صف أصلي مقابل كل صف مُعاد وتُسنِد أفضل حالة بناءً على التشابه النصي وقرب الطوابع الزمنية والتحقق الهيكلي. تُشغَّل المراحل بالترتيب: تطابق دقيق → تشابه عالٍ → كشف تقسيم → كشف دمج → تطابقات ضعيفة → الصفوف الباقية.
UNCHANGED
تحتوي كلا النسختين على صف بمحتوى متطابق عبر جميع الأعمدة المُعيَّنة (بعد تطبيع المسافات).
Original
"original": [{ "speaker": "Alice", "transcript": "Good morning everyone." }],Reworked
"reworked": [{ "speaker": "Alice", "transcript": "Good morning everyone." }]API Result
{
"status": "UNCHANGED",
"notes": "exact match",
"snapData": ["Alice", "Good morning everyone."],
"currData": ["Alice", "Good morning everyone."]
}{
"original": [{ "speaker": "Alice", "transcript": "Good morning everyone." }],
"reworked": [{ "speaker": "Alice", "transcript": "Good morning everyone." }]
}{
"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
طابق المحرك صفاً من الأصل بصف في 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
{
"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
لصف في reworked لا مطابق في original. استنفد المحرك جميع مراحل المطابقة دون إيجاد مصدر.
{
"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." }
]
}{
"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
لصف في original لا مطابق في reworked. حذفه المُدقِّق كلياً.
{
"original": [
{ "speaker": "Host", "transcript": "Welcome to the show." },
{ "speaker": "[noise]", "transcript": "[background music fades]" }
],
"reworked": [
{ "speaker": "Host", "transcript": "Welcome to the show." }
]
}{
"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
يُقابل صف أصلي واحد صفّين أو أكثر من الصفوف المُعادة المتتالية التي تُعيد بناء النص الأصلي مجتمعةً.
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
{
"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
تُقابل صفّان أصليان أو أكثر صفاً مُعاداً واحداً حيث نصّه قريب من النص المجمَّع للأصليات.
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
{
"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.
"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".
// تخطِّي الصفوف المصدرية عند بناء ملخص العدد
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" | الصفوف المصدرية إدخالات تتبع للأصليات الممتصة — تخطَّها في العدود |