dp-zp-agent/tools/retrieval/question_constraints.py

56 lines
3.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Fail closed for recognized query operators without an implemented meaning."""
import re
def requested_years(question: str) -> list[int]:
"""An unquoted four-digit year remains a condition without 'v roku'."""
from .work_selector import selector_years
return selector_years(question)
def unsupported_constraint(question: str) -> str | None:
from .work_selector import parse_work_selector
selection=parse_work_selector(question)
if selection.unsupported_negation:return 'exclusion'
text=selection.positive_text
# Do not treat words inside quoted academic titles as query operators.
text = re.sub(r'[„“"«][^„“”"»]+[“”"»]', ' ', text)
academic = re.search(r'\b(?:prac\w*|projekt\w*)\b',text)
completion = re.search(r'\b(?:ukonc\w*|dokonc\w*|obhaj\w*|odovzd\w*|stihn\w*)\b',text)
if academic and completion and (re.search(r'\b(?:tymto tempom|predpoved\w*|predik\w*|stihne|stihnu)\b',text) or
re.search(r'\b(?:ukonci|ukoncia|dokonci|dokoncia|obhaji|obhaja)\b',text) or
(re.search(r'\bodhad\w*\b',text) and
re.search(r'\b(?:ukonc\w*|dokonc\w*|obhaj\w*)\b',text))):
return 'completion_prediction'
if (re.search(r'\b(?:rok\w*|datum\w*|kedy)\b',text) and
re.search(r'\b(?:obhajob\w*|obhajil\w*|dokonc\w*|ukonc\w*|zacal\w* pracovat)\b',text) and academic):
return 'work_event_date'
if re.search(r'\b(?:od|do|pred|po|medzi)\s+(?:rok(?:om|mi|u)?\s+)?\d{4}\b|\b\d{4}\s*[-–]\s*\d{4}\b', text):
return 'year_range'
number = (r'(?:\d+|jeden|jedna|jedno|jednu|jednej|jedneho|dva|dve|dvoch|dvom|dvoma|'
r'tri|troch|trom|troma|styri|styroch|styrom|pat\w*|piat\w*|sest\w*|siest\w*|'
r'sedem\w*|siedm\w*|osem\w*|osm\w*|devat\w*|deviat\w*|desat\w*|desiat\w*|'
r'jedenast\w*|dvanast\w*|trinast\w*|strnast\w*|dvadsat\w*)')
if re.search(r'\b(?:aspon|najmenej|najviac|viac ako|menej ako|minimalne|maximalne)\s+'+number+r'\b', text):
return 'quantity_condition'
if re.search(r'\b(?:okrem|s vynimkou)\b|\b(?:nema|nemaju)\s+(?:tag|klucov|kategori|prac|projekt)|'
r'\bbez\s+(?:tagu|klucoveho slova|kategorie)\b', text):
return 'exclusion'
if re.search(r'\b(?:tag\w*|klucov\w*\s+slov\w*)\s+\w+\s+alebo\s+\w+', text):
return 'alternative_tags'
return None
def constraint_message(code: str) -> str:
return {
'completion_prediction':'Z dostupných poznámok neviem spoľahlivo predpovedať, kto a kedy dokončí prácu. '
'Môžem vyhľadať práce evidované v konkrétnom roku; to nie je odhad ich dokončenia.',
'work_event_date':'Rok uvedený pri práci nepreukazuje dátum jej začatia, dokončenia alebo obhajoby. '
'Chceš zistiť rok evidovaný pri práci?',
'year_range': 'Časovú podmienku neviem spoľahlivo vyhodnotiť ako interval. Uveď konkrétny rok práce.',
'quantity_condition': 'Podmienku na minimálny alebo maximálny počet neviem spoľahlivo vyhodnotiť. '
'Požiadaj najprv o konkrétny zoznam alebo počet.',
'exclusion': 'Vylučovaciu podmienku neviem spoľahlivo vyhodnotiť. Uveď, ktoré vlastnosti majú výsledky spĺňať.',
'alternative_tags': 'Uveď, či požaduješ oba tagy zároveň, alebo vyhľadávanie pre každý tag samostatne.',
}[code]