Structural Diff APIمعاملات الإعداد

معاملات الإعداد

اعرف بالضبط أي معامل تُفعِّله ولماذا.

الإعداد الافتراضي يعمل جيداً مع معظم النصوص المكتوبة. هذه المعاملات موجودة للتعامل مع سير عمل التدقيق اللغوي المحددة: QA عربي، مقارنة موضعية، استبعاد أعمدة البيانات الوصفية، والتحكم في الكشف الهيكلي. يُظهر كل قسم الفرق الدقيق الذي ينتجه المعامل في النتائج.

متى تُخصِّص الإعداد

ابدأ بدون إعداد. شغّل الـ diff وافحص النتائج. استخدم معامل الإعداد فقط عند رؤية مشكلة محددة:

stripDiacriticsالنصوص العربية حيث إضافات التشكيل تُضخِّم عدد MODIFIED
simpleModeQA محتوى فقط — أنت متأكد أن المُدقِّق لم يُجرِ أي تغييرات هيكلية
ignoreColNamesأعمدة البيانات الوصفية (درجة الثقة، الفئة) تختلف بين طبقات QA لكنها ليست هدف المقارنة
positionalModeتحديد أخطاء المحاذاة غير المتوقعة، أو معالجة مجموعات بيانات كبيرة ومتجانسة
enableSplits: falseإرشادات المشروع تحظر التقسيمات في هذه الطبقة
enableInlineDiff: falseدفعات كبيرة حيث تكفي الحالات والدرجات فقط — تعطيل حساب diff النص لتحسين الأداء
structuralTransformsالصفوف تحتوي على بادئات معرّف أو روابط أو تنسيقات تختلف بين الطبقات لكنها ليست محتوى النص

simpleMode

بشكل افتراضي، يُشغِّل المحرك خوارزمية محاذاة بـ 8 مراحل تُطابق الصفوف بالتشابه عبر النص الكامل، حتى لو تغيرت مواضعها. simpleMode يُعطِّل هذا: الصف 0 يُقارن بالصف 0، الصف 1 بالصف 1، بالموضع الحرفي.

الافتراضي (simpleMode: false): يكشف المحرك أن مقطعاً طويلاً قُسِّم إلى مقطعين ويُصنِّفه SPLIT.

Original

{
  "original": [
    { "speaker": "Candidate", "words": "For new users we relied on content-based filtering. For new items we used metadata clustering to find similar items." }
  ],
  "reworked": [
    { "speaker": "Candidate", "words": "For new users, we relied on content-based filtering." },
    { "speaker": "Candidate", "words": "For new items, we used metadata clustering to find similar items." }
  ]
}

Reworked

/* config: {} (default) */

API Result

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

مع simpleMode: true: يقارن المحرك الصف 0 بالصف 0 (يجد تفاوتاً → MODIFIED) ويرى صفاً إضافياً في reworked (→ ADDED). تضيع النية الهيكلية، لكن كل تغيير في الحروف يكون مرئياً.

json
{
  "results": [
    {
      "status": "MODIFIED",
      "notes": "words changed",
      "snapData": ["Candidate", "For new users we relied on content-based filtering..."],
      "currData": ["Candidate", "For new users, we relied on content-based filtering."],
      "transcriptDiff": [
        { "type": "equal",  "value": "For new users" },
        { "type": "insert", "value": "," },
        { "type": "equal",  "value": " we relied on content-based filtering." }
      ]
    },
    {
      "status": "ADDED",
      "notes": "new row in reworked",
      "currData": ["Candidate", "For new items, we used metadata clustering..."]
    }
  ]
}

استخدم عندما تكون متأكداً أن المُدقِّق لم يُجرِ أي تغييرات هيكلية — فقط تصحيحات نصية وإملائية. مفيد أيضاً للحصول على diffs حرفية خام بدون تفسير هيكلي.

simpleMode أسرع على مجموعات البيانات الكبيرة جداً لتخطيه المحاذاة. المقايضة هي أعداد خاطئة من MODIFIED/ADDED/DELETED حيث سيكون SPLIT/MERGED أدق.

enableSplits / enableMerges

بدائل أكثر دقة من simpleMode. بدلاً من تعطيل كل الكشف الهيكلي، يمكنك تعطيل نوع واحد فقط.

SPLIT

enableSplits: false — يُعطي مرشحو SPLIT نتائج MODIFIED (تطابق مبتور) + ADDED (صفوف متبقية). مفيد عندما تحظر إرشاداتك التقسيمات.

MERGED

enableMerges: false — يُصبح مرشحو MERGE: MODIFIED (أول صف أصلي) + DELETED (الأصلية الممتصة). مفيد عندما الدمج غير مسموح.

json
{
  "config": {
    "enableSplits": false,
    "enableMerges": true
  }
}

هذه المعاملات مفيدة في خطوط QA متعددة الطبقات حيث لكل طبقة عملياتها المسموح بها. تعطيل عملية غير متوقعة يجعل التغييرات الهيكلية غير المصرح بها تظهر كـ ADDED/DELETED متميزة.

stripDiacritics

قبل المقارنة، يُطبِّق المحرك تطبيعاً على الحروف العربية والمعلّمة بإزالة علامات التشكيل. للعربية يشمل هذا الحركات (الفتحة، الكسرة، الضمة، تنوينها)، الشدة، السكون، وأشكال الهمزة (U+064B–U+065F، U+0670). هذا المعامل مُفعَّل افتراضياً.

سيناريو QA عربي شائع: يُطبِّق المُدقِّق التشكيل وفق أدلة الأسلوب للعربية الفصحى. مع السلوك الافتراضي (stripDiacritics: true)، تُحسب فقط الفروق المعجمية وفروق التجزئة.

السلوك الافتراضي (stripDiacritics: true — لا حاجة للإعداد): مرحبا → مرحباً يكون UNCHANGED لأن علامات التشكيل تُحذف قبل المقارنة، مما يجعل الشكلين المجردين متطابقين.

Original

{
  "original": [{ "speaker": "المذيع", "transcript": "مرحبا بكم في نشرة الاخبار" }],
  "reworked": [{ "speaker": "المذيع", "transcript": "مرحباً بكم في نشرة الأخبار" }]
}

Reworked

/* config: {} (default — stripDiacritics: true) */

API Result

json
{ "status": "UNCHANGED", "notes": "high similarity match (diacritics stripped)" }

مع stripDiacritics: false (تجاوز): مرحبا → مرحباً يكون MODIFIED لأن علامة ً لم تعد تُحذف — يتم الإبلاغ عن الفروق الحرفية الخام.

json
{ "status": "MODIFIED", "notes": "transcript changed",
  "transcriptDiff": [
    { "type": "EQUAL",  "text": "مرحب" },
    { "type": "DELETE", "text": "ا" },
    { "type": "INSERT", "text": "اً" },
    { "type": "EQUAL",  "text": " بكم في نشرة ال" },
    { "type": "DELETE", "text": "ا" },
    { "type": "INSERT", "text": "أ" },
    { "type": "EQUAL",  "text": "خبار" }
  ]
}
json
{ "config": { "stripDiacritics": false } }

السلوك الافتراضي (true) مناسب لمعظم QA نصوص العربية. تجاوز بـ stripDiacritics: false فقط عند التحقق الصريح من أن المُدقِّق أضاف أو أزال علامات التشكيل بشكل صحيح — أي عندما تكون دقة التشكيل معياراً QA مُتتَّبعاً.

positionalMode

يتخطى خوارزمية المحاذاة بالتشابه كلياً. كل صف أصلي في الموضع N يُقارن بالصف المُعاد في الموضع N. إذا كانت المصفوفتان بأطوال مختلفة، الصفوف الزائدة تكون ADDED أو DELETED.

الافتراضي: إذا صحَّح مُدقِّق جملة وانتقلت من الموضع 4 إلى 6، يُطابقها المحرك (MODIFIED). مع positionalMode، يُقارن الصف 4 من الأصل بالصف 4 من المُعاد — الذي قد يكون جملة مختلفة كلياً.

positionalMode ينتج نتائج مضللة عند إعادة ترتيب الصفوف. استخدمه فقط عند ضمان عدم إضافة أو حذف أو إعادة ترتيب أي صفوف.

مفيد للتحقيق في الأخطاء وللمجموعات المتجانسة جداً حيث المطابقة الموضعية هي الحقيقة الأساسية.

json
{ "config": { "positionalMode": true } }

ignoreColNames

مصفوفة من أسماء الأعمدة يجب إقصاؤها من كشف MODIFIED. الصف يكون MODIFIED فقط إذا تغير عمود غير مُقصى. الأعمدة المُقصاة لا تزال في الاستجابة لكنها لا تُطلق MODIFIED.

سيناريو: بياناتك تحتوي على عمود confidence يُعيِّنه أداة التدقيق. طبقة QA 1 تسجل confidence: 0.88 بينما طبقة QA 2 تسجل confidence: 0.91 لنفس الجملة. بدون ignoreColNames، كل صف كهذا يكون MODIFIED رغم أن النص متطابق.

Without ignoreColNames

Original

{
  "original": [
    { "transcript": "The patient reports mild chest pain.", "speaker": "Doctor", "confidence": 0.88, "category": "symptom" }
  ],
  "reworked": [
    { "transcript": "The patient reports mild chest pain.", "speaker": "Doctor", "confidence": 0.94, "category": "complaint" }
  ]
}

Reworked

/* config: {} */

API Result

json
{ "status": "MODIFIED", "notes": "confidence, category changed" }

With ignoreColNames

json
{
  // request: { "config": { "ignoreColNames": ["confidence", "category"] } }
  "status": "UNCHANGED", "notes": "exact match (after ignoring confidence, category)"
}

استخدم كلما احتوى مخططك على أعمدة بيانات وصفية تتغير بشكل مستقل عن محتوى النص: درجات الثقة، معرّفات المراجعين، أرقام الدفعات، علامات الفئات، الطوابع الزمنية التلقائية.

enableInlineDiff

يتحكم في ما إذا كان المحرك يحسب diff حرفياً inline للصفوف MODIFIED. عند التفعيل (افتراضي)، كل صف MODIFIED في الاستجابة يتضمن مصفوفة transcriptDiff يمكنك استخدامها لعرض التغييرات بالتظليل في واجهة المراجعة. تعطيله يتخطى حساب الـ diff كلياً.

مع enableInlineDiff: false، صفوف MODIFIED لا تزال تظهر في النتائج (الحالة والملاحظات دون تغيير)، لكن حقل transcriptDiff غائب. استخدم هذا عندما تحتاج فقط إلى أعداد الحالات والدرجات لتقليل حجم الاستجابة.

json
{ "config": { "enableInlineDiff": false } }

كل مقطع transcriptDiff له الشكل { type: "EQUAL" | "INSERT" | "DELETE", text: string }. أعد بناء الأصل بربط كل spans غير-INSERT؛ والمُعاد بربط كل spans غير-DELETE. ملاحظة: قيم type بالأحرف الكبيرة.

json
// transcriptDiff format — type is UPPERCASE, field is "text"
[
  { "type": "EQUAL",  "text": "Hello " },
  { "type": "DELETE", "text": "world" },
  { "type": "INSERT", "text": "there" }
]

عطِّل (enableInlineDiff: false) عند معالجة دفعات كبيرة حيث تحتاج فقط إلى درجات CER/WER/SER وأعداد الحالات. هذا يُقلِّل CPU الخادم وحجم payload الشبكة. أعد التفعيل لواجهات المراجعة التفاعلية.

يستخدم الـ diff خوارزمية LCS (أطول تسلسل مشترك). للمقاطع الطويلة جداً (الطول المشترك الأصل + المُعاد > CHAR_DIFF_LIMIT)، يتحول تلقائياً من مستوى الحرف إلى مستوى الكلمة — مُعاد بنفس تنسيق المصفوفة.

structuralTransforms

مصفوفة من قواعد البحث/الاستبدال تُطبَّق على نص النص قبل تشغيل خوارزمية حساب التشابه. يتيح هذا للمحرك محاذاة الصفوف التي تختلف فقط في بادئات أو تنسيقات متوقعة وغير محتوى (مثل: علامات ID، بادئات URL).

كل قاعدة: { find: string, replace: string, isRegex: boolean }. قواعد السلسلة: بحث واستبدال حرفي. قواعد regex (isRegex: true): تدعم بنية regex JavaScript القياسية (غير حساسة لحالة الأحرف). حتى 20 قاعدة لكل طلب.

json
{
  "config": {
    "structuralTransforms": [
      { "find": "^ID-\\d+:\\s*", "replace": "", "isRegex": true },
      { "find": "https?://[^\\s]+",  "replace": "[URL]", "isRegex": true }
    ]
  }
}
التحويلات تُطبَّق على حساب التشابه فقط — ليس على البيانات المُعادة في snapData / currData. الصف الذي تغيرت فيه بادئة ID فقط سيظل MODIFIED لأن المحتوى الخام مختلف. التحويلات تضمن المحاذاة الصحيحة، ليس غياب التعديل.

استخدم عندما تتشارك بياناتك الأصلية والمُعادة مخططاً مشتركاً لكن الصفوف تتضمن معرّفات تلقائية أو بادئات دفعات أو تنسيقات غيّرها المُدقِّق. بدون تحويلات، تعامل خوارزمية المحاذاة الصفوف ذات البادئات المختلفة كصفوف مختلفة تماماً.

عتبات التشابه والتوقيت للخبراء

هذه الأرقام السبعة تتحكم في حساسية خوارزمية المطابقة. القيم الافتراضية مُضبَّطة لمقاطع النصوص ذات الطول القياسي (5–30 ثانية، 10–60 كلمة). اضبطها فقط بعد فحص درجات التشابه الخام.

ParameterDefaultWhen to adjust · Effect
SIM_CONFIDENT
رقم (0–1)
0.70
صفّان بهذه الدرجة أو أعلى هما تطابق مؤكد — يُعتمد في مرحلة التشابه العالي.
ارفع لمطابقات نصية أكثر دقة. اخفض للمقاطع القصيرة جداً.
SIM_MODERATE
رقم (0–1)
0.40
تطابق محتمل — مقبول عندما يؤكده التوقيت أيضاً.
اخفض إذا كان المُدقِّقون يُعيدون صياغة الجمل بشكل كبير مع الحفاظ على المعنى.
SIM_WEAK
رقم (0–1)
0.20
تطابق تقريبي — مقبول فقط مع دليل زمني قوي جداً.
اخفض إلى 0.10–0.15 للمقاطع القصيرة جداً (كلمات مفردة، تعثرات) التي لا تستطيع بلوغ 0.20.
TIME_EXACT_TOL
رقم (ث)
0.05
الطوابع الزمنية ≤ هذا الفارق = تطابق دقيق.
ارفع إلى 0.5–1.0 إذا كانت الأداة تُقرِّب الطوابع للثانية.
TIME_FUZZY_TOL
رقم (ث)
2.5
الطوابع الزمنية ≤ هذا الفارق = تطابق تقريبي.
ارفع عند تحريك المُدقِّقين حدود المقطع بشكل كبير.
SPLIT_COMBINED_MIN
رقم (0–1)
0.35
الحد الأدنى لدرجة النص المشتركة لقبول SPLIT.
ارفع لتقليل التقسيمات الخاطئة. اخفض إذا كان محتواك يحتوي مقاطع هدف قصيرة جداً.
MERGE_COMBINED_MIN
رقم (0–1)
0.65
الحد الأدنى لدرجة النص المشتركة لقبول MERGE.
ارفع لتقليل الدمجات الخاطئة. اخفض لمجموعات البيانات ذات الدمجات المشروعة الكثيرة.
CHAR_DIFF_LIMIT
عدد صحيح (100–50000)
1500
أقصى طول حرفي مشترك قبل التحول إلى diff على مستوى الكلمة.
ارفع للدفعات ذات المقاطع الطويلة جداً. اخفض لإجبار diffs على مستوى الكلمة لجميع المقاطع لتقليل وقت المعالجة.
json
{
  "config": {
    "SIM_WEAK": 0.15,
    "TIME_EXACT_TOL": 1.0,
    "SPLIT_COMBINED_MIN": 0.70
  }
}
دليل معاملات الإعداد · Structural Diff API · تطوير Mohamed Yaakoubi← العودة إلى Structural Diff API