4.0 KiB
4.0 KiB
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
修改内容:
- 更新正则表达式(增加前后保护)
- 禁用 Stage 2 微分规范化(注释掉相关代码)
保留的功能
| Stage | 功能 | 状态 | 说明 |
|---|---|---|---|
| 0 | 数字错误修复 | ✅ 保留 | 2 2. 2 → 22.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
默认不启用,用户可自行评估是否需要。
部署步骤
- ✅ 代码已修改
- ✅ 无语法错误
- 🔄 重启服务
- 🧪 测试验证:
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 后处理应遵循的原则:
- ✅ 只修复明确的错误(数字错误、粘连命令)
- ✅ 保守而不是激进(宁可不改也不要改错)
- ✅ 基于白名单(只处理已知情况)
- ❌ 不依赖语义理解(无法区分微分和变量名)
- ❌ 不做"智能"猜测(猜错代价太高)
核心原则: Do No Harm - 不确定的时候,不要修改。
相关文档
- 详细报告:
docs/DISABLE_DIFFERENTIAL_NORMALIZATION.md - 测试脚本:
test_disabled_differential_norm.py - 之前的修复:
docs/DIFFERENTIAL_PATTERN_BUG_FIX.md
总结
| 修改 | 状态 |
|---|---|
| 禁用微分规范化 | ✅ 完成 |
| 保护 LaTeX 命令 | ✅ 完成 |
| 保留数字修复 | ✅ 保留 |
| 保留命令拆分 | ✅ 保留 |
| 无语法错误 | ✅ 验证 |
| 等待重启验证 | 🔄 待完成 |
下一步: 重启服务,测试包含 \vdots 和 \lambda 的图片!