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` لمنع هذا النوع من الهلوسات مستقبلاً.