import re def tokenize(text: str) -> list[str]: # Удаляем пунктуацию и приводим текст к нижнему регистру text = re.sub(r'[^\w\s]', '', text.lower()) return text.split() def use_rules(query: str, terms: list[str]) -> bool: query_tokens = tokenize(query) pairs = [ ( ['написать', 'отразить', 'заполнить', 'сформулировать', 'составить', 'отражать', 'заполнять'], ['как', 'каким'] ), ( ['заполнения', 'написания', 'составления', 'формулирования', 'отражения', 'расчета', 'расчёта'], ['правила', 'порядок'] ), ( ['написать', 'отразить', 'заполнить', 'сформулировать', 'составить', 'отразить'], ['нужно', 'необходимо', 'требуется'] ), ( [r'заполнени\w', r'написани\w', r'составлени\w', r'формулировани\w', r'формулировк\w', r'отражени\w', r'расчет\w?', r'расчёт\w?'], ['описать'] ), ( ['заполнение', 'написание', 'составление', 'формулирование', 'отражение', 'расчет', 'расчёт', 'формулировка'], [r'корректн\w\w?', r'корректность'] ), ( ['заполнению', 'написанию', 'составлению', 'формулированию', 'отражению', 'расчету', 'расчёту', 'формулировке'], ['рекомендации по'] ) ] for first_list, second_list in pairs: first_positions = [] second_positions = [] for i, token in enumerate(query_tokens): for first_item in first_list: if re.fullmatch(first_item, token): first_positions.append(i) for second_item in second_list: if re.fullmatch(second_item, token): second_positions.append(i) for pos1 in first_positions: for pos2 in second_positions: if abs(pos1 - pos2) <= 3: return True for term in terms: if term.lower() in query.lower(): return True return False