import random import torch def getLengthParam(text: str, tokenizer) -> str: tokens_count = len(tokenizer.encode(text)) if tokens_count <= 15: len_param = '1' elif tokens_count <= 50: len_param = '2' elif tokens_count <= 256: len_param = '3' else: len_param = '-' return len_param # Эта функция вычисляет длину ожидаемого ответа на основе инпута def calcAnswerLengthByProbability(lengthId): # Вспомогательная функция, для работы с вероятностями # На вход подаем список веротностей для длинного ответа (3), среднего(2), короткого 1 def getLenght(probList): rndNum = random.randrange(start=0, stop=100, step=1) if 0 <= rndNum <= probList[0]: return 3 elif probList[0] < rndNum <= probList[1]: return 2 else: return 1 return { lengthId == '3' or lengthId == '-': getLenght([60, 90]), # до 60 - 3, от 60 до 90 2, остальное - 1 lengthId == '2': getLenght([25, 75]), # до 25 - 3, от 25 до 75 - 2, остальное - 2 lengthId == '1': getLenght([20, 50]), # до 20 - 3, от 20 до 50 - 2, остальное - 1 }[True] # Функция для обрезки контекста # tensor - входной тензор # size - сколько ПОСЛЕДНИХ ответов нужно оставить def cropContext(tensor, size): # переводим в размерность, удобную для работы tensor = tensor[-1] # Список, содержащий начала предложений beginList = [] for i, item in enumerate(tensor): if (i < len(tensor) - 5 and item == 96 and tensor[i + 2] == 96 and tensor[i + 4] == 96): beginList.append(i) if (len(beginList) < size): return torch.unsqueeze(tensor, 0) neededIndex = beginList[-size] # Возвращаем в нужном нам формате (добавляем одну размерность) return torch.unsqueeze(tensor[neededIndex:], 0)