from copy import deepcopy import json class Test: _zero_state = {"value":-1, "responses":[]} names = ["БМ", "ДС", "ІС", "АД", "ЕС", "ОШ", "АК", "АШ", "ФС", "МВ", "НГ", "НП"] def __init__(self): self.data = self.read_test_data() self.descriptions = self.read_txt("images/descriptions.txt") self.full_names = self.read_txt("photos/names.txt") self.titles = self.read_txt("photos/titles.txt") def __len__(self): return len(self.data) @property def zero_state(self): state = deepcopy(self._zero_state) return state @staticmethod def read_test_data(): with open("test.json") as f: test_data = json.load(f) return test_data @staticmethod def read_txt(path): with open(path) as f: lines = f.readlines() clean_lines = [line.strip() for line in lines] return clean_lines def get_question(self, idx): question = self.data[idx]["question"] return question def get_answers(self, idx): responces = self.data[idx]["responces"] answers = [responce["answer"] for responce in responces] return answers def get_description(self, idx): description = self.descriptions[idx] return description def get_image_path(self, idx): image_path = f"images/{idx}.jpg" return image_path def get_photos_path(self, idx): image_path = f"photos/{idx}.jpg" return image_path def convert_to_answer_ids(self, responces): answer_ids = [] for idx, responce in enumerate(responces): answers = self.get_answers(idx) index = answers.index(responce) answer_ids.append(index) return answer_ids def total_name_count(self): name_count = {name: 0 for name in self.names} for question in self.data: for answer in question["responces"]: for name in answer["name"]: name_count[name] += 1 return name_count def current_name_count(self, answer_ids): name_count = {name: 0 for name in self.names} for question, answer_idx in zip(self.data, answer_ids): answer = question["responces"][answer_idx] for name in answer["name"]: name_count[name] += 1 return name_count def select_best(self, answer_ids): total_name_count = self.total_name_count() current_name_count = self.current_name_count(answer_ids) name_percent = {} for name in self.names: percent = current_name_count[name] / total_name_count[name] name_percent[name] = percent best_name = self.dict_max(name_percent) return best_name @staticmethod def dict_max(dict): key = max(dict, key=dict.get) max_key_index = list(dict.keys()).index(key) return max_key_index