معاملات الإعداد
اعرف بالضبط أي معامل تُفعِّله ولماذا.
الإعداد الافتراضي يعمل جيداً مع معظم النصوص المكتوبة. هذه المعاملات موجودة للتعامل مع سير عمل التدقيق اللغوي المحددة: QA عربي، مقارنة موضعية، استبعاد أعمدة البيانات الوصفية، والتحكم في الكشف الهيكلي. يُظهر كل قسم الفرق الدقيق الذي ينتجه المعامل في النتائج.
متى تُخصِّص الإعداد
ابدأ بدون إعداد. شغّل الـ diff وافحص النتائج. استخدم معامل الإعداد فقط عند رؤية مشكلة محددة:
stripDiacriticsالنصوص العربية حيث إضافات التشكيل تُضخِّم عدد MODIFIEDsimpleModeQA محتوى فقط — أنت متأكد أن المُدقِّق لم يُجرِ أي تغييرات هيكليةignoreColNamesأعمدة البيانات الوصفية (درجة الثقة، الفئة) تختلف بين طبقات QA لكنها ليست هدف المقارنةpositionalModeتحديد أخطاء المحاذاة غير المتوقعة، أو معالجة مجموعات بيانات كبيرة ومتجانسةenableSplits: falseإرشادات المشروع تحظر التقسيمات في هذه الطبقةenableInlineDiff: falseدفعات كبيرة حيث تكفي الحالات والدرجات فقط — تعطيل حساب diff النص لتحسين الأداءenableCER / enableWERتحسين الأداء للدفعات الكبيرة — تخطي Levenshtein عند الحاجة فقط إلى المقاييس الهيكلية أو على مستوى الجملةenableComposite: falseإخفاء الدرجة الإجمالية عندما يستهلك نظامك قيم المقاييس الفردية مباشرةً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
{
"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). تضيع النية الهيكلية، لكن كل تغيير في الحروف يكون مرئياً.
{
"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 حرفية خام بدون تفسير هيكلي.
enableSplits / enableMerges
بدائل أكثر دقة من simpleMode. بدلاً من تعطيل كل الكشف الهيكلي، يمكنك تعطيل نوع واحد فقط.
enableSplits: false — يُعطي مرشحو SPLIT نتائج MODIFIED (تطابق مبتور) + ADDED (صفوف متبقية). مفيد عندما تحظر إرشاداتك التقسيمات.
enableMerges: false — يُصبح مرشحو MERGE: MODIFIED (أول صف أصلي) + DELETED (الأصلية الممتصة). مفيد عندما الدمج غير مسموح.
{
"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
{ "status": "UNCHANGED", "notes": "high similarity match (diacritics stripped)" }مع stripDiacritics: false (تجاوز): مرحبا → مرحباً يكون MODIFIED لأن علامة ً لم تعد تُحذف — يتم الإبلاغ عن الفروق الحرفية الخام.
{ "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": "خبار" }
]
}{ "config": { "stripDiacritics": false } }السلوك الافتراضي (true) مناسب لمعظم QA نصوص العربية. تجاوز بـ stripDiacritics: false فقط عند التحقق الصريح من أن المُدقِّق أضاف أو أزال علامات التشكيل بشكل صحيح — أي عندما تكون دقة التشكيل معياراً QA مُتتَّبعاً.
positionalMode
يتخطى خوارزمية المحاذاة بالتشابه كلياً. كل صف أصلي في الموضع N يُقارن بالصف المُعاد في الموضع N. إذا كانت المصفوفتان بأطوال مختلفة، الصفوف الزائدة تكون ADDED أو DELETED.
الافتراضي: إذا صحَّح مُدقِّق جملة وانتقلت من الموضع 4 إلى 6، يُطابقها المحرك (MODIFIED). مع positionalMode، يُقارن الصف 4 من الأصل بالصف 4 من المُعاد — الذي قد يكون جملة مختلفة كلياً.
مفيد للتحقيق في الأخطاء وللمجموعات المتجانسة جداً حيث المطابقة الموضعية هي الحقيقة الأساسية.
{ "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
{ "status": "MODIFIED", "notes": "confidence, category changed" }With ignoreColNames
{
// 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 غائب. استخدم هذا عندما تحتاج فقط إلى أعداد الحالات والدرجات لتقليل حجم الاستجابة.
{ "config": { "enableInlineDiff": false } }كل مقطع transcriptDiff له الشكل { type: "EQUAL" | "INSERT" | "DELETE", text: string }. أعد بناء الأصل بربط كل spans غير-INSERT؛ والمُعاد بربط كل spans غير-DELETE. ملاحظة: قيم type بالأحرف الكبيرة.
// transcriptDiff format — type is UPPERCASE, field is "text"
[
{ "type": "EQUAL", "text": "Hello " },
{ "type": "DELETE", "text": "world" },
{ "type": "INSERT", "text": "there" }
]عطّل (enableInlineDiff: false) عند معالجة دفعات كبيرة حيث تحتاج فقط إلى درجات CER/WER/SegER/SER وأعداد الحالات. هذا يُقلّل CPU الخادم وحجم payload الشبكة. أعد التفعيل لواجهات المراجعة التفاعلية.
إشارات التقييم
ستة معاملات منطقية تتحكم في المقاييس التي يحسبها المحرك وفيما إذا كانت النتيجة المركبة تُرجَع. الافتراضي true لجميعها. تعطيل أي إشارة يتجاوز حلقة الحساب بأكملها — الحقل في الاستجابة null وليس 0.
| Flag | Default | What it measures · When to disable |
|---|---|---|
enableCER | true | معدل أخطاء الأحرف على جميع الأعمدة (overallCER). يُحسب عبر Levenshtein على سلاسل الصفوف المتسلسلة. استخدم enableTranscriptCER للتحكم بشكل مستقل في نسخة عمود النص فقط. عند الحاجة فقط إلى مقاييس هيكلية أو على مستوى الجملة. Levenshtein هو O(m×n) — تخطي CER + WER على الدفعات الكبيرة (5 000+ مقطع طويل) يُقلل زمن الاستجابة ملحوظاً. |
enableTranscriptCER | true | يحسب transcriptCER — CER محدود بعمود النص فقط. مستقل عن enableCER: تعطيل enableCER يحذف overallCER لكن يبقى transcriptCER مفعَّلاً، والعكس صحيح. عند الحاجة إلى overallCER دون تفصيل عمود النص، أو العكس. |
enableWER | true | معدل أخطاء الكلمات على جميع الأعمدة (overallWER). يُرمِّز بالفراغات بعد حذف علامات الترقيم. استخدم enableTranscriptWER للتحكم بشكل مستقل في نسخة عمود النص فقط. نفس شروط enableCER. يُعطَّل عادةً معه. |
enableTranscriptWER | true | يحسب transcriptWER — WER محدود بعمود النص فقط. مستقل عن enableWER. عند الحاجة إلى overallWER دون تفصيل عمود النص، أو العكس. |
enableSegER | true | معدل أخطاء التجزئة: الأحداث الحدودية (تقسيمات + دمجات + صفوف مضافة + محذوفة) / عدد الأجزاء المتوقعة. إشارة الجودة الهيكلية — مستقلة عن محتوى النص. فقط إذا كان سير عملك يهتم حصراً بالتغييرات المعجمية والأحداث الهيكلية غير ذات صلة — نادر في QA النصوص. |
enableSER | true | معدل أخطاء الجمل: صفوف MODIFIED / (صفوف UNCHANGED + MODIFIED). نسبة الصفوف القابلة للمقارنة التي تحتوي أي تعديل. يُرجع null — لا 0 — عندما يكون المقام 0 (جميع الصفوف أحداث هيكلية بدون أزواج مقارنة). عند الاكتفاء بمعدلات أخطاء الأحرف/الكلمات دون الحاجة إلى إشارة على مستوى الجملة. |
enableTranscriptSER | true | SER على مستوى الجملة داخل نص عمود النص. يقسّم المحتوى إلى جمل (على . ! ? ؟ وأسطر جديدة) ويحسب الجمل المتغيرة عبر صفوف MODIFIED وMERGED وSPLIT. مماثل لـ transcriptWER لكن على مستوى الجملة بدلاً من الكلمة — يقيس معدل تغيير الجمل داخل المستند، لا التعديلات على مستوى الصف. عندما يكون SER على مستوى الصف (enableSER) كافياً ولا تضيف دقة الجملة قيمة تشخيصية. |
enableSACR | true | معدل تغيير نسب المتحدث: الصفوف التي تغيّر فيها عمود المتحدث / صفوف MODIFIED. اكتشاف تلقائي للأعمدة المسماة speaker أو talker أو spk. يُرجع null تلقائياً عند غياب عمود المتحدث — تفعيل هذا على بيانات بدون متحدث لا يكلف شيئاً. فقط لإخفاء حقل SACR من الاستجابة بشكل صريح بصرف النظر عن وجود عمود متحدث. |
enableComposite | true | يحسب متوسط درجات كل مقياس (مقياس 1–5) للمقاييس المفعَّلة التي أنتجت قيمة غير null. CER وTranscript CER وWER وTranscript WER وSegER وSER وTranscript SER تُغذّي المركّب — SACR مستبعد لأن كثيراً من مجموعات البيانات تفتقر إلى عمود متحدث مما يجعل المركّب غير قابل للمقارنة بين الدفعات. عندما يقرأ نظامك قيم المقاييس الفردية مباشرةً ولا يعرض درجة إجمالية. |
cerInComposite | true | تضمين CER في حساب الدرجة المركبة. عند false، لا يزال CER يُحسب ويُعاد في الاستجابة لكنه لا يؤثر في الدرجة المركبة. عندما يكون CER مقياساً تشخيصياً فقط وتريد أن يعكس المركّب WER/SegER/SER حصراً. |
werInComposite | true | تضمين WER في حساب الدرجة المركبة. عند false، يُحسب WER لكن يُستبعد من متوسط المركّب. عندما يُتتبَّع WER كمرجع لكن لا يجب أن يُعاقب المركّب (مثلاً: مقاطع قصيرة جداً يكون فيها عدد الكلمات غير موثوق). |
segerInComposite | true | تضمين SegER في حساب الدرجة المركبة. عند false، يُحسب SegER لكن يُستبعد من متوسط المركّب. عندما تكون جودة التجزئة مصدر قلق منفصل يُراجع باستقلالية ولا يجب أن يُخفِّض الدرجة المركبة الإجمالية. |
serInComposite | true | تضمين SER في حساب الدرجة المركبة. عند false، يُحسب SER لكن يُستخدم كإشارة تشخيصية مستقلة دون التأثير في المركّب. عندما يكون معدل أخطاء الجمل إشارة تشخيصية فقط وتريد أن تحدد CER/WER/SegER درجة المركّب. |
transcriptCerInComposite | true | تضمين CER النص في حساب الدرجة المركبة. عند false، يُحسب transcriptCER ويُعاد لكنه لا يؤثر في المركّب. عندما يكون CER عمود النص مقياساً مرجعياً فقط وتريد أن يعكس المركّب المقاييس الأخرى. |
transcriptWerInComposite | true | تضمين WER النص في حساب الدرجة المركبة. عند false، يُحسب transcriptWER لكن يُستبعد من متوسط المركّب. عندما يُتتبَّع WER عمود النص كمرجع لكن لا يجب أن يؤثر في الدرجة المركبة. |
transcriptSerInComposite | true | تضمين SER النص في حساب الدرجة المركبة. عند false، يُحسب transcriptSER لكن يُستخدم كإشارة تشخيصية على مستوى الجملة دون التأثير في المركّب. عندما يكون معدل تغيير الجمل إشارة ثانوية وتريد أن تحدد CER/WER/SegER/SER درجة المركّب. |
{
"config": {
"enableCER": false,
"enableWER": false,
"enableSACR": false
}
}structuralTransforms
مصفوفة من قواعد البحث/الاستبدال تُطبَّق على نص النص قبل تشغيل خوارزمية حساب التشابه. يتيح هذا للمحرك محاذاة الصفوف التي تختلف فقط في بادئات أو تنسيقات متوقعة وغير محتوى (مثل: علامات ID، بادئات URL).
كل قاعدة: { find: string, replace: string, isRegex: boolean }. قواعد السلسلة: بحث واستبدال حرفي. قواعد regex (isRegex: true): تدعم بنية regex JavaScript القياسية (غير حساسة لحالة الأحرف). حتى 20 قاعدة لكل طلب.
{
"config": {
"structuralTransforms": [
{ "find": "^ID-\\d+:\\s*", "replace": "", "isRegex": true },
{ "find": "https?://[^\\s]+", "replace": "[URL]", "isRegex": true }
]
}
}استخدم عندما تتشارك بياناتك الأصلية والمُعادة مخططاً مشتركاً لكن الصفوف تتضمن معرّفات تلقائية أو بادئات دفعات أو تنسيقات غيّرها المُدقِّق. بدون تحويلات، تعامل خوارزمية المحاذاة الصفوف ذات البادئات المختلفة كصفوف مختلفة تماماً.
عتبات التشابه والتوقيت للخبراء
هذه الأرقام السبعة تتحكم في حساسية خوارزمية المطابقة. القيم الافتراضية مُضبَّطة لمقاطع النصوص ذات الطول القياسي (5–30 ثانية، 10–60 كلمة). اضبطها فقط بعد فحص درجات التشابه الخام.
| Parameter | Default | When 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 على مستوى الكلمة لجميع المقاطع لتقليل وقت المعالجة. |
{
"config": {
"SIM_WEAK": 0.15,
"TIME_EXACT_TOL": 1.0,
"SPLIT_COMBINED_MIN": 0.70
}
}