Cleanup pass 2: Fix .gitignore corruption, archive docs/audit + phase10 helpers, fix PROJECT_DESCRIPTION.md
6e716e3 | ### تحليل المشكلة (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` لمنع هذا النوع من الهلوسات مستقبلاً. | |