53 lines
2.2 KiB
Markdown
53 lines
2.2 KiB
Markdown
# Tracked Replace 相邻文本检查(2026-06-26 CT维保合同教训)
|
|
|
|
## 问题场景
|
|
|
|
R1 reviewer 发现「造与」→「造成」的 typo(R1-009),editor 执行 tracked_replace 修复。R2 reviewer 复核时发现修复后的文本为「造成济损失」——缺少「经」字,应为「造成经济损失」。
|
|
|
|
## 根因
|
|
|
|
原文为「造与与济损失」——**双重 typo**:
|
|
1. 「造与」→ 应为「造成」(R1-009 已发现)
|
|
2. 「济损失」→ 应为「经济损失」(**R1 reviewer 未发现**)
|
|
|
|
Editor 修复了 R1-009 后,渲染文本为「造成济损失」,第二个 typo 仍然存在。
|
|
|
|
## 教训
|
|
|
|
**tracked_replace 不是「只检查那一处」的信号**。当 editor 在一个段落内执行了 tracked_replace 后,reviewer 复核时必须:
|
|
|
|
1. **提取整个段落的「接受修订后」渲染文本**(`accept_revisions_text`),不只看 track change 标记
|
|
2. **逐字通读整个段落**,检查是否有:
|
|
- 与被修复 typo 相邻的**其他 typo**(如本例「济损失」缺「经」)
|
|
- tracked_replace 操作**意外引入**的新错误(如删多了字、删错了位置)
|
|
- 双重 DEL 导致的**文本碎片化**(如「造[-与-]成[- -][-与-]济损失」)
|
|
|
|
## 验证方法
|
|
|
|
```python
|
|
# 对每个有 WB track changes 的段落,提取接受修订后的完整文本
|
|
def accept_revisions_text(p):
|
|
result = []
|
|
for elem in p.iter():
|
|
if elem.tag == qn('delText'):
|
|
continue
|
|
if elem.tag == qn('t'):
|
|
parent = elem.getparent()
|
|
if parent is not None and parent.tag == qn('del'):
|
|
continue # skip runs inside w:del
|
|
if elem.text:
|
|
result.append(elem.text)
|
|
return ''.join(result)
|
|
|
|
# 复核时对每个被修改的段落,输出完整渲染文本
|
|
for pi in modified_paragraphs:
|
|
text = accept_revisions_text(paras[pi])
|
|
print(f"P{pi}: {text}")
|
|
```
|
|
|
|
## 审查清单补充
|
|
|
|
复核轮的文字校对,在「逐字通读」基础上,对**每个有 WB track changes 的段落**额外执行:
|
|
- 全文输出该段落的接受修订后文本
|
|
- 人工逐字通读,检查是否有遗漏的 typo
|
|
- 特别注意 tracked_replace 操作的**边界**(DEL/INS 前后的原文 run) |