Add lexical and service-intent indexes
This commit is contained in:
1 parent
8e1e0f82a2
commit
da8ad74498
2 files changed
+218
No files matched your search
@@ -0,0 +1,54 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from app.normalization import normalize_text, tokenize
|
||||
from app.typo import word_similarity
|
||||
|
||||
SERVICE_INTENTS = {
|
||||
"opening_hours": [
|
||||
("до", "скольки", "работаете"),
|
||||
("режим", "работы"),
|
||||
("график", "работы"),
|
||||
],
|
||||
"payment": [
|
||||
("оплата", "картой"),
|
||||
("оплатить", "картой"),
|
||||
("наличными", "при", "получении"),
|
||||
],
|
||||
"location": [
|
||||
("где", "магазин"),
|
||||
("адрес", "магазина"),
|
||||
("как", "доехать"),
|
||||
],
|
||||
"order_status": [
|
||||
("статус", "заказа"),
|
||||
("где", "мой", "заказ"),
|
||||
],
|
||||
"thanks": [
|
||||
("спасибо", "заказ", "получил"),
|
||||
("все", "отлично"),
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
def _token_present(expected: str, tokens: tuple[str, ...]) -> bool:
|
||||
for token in tokens:
|
||||
if token == expected:
|
||||
return True
|
||||
if min(len(token), len(expected)) >= 5 and word_similarity(token, expected) >= 0.72:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def detect_service_intent(text: str) -> str | None:
|
||||
"""Detect a known non-product intent after product evidence has failed.
|
||||
|
||||
This is deliberately phrase/token based rather than a blacklist of words
|
||||
such as ``подскажите``: those words are valid in product requests too.
|
||||
"""
|
||||
|
||||
tokens = tokenize(normalize_text(text), already_normalized=True)
|
||||
for intent, phrases in SERVICE_INTENTS.items():
|
||||
for phrase in phrases:
|
||||
if all(_token_present(expected, tokens) for expected in phrase):
|
||||
return intent
|
||||
return None
|
||||
Reference in new issue
Block a user