File size: 2,620 Bytes
b24d496
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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