Spaces:
Running
on
Zero
Running
on
Zero
| # This file is originated from the official MMMU codebase: | |
| # https://github.com/MMMU-Benchmark/MMMU | |
| import random | |
| import numpy as np | |
| def parse_choice(response, all_choices, index2ans=None): | |
| """ | |
| Parse the prediction from the generated response. | |
| Return the predicted index e.g., A, B, C, D. | |
| """ | |
| for char in [",", ".", "!", "?", ";", ":", "'"]: | |
| response = response.strip(char) | |
| response = " " + response + " " # add space to avoid partial match | |
| index_ans = True | |
| ans_with_brack = False | |
| candidates = [] | |
| for choice in all_choices: # e.g., (A) (B) (C) (D) | |
| if f"({choice})" in response: | |
| candidates.append(choice) | |
| ans_with_brack = True | |
| if len(candidates) == 0: | |
| for choice in all_choices: # e.g., A B C D | |
| if f" {choice} " in response: | |
| candidates.append(choice) | |
| # if all above doesn't get candidates, check if the content is larger than 5 tokens and try to parse the example | |
| if len(candidates) == 0 and len(response.split()) > 5 and index2ans is not None: | |
| for index, ans in index2ans.items(): | |
| if ans.lower() in response.lower(): | |
| candidates.append(index) | |
| index_ans = False # it's content ans. | |
| if len(candidates) == 0: # still not get answer, randomly choose one. | |
| pred_index = random.choice(all_choices) | |
| elif len(candidates) > 1: | |
| start_indexes = [] | |
| if index_ans: | |
| if ans_with_brack: | |
| for can in candidates: | |
| index = response.rfind(f"({can})") | |
| start_indexes.append(index) # -1 will be ignored anyway | |
| # start_indexes = [generated_response.index(f'({can})') for can in candidates] | |
| else: | |
| for can in candidates: | |
| index = response.rfind(f" {can} ") | |
| start_indexes.append(index) | |
| else: | |
| for can in candidates: | |
| index = response.lower().rfind(index2ans[can].lower()) | |
| start_indexes.append(index) | |
| # get the last one | |
| pred_index = candidates[np.argmax(start_indexes)] | |
| else: # if only one candidate, use it. | |
| pred_index = candidates[0] | |
| return pred_index | |