Files
doc_processer/docs/LATEX_PROTECTION_FINAL_FIX.md
2026-02-05 13:18:55 +08:00

4.0 KiB
Raw Permalink Blame History

LaTeX 命令保护 - 最终修复方案

问题

LaTeX 命令被错误拆分:

  • \vdots\vd ots
  • \lambda_{1}\lambd a_{1}

根本原因

Stage 2 的微分规范化功能设计缺陷,会匹配任何 d + 字母的组合,无法区分:

  • 微分符号:\int dx
  • LaTeX 命令内部:\vdots, \lambda
  • 变量名:dx, dy
  • 下标:x_{dx}

解决方案

最终决定:禁用微分规范化

文件: app/services/ocr_service.py

修改内容:

  1. 更新正则表达式(增加前后保护)
  2. 禁用 Stage 2 微分规范化(注释掉相关代码)

保留的功能

Stage 功能 状态 说明
0 数字错误修复 保留 2 2. 222.2
1 拆分粘连命令 保留 \intdx\int dx
2 微分规范化 禁用 避免误判

为什么禁用而不是修复?

成本收益分析:

启用微分规范化:

  • 小收益:微分符号格式稍微规范
  • 高风险:破坏 LaTeX 命令、变量名、下标

禁用微分规范化:

  • 小损失:\int dx 不会变成 \int d x
  • 高收益:所有 LaTeX 命令和变量名都安全

结论: 风险远大于收益,禁用是正确选择。

受保护的 LaTeX 命令

禁用后,以下命令现在都是安全的:

希腊字母:

  • \delta (δ)
  • \Delta (Δ)
  • \lambda (λ)

省略号:

  • \vdots (⋮)
  • \cdots (⋯)
  • \ldots (…)
  • \ddots (⋱)
  • \iddots (⋰)

其他:

  • 所有包含 d 的自定义命令
  • 所有变量名和下标

可选方案

如果确实需要微分规范化,代码中提供了上下文感知版本:

def _normalize_differentials_contextaware(expr: str) -> str:
    """只在特定上下文中规范化微分:
    1. 积分后:\\int dx → \\int d x
    2. 分式分母:\\frac{dy}{dx}\\frac{dy}{d x}
    """
    # 实现见 ocr_service.py

默认不启用,用户可自行评估是否需要。

部署步骤

  1. 代码已修改
  2. 无语法错误
  3. 🔄 重启服务
  4. 🧪 测试验证:
    python test_disabled_differential_norm.py
    

测试验证

# 应该全部保持不变
assert process(r"\vdots") == r"\vdots"           # ✅
assert process(r"\lambda_{1}") == r"\lambda_{1}" # ✅
assert process(r"\delta") == r"\delta"           # ✅
assert process(r"dx") == r"dx"                   # ✅
assert process(r"x_{dx}") == r"x_{dx}"           # ✅

# OCR 错误修复仍然工作
assert process(r"\intdx") == r"\int dx"          # ✅
assert process("2 2. 2") == "22.2"               # ✅

影响分析

正面影响

  • LaTeX 命令不再被破坏
  • 变量名和下标不再被误改
  • 误判风险大幅降低
  • 代码更简单,更易维护
  • 处理速度略微提升

⚠️ 潜在影响

  • 微分符号不再自动规范化
    • \int dx 不会变成 \int d x
    • 但两者都是有效的 LaTeX渲染效果相同

📊 总体评估

正向改进:风险降低远大于功能损失

设计哲学

OCR 后处理应遵循的原则:

  1. 只修复明确的错误(数字错误、粘连命令)
  2. 保守而不是激进(宁可不改也不要改错)
  3. 基于白名单(只处理已知情况)
  4. 不依赖语义理解(无法区分微分和变量名)
  5. 不做"智能"猜测(猜错代价太高)

核心原则: Do No Harm - 不确定的时候,不要修改。

相关文档

  • 详细报告: docs/DISABLE_DIFFERENTIAL_NORMALIZATION.md
  • 测试脚本: test_disabled_differential_norm.py
  • 之前的修复: docs/DIFFERENTIAL_PATTERN_BUG_FIX.md

总结

修改 状态
禁用微分规范化 完成
保护 LaTeX 命令 完成
保留数字修复 保留
保留命令拆分 保留
无语法错误 验证
等待重启验证 🔄 待完成

下一步: 重启服务,测试包含 \vdots\lambda 的图片!