feat(bot): centralize defaults, refine ambiguity lifecycle, improve entity resolution and auto-create new projects
This commit is contained in:
+11
-5
@@ -37,14 +37,18 @@ def _rank(query: str, items: list[Candidate], limit: int = 6) -> list[Candidate]
|
||||
scored = []
|
||||
for item in items:
|
||||
name = normalize_text(item.name)
|
||||
ratio = difflib.SequenceMatcher(None, q, name).ratio()
|
||||
if q == name:
|
||||
ratio = 1.0
|
||||
elif q in name:
|
||||
ratio += 0.35
|
||||
scored.append((ratio, item))
|
||||
elif q in name and len(q) >= 3:
|
||||
ratio = 0.85 + 0.15 * (len(q) / len(name))
|
||||
elif name in q and len(name) >= 3:
|
||||
ratio = 0.85 + 0.15 * (len(name) / len(q))
|
||||
else:
|
||||
ratio = difflib.SequenceMatcher(None, q, name).ratio()
|
||||
if ratio >= 0.72:
|
||||
scored.append((ratio, item))
|
||||
scored.sort(key=lambda pair: (-pair[0], pair[1].name))
|
||||
return [item for ratio, item in scored[:limit] if ratio >= 0.40]
|
||||
return [item for ratio, item in scored[:limit]]
|
||||
|
||||
|
||||
async def _db_units() -> list[Candidate]:
|
||||
@@ -259,6 +263,8 @@ class Resolver:
|
||||
top = candidates[0]
|
||||
top_norm = normalize_text(top.name)
|
||||
ratio = difflib.SequenceMatcher(None, norm_name, top_norm).ratio()
|
||||
if (norm_name in top_norm or top_norm in norm_name) and len(norm_name) >= 3:
|
||||
ratio = max(ratio, 0.90)
|
||||
if ratio >= 0.88 and (len(candidates) == 1 or ratio > 0.95):
|
||||
return Resolution("one", [top])
|
||||
return Resolution("many", candidates)
|
||||
|
||||
Reference in New Issue
Block a user