Spaces:
Running
Running
fix: drug detection Türkçe ek toleransı (prefix match) — 'lasirini'→'lasirin'
Browse files- app/retrieval.py +21 -6
app/retrieval.py
CHANGED
|
@@ -114,19 +114,34 @@ def rerank_jina(query: str, docs: list, top_n: int = 5) -> list:
|
|
| 114 |
return docs[:top_n]
|
| 115 |
|
| 116 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 117 |
def detect_drug_id(query: str) -> Optional[str]:
|
| 118 |
-
"""Sorguda geçen ilk (en uzun) drug_id'yi bulur.
|
| 119 |
-
|
| 120 |
q_norm = _normalize(query)
|
| 121 |
-
q_tokens =
|
|
|
|
| 122 |
for did in DRUG_IDS:
|
| 123 |
d_tokens = _normalize(did).split()
|
| 124 |
-
if d_tokens and all(t
|
| 125 |
return did
|
| 126 |
-
#
|
| 127 |
for did in DRUG_IDS:
|
| 128 |
brand = _normalize(did).split()[0] if did else ""
|
| 129 |
-
if brand and brand
|
| 130 |
return did
|
| 131 |
return None
|
| 132 |
|
|
|
|
| 114 |
return docs[:top_n]
|
| 115 |
|
| 116 |
|
| 117 |
+
def _token_matches(d_tok: str, q_tokens: list) -> bool:
|
| 118 |
+
"""drug-token sorgu token'larında tam eşleşiyor VEYA bir token'ın prefix'i ise True.
|
| 119 |
+
Prefix toleransı yalnızca alfabetik ve >=4 karakterli token'lar için: Türkçe ekleri
|
| 120 |
+
yutmak amaçlı ('lasirini' → 'lasirin', 'parolün' → 'parol', 'majezikten' → 'majezik').
|
| 121 |
+
Sayılar/kısa birimler ('40', 'mg') tam eşleşmeli."""
|
| 122 |
+
if d_tok in q_tokens:
|
| 123 |
+
return True
|
| 124 |
+
if d_tok.isalpha() and len(d_tok) >= 4:
|
| 125 |
+
for q in q_tokens:
|
| 126 |
+
if q.startswith(d_tok):
|
| 127 |
+
return True
|
| 128 |
+
return False
|
| 129 |
+
|
| 130 |
+
|
| 131 |
def detect_drug_id(query: str) -> Optional[str]:
|
| 132 |
+
"""Sorguda geçen ilk (en uzun) drug_id'yi bulur. Türkçe ek toleranslı:
|
| 133 |
+
'lasirini', 'parolün', 'majezikten' gibi ekli formlar marka adına eşlenir."""
|
| 134 |
q_norm = _normalize(query)
|
| 135 |
+
q_tokens = q_norm.split()
|
| 136 |
+
# 1) Multi-token tam eşleşme (ek toleranslı)
|
| 137 |
for did in DRUG_IDS:
|
| 138 |
d_tokens = _normalize(did).split()
|
| 139 |
+
if d_tokens and all(_token_matches(t, q_tokens) for t in d_tokens):
|
| 140 |
return did
|
| 141 |
+
# 2) Marka adı (ilk token) eşleşmesi yeterli
|
| 142 |
for did in DRUG_IDS:
|
| 143 |
brand = _normalize(did).split()[0] if did else ""
|
| 144 |
+
if brand and _token_matches(brand, q_tokens):
|
| 145 |
return did
|
| 146 |
return None
|
| 147 |
|