ocr-app-private / unimernet_decoder.py
MasterSayn's picture
Upload unimernet_decoder.py with huggingface_hub
80c6c39 verified
Raw History Blame Contribute Delete
1.8 kB
"""
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()