### تحليل المشكلة (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` لمنع هذا النوع من الهلوسات مستقبلاً.