emrecn commited on
Commit
2665f1f
·
1 Parent(s): c2a8ce2

fix: drug detection Türkçe ek toleransı (prefix match) — 'lasirini'→'lasirin'

Browse files
Files changed (1) hide show
  1. 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. İsim tüm tokenları
119
- sorguda geçiyorsa eşleşme sayılır."""
120
  q_norm = _normalize(query)
121
- q_tokens = set(q_norm.split())
 
122
  for did in DRUG_IDS:
123
  d_tokens = _normalize(did).split()
124
- if d_tokens and all(t in q_tokens for t in d_tokens):
125
  return did
126
- # fallback: ilk token (marka adı) yeterli
127
  for did in DRUG_IDS:
128
  brand = _normalize(did).split()[0] if did else ""
129
- if brand and brand in q_tokens:
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