56 lines
3.4 KiB
Python
56 lines
3.4 KiB
Python
"""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]
|