""" UniMERNet & Micro-Math Post-Processor for Math OCR Pipeline. Translates complex 2D LaTeX representations into compact UTN28 UnicodeMath strings. """ import re def clean_and_normalize_unicodemath(text: str) -> str: """ Säubert und normalisiert Formel-Strings nach den UTN28 UnicodeMath Standards. Behebt fehlende Klammern, fehlerhafte Indizes und LaTeX-Restbestände. """ if not text: return "" s = text.strip() # 1. Ersetze LaTeX-Befehle durch echte Unicode-Zeilen latex_replacements = { r'\alpha': 'α', r'\beta': 'β', r'\gamma': 'γ', r'\delta': 'δ', r'\Delta': 'Δ', r'\epsilon': 'ε', r'\eta': 'η', r'\theta': 'θ', r'\kappa': 'κ', r'\lambda': 'λ', r'\mu': 'μ', r'\nu': 'ν', r'\xi': 'ξ', r'\pi': 'π', r'\rho': 'ρ', r'\sigma': 'σ', r'\Sigma': 'Σ', r'\tau': 'τ', r'\phi': 'φ', r'\Phi': 'Φ', r'\psi': 'ψ', r'\omega': 'ω', r'\Omega': 'Ω', r'\int': '∫', r'\iint': '∬', r'\iiint': '∭', r'\sum': '∑', r'\prod': '∏', r'\sqrt': '√', r'\partial': '∂', r'\infty': '∞', r'\approx': '≈', r'\neq': '≠', r'\le': '≤', r'\ge': '≥', r'\pm': '±', r'\cdot': '·', r'\times': '×', r'\rightarrow': '→', r'\in': '∈', r'\forall': '∀', r'\quad': ' ', r'\qquad': ' ', r'\;': ' ', r'\,': ' ' } for k, v in latex_replacements.items(): s = s.replace(k, v) # 2. Behebe LaTeX \frac{a}{b} -> (a)/(b) frac_pattern = re.compile(r'\\frac\{([^{}]+)\}\{([^{}]+)\}') while frac_pattern.search(s): s = frac_pattern.sub(r'(\1)/(\2)', s) # 3. Entferne verbliebene $ oder \ s = s.replace('$', '').replace('\\', '') # 4. Formatiere doppelte Klammern sauber s = re.sub(r'\s+', ' ', s) return s.strip()