File size: 4,703 Bytes
06539c0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | ### تحليل المشكلة (Log Analysis)
لقد قمت بتحليل الـ Logs خطوة بخطوة، واكتشفت بالضبط ما حدث. المشكلة عبارة عن **سلسلة من الأحداث المعقدة** (Cascade) بدأت بسبب "هلوسة" من نموذج الإملاء، وتفاعل معها نظام الـ Offset Mapper ونظام منع التداخل (Overlap Resolver).
إليك التفاصيل:
#### 1. هلوسة نموذج الإملاء (AraSpell Hallucination)
النص الأصلي الذي أدخله المستخدم كان يبدو هكذا:
`"قال محمد: أننا حققنا نجاحا كبيرا في المشروع رغم الصعوباالصعوبات...."`
نموذج AraSpell (الذي يعتمد على AraBERT) عندما رأى `"محمد:"`، قام بـ "هلوسة" كلمة `"علي"` من السياق، وأخرج:
`"قال محمد علي أننا..."` (قام بحذف النقطتين وإضافة كلمة علي).
**لماذا سمح النظام بهذا التغيير؟**
يوجد فلتر في `app.py` يقيس مسافة Levenshtein لكي يمنع التعديلات الكبيرة.
المسافة بين `"محمد:"` و `"محمدعلي"` هي **3 حركات** (استبدال `:` بحرف `ع`، وإضافة `ل`، وإضافة `ي`).
القانون في الكود هو: `dist <= 3 and (dist / max_len) <= 0.5`.
بما أن المسافة 3 والطول الأكبر 7، فالنسبة (3/7 = 0.42) كانت أقل من 0.5، وللأسف **تخطت الفلتر!**
لذلك تم تسجيل اقتراح إملائي: `محمد:` ⬅️ `محمد علي` (للحروف من 4 إلى 9).
#### 2. كيف تداخل الإملاء مع الترقيم؟ (The Offset Collision)
الآن النص الذي وصل لنموذج الترقيم هو: `"قال محمد علي أننا..."`.
نموذج الترقيم قرر إضافة نقطتين بعد `"علي"`، فأخرج: `"قال محمد علي: أننا..."`.
الفرق هنا هو في كلمة `"علي"` ⬅️ `"علي:"`.
عندما قام نظام `OffsetMapper` بمحاولة إرجاع مكان كلمة `"علي"` إلى النص الأصلي (الذي لم يكن فيه كلمة علي أصلاً، بل كان فيه `"محمد:"`)، قام بعملية حسابية للنسبة والتناسب (Interpolation) وأرجع المؤشر إلى الحروف `[7:9]` في النص الأصلي (وهي حرف `د` والنقطتين `:`).
**النتيجة:**
- اقتراح الإملاء أخذ المساحة `[4:9]`.
- اقتراح الترقيم أخذ المساحة `[7:9]`.
حدث **تداخل (Overlap)** بينهما! وبما أن الترقيم (أولوية 2) أعلى من الإملاء (أولوية 1)، قام نظام Overlap Resolver بـ **حذف اقتراح الإملاء** وقال في الـ Log:
`Dropped spelling [4:9] 'محمد:' — conflicts with higher-priority span`
#### 3. لماذا تم حذف اقتراح الترقيم في آخر النص؟
في آخر النص كانت الكلمة `"الصعوباالصعوبات...."`.
- **نموذج الجرامر (أولوية 3):** قام بتصحيحها كاملة إلى `"الصعوبات..."` (اقتراح مساحته `[47:62]`).
- **نموذج الترقيم (أولوية 2):** لاحظ أن الجرامر ترك 3 نقاط `...` فقرر أن يضيف نقطة رابعة لتصبح `"الصعوبات...."` (اقتراح لنفس المساحة `[47:62]`).
حدث تداخل تام على نفس الكلمة! نظام الـ Overlap Resolver قام بعمله بكفاءة عالية هنا، وحذف اقتراح الترقيم لحساب اقتراح الجرامر (لأنه الأهم والأشمل)، وهذا هو سبب الـ Log الثاني:
`Dropped punctuation [47:62] 'الصعوباالصعوبات' — conflicts with higher-priority span`
---
### الخلاصة والحل المقترح
1. **نظام الـ Overlap Resolver يعمل بامتياز!** لقد منع كارثة بصرية في الـ UI كانت ستحدث بسبب التداخل. (Log #2 طبيعي وصحيح جداً).
2. **المشكلة الحقيقية في `_is_small_spelling_change`:** خوارزمية قياس المسافة متساهلة جداً مع الكلمات القصيرة.
**الحل:**
تعديل الكود في `app.py` ليكون أكثر صرامة مع الإملاء، بحيث نرفض التغيير إذا كان سيضيف حروفاً كثيرة لكلمة قصيرة (لمنع الهلوسة). سأقوم بتعديل دالة `_is_small_spelling_change` لمنع هذا النوع من الهلوسات مستقبلاً.
|