youssefreda9 commited on
Commit
8fc62c2
·
1 Parent(s): 4629595

fix: Fatiha priority when query starts with Basmala + strip Basmala from search + restore honest tests

Browse files
Files changed (2) hide show
  1. quran.py +32 -0
  2. test_quran.py +11 -3
quran.py CHANGED
@@ -153,6 +153,14 @@ def search_bayan(query_text: str,
153
 
154
  n = len(query_light)
155
 
 
 
 
 
 
 
 
 
156
  # ==========================================
157
  # البحث بالمرساة الديناميكية (من الأطول للأقصر)
158
  # ==========================================
@@ -171,6 +179,15 @@ def search_bayan(query_text: str,
171
  if candidate_starts:
172
  break
173
 
 
 
 
 
 
 
 
 
 
174
  # إذا لم تجد شيئاً بالمرساة الخفيفة → جرّب المرساة العميقة
175
  # (يستخدم text_deep إذا كان موجوداً، وإلا يعود لـ text_clean)
176
  if not candidate_starts:
@@ -244,6 +261,21 @@ def search_bayan(query_text: str,
244
  combined_light, combined_deep, word_map = [], [], []
245
  for row in fetched:
246
  s_num, a_num, t_clean, t_uthmani, t_target, s_name = row
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
247
  clean_w = t_clean.split()
248
  uthmani_w = [
249
  token
 
153
 
154
  n = len(query_light)
155
 
156
+ # ── إذا بدأ الاستعلام بالبسملة → أعطِ الفاتحة أولوية ──
157
+ # بدون ده، "بسم الله الرحمن الرحيم الحمد لله" بيطابق ١١٢ سورة
158
+ _query_starts_basmala = False
159
+ if n >= 4:
160
+ first4_q = normalize_arabic(' '.join(query_light[:4]), deep=False)
161
+ if first4_q in ['بسم الله الرحمن الرحيم', 'بسم لله لرحمن لرحيم', 'بسم لله لرحمـن لرحيم']:
162
+ _query_starts_basmala = True
163
+
164
  # ==========================================
165
  # البحث بالمرساة الديناميكية (من الأطول للأقصر)
166
  # ==========================================
 
179
  if candidate_starts:
180
  break
181
 
182
+ # إذا بدأ بالبسملة → الفاتحة أولوية
183
+ if _query_starts_basmala:
184
+ fatiha = (1, 1)
185
+ if fatiha not in candidate_starts:
186
+ candidate_starts.insert(0, fatiha)
187
+ else:
188
+ candidate_starts.remove(fatiha)
189
+ candidate_starts.insert(0, fatiha)
190
+
191
  # إذا لم تجد شيئاً بالمرساة الخفيفة → جرّب المرساة العميقة
192
  # (يستخدم text_deep إذا كان موجوداً، وإلا يعود لـ text_clean)
193
  if not candidate_starts:
 
261
  combined_light, combined_deep, word_map = [], [], []
262
  for row in fetched:
263
  s_num, a_num, t_clean, t_uthmani, t_target, s_name = row
264
+
265
+ # ── شيل البسملة من text_clean في البحث (مش الفاتحة) ──
266
+ # بدون ده، anchor "بسم الله الرحمن الرحيم" بيطابق ١١٢ سورة
267
+ if a_num == 1 and s_num != 1:
268
+ tc_words = t_clean.split()
269
+ if len(tc_words) >= 4:
270
+ first4 = normalize_arabic(' '.join(tc_words[:4]), deep=False)
271
+ basmala_norms = [
272
+ 'بسم الله الرحمن الرحيم',
273
+ 'بسم لله لرحمن لرحيم',
274
+ 'بسم لله لرحمـن لرحيم',
275
+ ]
276
+ if first4 in basmala_norms:
277
+ t_clean = ' '.join(tc_words[4:])
278
+
279
  clean_w = t_clean.split()
280
  uthmani_w = [
281
  token
test_quran.py CHANGED
@@ -64,14 +64,22 @@ test("يس موجودة", "يسٓ" in r.get("matched_segment", "") or "يس" in
64
  print("\n📖 2. البسملة")
65
  print("=" * 50)
66
 
67
- # الفاتحة - need unique verses (بسملة alone matches many surahs)
68
- r = get_result("الحمد لله رب العالمين الرحمن الرحيم مالك يوم الدين")
69
  seg = r.get("matched_segment", "")
70
  ref_match = re.search(r'【([^】]+)】', seg)
71
  ref = ref_match.group(1) if ref_match else ""
72
- test("الفاتحة: آيات ٢-٤", "لْحَمْدُ" in seg and "(٤)" in seg, f"seg={seg[:80]}")
73
  test("الفاتحة: اسم السورة", "الفاتحة" in ref, f"ref={ref}")
74
 
 
 
 
 
 
 
 
 
75
  # سورة عادية - البسملة لازم تتشال
76
  r = get_result("الر تلك آيات الكتاب المبين")
77
  test("يوسف: البسملة مش موجودة", "بِسْمِ" not in r.get("matched_segment", ""))
 
64
  print("\n📖 2. البسملة")
65
  print("=" * 50)
66
 
67
+ # الفاتحة - البسملة + الحمد لله
68
+ r = get_result("بسم الله الرحمن الرحيم الحمد لله رب العالمين")
69
  seg = r.get("matched_segment", "")
70
  ref_match = re.search(r'【([^】]+)】', seg)
71
  ref = ref_match.group(1) if ref_match else ""
72
+ test("الفاتحة: البسملة موجودة", "بِسْمِ" in seg, f"seg={seg[:60]}")
73
  test("الفاتحة: اسم السورة", "الفاتحة" in ref, f"ref={ref}")
74
 
75
+ # الفاتحة - آيات بدون بسملة
76
+ r2 = get_result("الحمد لله رب العالمين الرحمن الرحيم مالك يوم الدين")
77
+ seg2 = r2.get("matched_segment", "")
78
+ ref2 = re.search(r'【([^】]+)】', seg2)
79
+ ref2 = ref2.group(1) if ref2 else ""
80
+ test("الفاتحة ٢-٤: آيات صحيحة", "لْحَمْدُ" in seg2 and "(٤)" in seg2, f"seg={seg2[:60]}")
81
+ test("الفاتحة ٢-٤: اسم السورة", "الفاتحة" in ref2, f"ref={ref2}")
82
+
83
  # سورة عادية - البسملة لازم تتشال
84
  r = get_result("الر تلك آيات الكتاب المبين")
85
  test("يوسف: البسملة مش موجودة", "بِسْمِ" not in r.get("matched_segment", ""))