公式处理器 处理流程: 1. 从 Pix2Text 结果提取有效公式 2. 计算公式与 layout OCR 文字块的重叠 3. 用公式替换被覆盖的文字块 4. 保留未被覆盖的 layout OCR 文字块
| 38 | |
| 39 | |
| 40 | class FormulaProcessor: |
| 41 | """ |
| 42 | 公式处理器 |
| 43 | |
| 44 | 处理流程: |
| 45 | 1. 从 Pix2Text 结果提取有效公式 |
| 46 | 2. 计算公式与 layout OCR 文字块的重叠 |
| 47 | 3. 用公式替换被覆盖的文字块 |
| 48 | 4. 保留未被覆盖的 layout OCR 文字块 |
| 49 | """ |
| 50 | |
| 51 | # 数学符号指示器 |
| 52 | MATH_INDICATORS = [ |
| 53 | '\\frac', '\\sum', '\\int', '\\prod', '\\approx', '\\equiv', |
| 54 | '\\neq', '\\leq', '\\geq', '=', '\\mathbb', '\\mathbf', |
| 55 | '\\pi', '\\theta', '\\sigma', '_', '^', '\\sqrt', |
| 56 | '_t', '_i', '_j', '_{' |
| 57 | ] |
| 58 | |
| 59 | # 无效模式(Pix2Text 误识别) |
| 60 | INVALID_PATTERNS = [ |
| 61 | '\\Updownarrow', |
| 62 | '\\dagger', '\\hat{\\varUpsilon}', |
| 63 | '\\underline', '\\underbrace', '\\overbrace', |
| 64 | '\\varPsi', '\\vdots', '\\Im', |
| 65 | '\\widehat{\\left\\{', # 误识别的图形元素 |
| 66 | ] |
| 67 | |
| 68 | # 重复模式检测(如 \b=\b=\b= 或 \\Xi}\\Xi}) |
| 69 | REPETITIVE_PATTERN = re.compile(r'(.{2,10}?)\1{3,}') |
| 70 | |
| 71 | # LaTeX 命令替换 |
| 72 | LATEX_REPLACEMENTS = [ |
| 73 | ('\\boldsymbol', '\\mathbf'), |
| 74 | ('\\cfrac', '\\frac'), |
| 75 | (r'\ ', ' '), |
| 76 | ('\\mathrm{o l d}', '\\text{old}'), |
| 77 | # 修复误识别的圈乘符号 |
| 78 | ('\\circledR', '\\otimes'), |
| 79 | ('\\copyright', '\\otimes'), |
| 80 | ('\\textcircled{x}', '\\otimes'), |
| 81 | ('\\textcircled{\\times}', '\\otimes'), |
| 82 | ('\\textcircled{r}', '\\otimes'), |
| 83 | ('\\textcircled{R}', '\\otimes'), |
| 84 | ] |
| 85 | |
| 86 | def __init__(self, overlap_threshold: float = 0.2, text_similarity_threshold: float = 0.8): |
| 87 | """ |
| 88 | 初始化公式处理器 |
| 89 | |
| 90 | Args: |
| 91 | overlap_threshold: 覆盖率阈值 |
| 92 | text_similarity_threshold: 文本相似度阈值 |
| 93 | """ |
| 94 | self.overlap_threshold = overlap_threshold |
| 95 | self.text_similarity_threshold = text_similarity_threshold |
| 96 | |
| 97 | def merge_ocr_results( |
no outgoing calls
no test coverage detected