Commit ·
8fc62c2
1
Parent(s): 4629595
fix: Fatiha priority when query starts with Basmala + strip Basmala from search + restore honest tests
Browse files- quran.py +32 -0
- 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 |
-
# الفاتحة -
|
| 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("الفاتحة:
|
| 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", ""))
|