Files
doc_processer/docs/LATEX_PROTECTION_FINAL_FIX.md

156 lines
4.0 KiB
Markdown
Raw Normal View History

2026-02-05 13:18:55 +08:00
# 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. 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` 的自定义命令
- 所有变量名和下标
## 可选方案
如果确实需要微分规范化,代码中提供了上下文感知版本:
```python
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. 🧪 **测试验证**:
```bash
python test_disabled_differential_norm.py
```
## 测试验证
```python
# 应该全部保持不变
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` 的图片!