Normalize a final answer to a quantitative reasoning question.
(final_answer: str)
| 66 | |
| 67 | |
| 68 | def normalize_final_answer(final_answer: str) -> str: |
| 69 | """Normalize a final answer to a quantitative reasoning question.""" |
| 70 | # final_answer = final_answer.split('=')[-1] |
| 71 | SUBSTITUTIONS = [('an ', ''), ('a ', ''), ('.$', '$'), ('\\$', ''), |
| 72 | (r'\ ', ''), (' ', ''), ('mbox', 'text'), |
| 73 | (',\\text{and}', ','), ('\\text{and}', ','), |
| 74 | ('\\text{m}', '\\text{}'), ('\\le', '<')] |
| 75 | REMOVED_EXPRESSIONS = [ |
| 76 | 'square', 'ways', 'integers', 'dollars', 'mph', 'inches', 'ft', |
| 77 | 'hours', 'km', 'units', '\\ldots', 'sue', 'points', 'feet', 'minutes', |
| 78 | 'digits', 'cents', 'degrees', 'cm', 'gm', 'pounds', 'meters', 'meals', |
| 79 | 'edges', 'students', 'childrentickets', 'multiples', '\\text{s}', |
| 80 | '\\text{.}', '\\text{\ns}', '\\text{}^2', '\\text{}^3', '\\text{\n}', |
| 81 | '\\text{}', r'\mathrm{th}', r'^\circ', r'^{\circ}', r'\;', r',\!', |
| 82 | '{,}', '"', '\\dots', '\n', '\r', '\f' |
| 83 | ] |
| 84 | for before, after in SUBSTITUTIONS: |
| 85 | final_answer = final_answer.replace(before, after) |
| 86 | for expr in REMOVED_EXPRESSIONS: |
| 87 | final_answer = final_answer.replace(expr, '') |
| 88 | |
| 89 | # Extract answer that is in LaTeX math, is bold, |
| 90 | # is surrounded by a box, etc. |
| 91 | final_answer = re.sub(r'(\\text\{)\((.*?)\)(\})', '\\2', final_answer) |
| 92 | final_answer = re.sub(r'(\\text\{)(.*?)(\})', '\\2', final_answer) |
| 93 | final_answer = re.sub(r'(\\textbf\{)(.*?)(\})', '\\2', final_answer) |
| 94 | final_answer = re.sub(r'(\\overline\{)(.*?)(\})', '\\2', final_answer) |
| 95 | final_answer = re.sub(r'(\\boxed\{)(.*)(\})', '\\2', final_answer) |
| 96 | assert '\n' not in final_answer |
| 97 | assert '\r' not in final_answer |
| 98 | assert '\f' not in final_answer |
| 99 | if len(re.findall(r'finalansweris(.*)', final_answer)) > 0: |
| 100 | final_answer = re.findall(r'finalansweris(.*)', final_answer)[-1] |
| 101 | |
| 102 | if len(re.findall(r'answer?is:?(.*)', final_answer)) > 0: |
| 103 | final_answer = re.findall(r'answer?is:?(.*)', final_answer)[-1] |
| 104 | |
| 105 | if len(re.findall(r'oxed\{(.*?)\}', final_answer)) > 0: |
| 106 | final_answer = re.findall(r'oxed\{(.*?)\}', final_answer)[-1] |
| 107 | |
| 108 | if len(re.findall(r'\$(.*?)\$', final_answer)) > 0: |
| 109 | final_answer = re.findall(r'\$(.*?)\$', final_answer)[-1] |
| 110 | final_answer = final_answer.strip() |
| 111 | if 'rac' in final_answer and '\\frac' not in final_answer: |
| 112 | final_answer = final_answer.replace('rac', '\\frac') |
| 113 | |
| 114 | # Normalize shorthand TeX: |
| 115 | # \fracab -> \frac{a}{b} |
| 116 | # \frac{abc}{bef} -> \frac{abc}{bef} |
| 117 | # \fracabc -> \frac{a}{b}c |
| 118 | # \sqrta -> \sqrt{a} |
| 119 | # \sqrtab -> sqrt{a}b |
| 120 | final_answer = re.sub(r'(frac)([^{])(.)', 'frac{\\2}{\\3}', final_answer) |
| 121 | final_answer = re.sub(r'(sqrt)([^{])', 'sqrt{\\2}', final_answer) |
| 122 | final_answer = final_answer.replace('$', '') |
| 123 | |
| 124 | # Normalize 100,000 -> 100000 |
| 125 | if final_answer.replace(',', '').isdigit(): |
no test coverage detected