diff --git a/klausur-service/backend/cv_ocr_engines.py b/klausur-service/backend/cv_ocr_engines.py index ba2d1e1..4bed09b 100644 --- a/klausur-service/backend/cv_ocr_engines.py +++ b/klausur-service/backend/cv_ocr_engines.py @@ -1881,6 +1881,11 @@ def _is_noise_tail_token(token: str) -> bool: if t.endswith(']'): return False + # Keep meaningful punctuation tokens used in textbooks + # = (definition marker), (= (definition opener), ; (separator) + if t in ('=', '(=', '=)', ';', ':', '-', '–', '—', '/', '+', '&'): + return False + # Pure non-alpha → noise ("3", ")", "|") alpha_chars = _RE_ALPHA.findall(t) if not alpha_chars: diff --git a/klausur-service/backend/grid_build_core.py b/klausur-service/backend/grid_build_core.py index 037c578..954aef8 100644 --- a/klausur-service/backend/grid_build_core.py +++ b/klausur-service/backend/grid_build_core.py @@ -1575,7 +1575,10 @@ async def _build_grid_core( if not core: is_artifact = True elif _PURE_JUNK_RE.match(core): - is_artifact = True + # Keep meaningful punctuation tokens used in textbooks + # = (definition), (= (definition), ; : - are valid content + if core.strip() not in ('=', '(=', '=)', ';', ':', '-', '–', '—'): + is_artifact = True elif len(core) <= 2 and core.lower() not in _COMMON_SHORT_WORDS and not core.isalpha(): # Short non-alphabetic text like "a=", not word beginnings like "Zw" is_artifact = True