43 lines
2.4 KiB
Python
43 lines
2.4 KiB
Python
"""Fail closed for recognized query operators without an implemented meaning."""
|
||
import re
|
||
import unicodedata
|
||
|
||
|
||
def requested_years(question: str) -> list[int]:
|
||
"""An unquoted four-digit year remains a condition without 'v roku'."""
|
||
text=re.sub(r'[„“"«][^„“”"»]+[“”"»]', ' ', question)
|
||
return list(dict.fromkeys(int(value) for value in re.findall(r'\b\d{4}\b',text)))
|
||
|
||
|
||
def unsupported_constraint(question: str) -> str | None:
|
||
text = ''.join(c for c in unicodedata.normalize('NFKD', question).casefold()
|
||
if not unicodedata.combining(c))
|
||
# Do not treat words inside quoted academic titles as query operators.
|
||
text = re.sub(r'[„“"«][^„“”"»]+[“”"»]', ' ', text)
|
||
if (re.search(r'\b(?:rok\w*|datum\w*|kedy)\b',text) and
|
||
re.search(r'\b(?:obhajob\w*|obhajil\w*|dokonc\w*|ukoncil\w*|zacal\w* pracovat)\b',text) and
|
||
re.search(r'\b(?:prac\w*|projekt\w*)\b',text)):
|
||
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'
|
||
if re.search(r'\b(?:aspon|najviac|viac ako|menej ako|minimalne|maximalne)\s+\d+', 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 {
|
||
'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]
|