File size: 8,331 Bytes
be32617
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import sys
import os
import re

# Add src to path
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'src')))

from nlp.grammar.grammar_rules import ArabicGrammarGuard
from nlp.spelling.araspell_rules import AraSpellPostProcessor
from transformers import AutoTokenizer

def run_tests():
    print("Initializing components...")
    grammar = ArabicGrammarGuard()
    
    print("\n--- 1. GRAMMAR BUGS ---")
    
    # 1.1 Asmaa Khamsa Object Position
    # Before: رأيت أخوك (Forced nominative)
    res = grammar.smart_asmaa_khamsa_fix("رأيت أخاك")
    print(f"1.1 [1]: رأيت أخاك -> {res} (Expected: رأيت أخاك)")
    res2 = grammar.smart_asmaa_khamsa_fix("قابلنا أباك")
    print(f"1.1 [2]: قابلنا أباك -> {res2} (Expected: قابلنا أباك)")
    
    # 1.2 Non-Human Plurals
    res = grammar.fix_subject_verb_agreement("السيارات تسرع")
    print(f"1.2 [1]: السيارات تسرع -> {res} (Expected: السيارات تسرع)")
    res2 = grammar.fix_subject_verb_agreement("المدارس تفتح")
    print(f"1.2 [2]: المدارس تفتح -> {res2} (Expected: المدارس تفتح)")
    
    # 1.3 Masculine Nouns Ending in 'ة'
    res = grammar.fix_gender_agreement("خليفة عادل")
    print(f"1.3 [1]: خليفة عادل -> {res} (Expected: خليفة عادل)")
    res2 = grammar.fix_gender_agreement("دعاة كبار")
    print(f"1.3 [2]: دعاة كبار -> {res2} (Expected: دعاة كبار)")
    
    # 1.4 Preposition Blocklist Missing 'ون' Root Words
    res = grammar.fix_prepositions_advanced("في قانون جديد")
    print(f"1.4 [1]: في قانون -> {res} (Expected: في قانون جديد)")
    res2 = grammar.fix_prepositions_advanced("مع فرعون")
    print(f"1.4 [2]: مع فرعون -> {res2} (Expected: مع فرعون)")
    
    # 1.5 Breaking Hamzat Inna after 'Qawl'
    res = grammar.fix_initial_hamza("قال انه قادم")
    print(f"1.5 [1]: قال انه قادم -> {res} (Expected: قال إنه قادم)")
    res2 = grammar.fix_initial_hamza("تقول انهم هناك")
    print(f"1.5 [2]: تقول انهم هناك -> {res2} (Expected: تقول إنهم هناك)")

    # 1.6 Conditional Sentences Overcorrection (Negative ما / Relative من)
    res = grammar.fix_conditional_sentences("رأيت من يدرس")
    print(f"1.6 [1]: رأيت من يدرس -> {res} (Expected: رأيت من يدرس)")
    res2 = grammar.fix_conditional_sentences("أحب من يعلم")
    print(f"1.6 [2]: أحب من يعلم -> {res2} (Expected: أحب من يعلم)")
    
    # 1.7 Lam Al-Ta'leel Overcorrection
    res = grammar.fix_verbs_nasb_and_jazm("ليدعوا إلى الله")
    print(f"1.7 [1]: ليدعوا إلى الله -> {res} (Expected: ليدعوا إلى الله)")
    res2 = grammar.fix_verbs_nasb_and_jazm("ليذهبوا إلى المدرسة")
    print(f"1.7 [2]: ليذهبوا إلى المدرسة -> {res2} (Expected: ليذهبوا إلى المدرسة)")

    # 1.8 Broken Plural Adjective Corruption
    res = grammar.fix_noun_adjective_agreement_advanced("الرجال الطويلون")
    print(f"1.8 [1]: الرجال الطويلون -> {res} (Expected: الرجال الطويلون)")
    res2 = grammar.fix_noun_adjective_agreement_advanced("العمال الماهرون")
    print(f"1.8 [2]: العمال الماهرون -> {res2} (Expected: العمال الماهرون)")
    
    # 1.9 Defective Verb Truncation in VSO
    res = grammar.fix_number_and_gender_agreement("دعوا الأصدقاء")
    print(f"1.9 [1]: دعوا الأصدقاء -> {res} (Expected: دعوا الأصدقاء/دعا الأصدقاء)")
    res2 = grammar.fix_number_and_gender_agreement("رموا الكرة")
    print(f"1.9 [2]: رموا الكرة -> {res2} (Expected: رموا الكرة/رمى الكرة)")

    # 1.10 ان/ون Root Noun Corruption in Kana/Inna
    res = grammar.fix_kana_and_inna("إن قانون")
    print(f"1.10 [1]: إن قانون -> {res} (Expected: إن قانون)")
    res2 = grammar.fix_kana_and_inna("كان فرعون")
    print(f"1.10 [2]: كان فرعون -> {res2} (Expected: كان فرعون)")

    # 1.11 Contextual Jazm Pronoun Contamination
    res = grammar.fix_conditional_sentences("إن يذهبوا يجدوا سياراتكم")
    print(f"1.11 [1]: إن يذهبوا -> {res} (Expected: إن يذهبوا يجدوا سياراتكم)")
    res2 = grammar.fix_conditional_sentences("من يدرسوا ينجحوا بكم")
    print(f"1.11 [2]: من يدرسوا -> {res2} (Expected: من يدرسوا ينجحوا بكم)")

    # 1.12 Destruction of Mid-Sentence Conditional 'إن'
    res = grammar.fix_initial_hamza("سأذهب ان جاء أحمد")
    print(f"1.12 [1]: ان جاء -> {res} (Expected: ان جاء / إن جاء)")
    res2 = grammar.fix_initial_hamza("تنجح ان تذاكر")
    print(f"1.12 [2]: ان تذاكر -> {res2} (Expected: ان تذاكر / إن تذاكر)")
    
    # 1.13 'كان' Misclassified as 'إن' in Regex Fallback
    res = grammar.regex_rules_fallback("كان أخوك")
    print(f"1.13 [1]: كان أخوك -> {res} (Expected: كان أخوك)")
    res2 = grammar.regex_rules_fallback("كان أبوك")
    print(f"1.13 [2]: كان أبوك -> {res2} (Expected: كان أبوك)")

    # 1.14 Dual Nouns Corrupting Plural Verbs
    res = grammar.fix_subject_verb_agreement("إن الطالبين يدرسان")
    print(f"1.14 [1]: إن الطالبين يدرسان -> {res} (Expected: إن الطالبين يدرسان)")
    res2 = grammar.fix_subject_verb_agreement("لعل الطفلين يلعبان")
    print(f"1.14 [2]: لعل الطفلين يلعبان -> {res2} (Expected: لعل الطفلين يلعبان)")

    # 4.1 Punctuation Masking Dictionary Lookups
    res = grammar.fix_tanween_fathah("طويلا.")
    print(f"4.1 [1]: طويلا. -> {res} (Expected: طويلاً.)")
    res2 = grammar.fix_initial_hamza("ايضا،")
    print(f"4.1 [2]: ايضا، -> {res2} (Expected: أيضاً،)")

    print("\n--- 2. SPELLING BUGS ---")
    post = AraSpellPostProcessor()
    
    # 2.1 HAMZA_WHITELIST Overcorrection
    res = post.fix_common_hamza("اعرف الحقيقة")
    print(f"2.1 [1]: اعرف الحقيقة -> {res} (Expected: اعرف الحقيقة)")
    res2 = post.fix_common_hamza("اعمل بجد")
    print(f"2.1 [2]: اعمل بجد -> {res2} (Expected: اعمل بجد)")

    # 2.3 Destructive Word Merging
    res = post.join_fragments("يوم مشمس")
    print(f"2.3 [1]: يوم مشمس -> {res} (Expected: يوم مشمس)")
    res2 = post.join_fragments("أحمد درس")
    print(f"2.3 [2]: أحمد درس -> {res2} (Expected: أحمد درس)")
    
    # 2.4 'إما' vs 'أما' Overcorrection
    res = post.fix_common_hamza("اما هذا أو ذاك")
    print(f"2.4 [1]: اما هذا -> {res} (Expected: اما هذا)")
    res2 = post.fix_common_hamza("إما أن تذهب")
    print(f"2.4 [2]: إما أن تذهب -> {res2} (Expected: إما أن تذهب)")
    
    # 2.5 Trailing Hamza Destruction
    res = post.fix_hamza_conservative("قرأ الكتاب")
    print(f"2.5 [1]: قرأ -> {res} (Expected: قرأ الكتاب)")
    res2 = post.fix_hamza_conservative("مبدأ جديد")
    print(f"2.5 [2]: مبدأ -> {res2} (Expected: مبدأ جديد)")
    
    # 2.9 Destructive Word Repetition Removal
    res = post.remove_word_repetition_with_wa("صنفا وصنفا")
    print(f"2.9 [1]: صنفا وصنفا -> {res} (Expected: صنفا وصنفا)")
    res2 = post.remove_word_repetition_with_wa("رجل ورجل")
    print(f"2.9 [2]: رجل ورجل -> {res2} (Expected: رجل ورجل)")
    
    # 2.11 Destruction of Badal Structures
    res = post.remove_hallucinations("الأستاذ أستاذ الرياضيات")
    print(f"2.11 [1]: الأستاذ أستاذ -> {res} (Expected: الأستاذ أستاذ الرياضيات)")
    res2 = post.remove_hallucinations("الكتاب كتاب النحو")
    print(f"2.11 [2]: الكتاب كتاب -> {res2} (Expected: الكتاب كتاب النحو)")

    print("\nTests completed.")

if __name__ == '__main__':
    run_tests()