bayan-api / src /nlp /test_bugs.py
youssefreda9's picture
Fix 30 NLP edge cases in Grammar, Spelling, and Punctuation (Phase 10 results and Extension UI improvements)
be32617
Raw
History Blame Contribute Delete
8.33 kB
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()