- 删除 GOVDOC_SAAS_CLEANING_SCOPE.md 的 4.11 S001(敏感信息)整节, 及结论摘要中对应的第 7 条合规风险要点; - reference/ 与 scratch/ 已有实际内容,移除占位 .gitkeep。
17 KiB
7 组对比测试文档 Markdown 清洗审计与实施规范
- 审计日期:2026-08-20
- 审计目录:
/home/lihaoze/gov_test_data/compare - 清洗对象:7 个测试用例中
uploads/下的 45 份 Markdown - 背景资料:
compare/readme.md与各用例README.md - 本次操作:只读审计;没有修改任何原始测试文档
1. 结论摘要
这批 Markdown 目前不适合直接作为“语义可靠”的清洗后基准。问题并不只是在空格、换行和标题层级,而是同时存在以下几类高风险污染:
- 内容级污染:至少 32/45 份文件命中了保守的模型幻觉特征词,合计 1,703 次;典型内容包括
The quick brown fox...、勾股定理说明、The image contains...、The steps are:等与投标文件无关的文本。 - 图像内容丢失:45/45 份文件都有图片引用,共 8,471 个,但目录中没有任何图片资产;其中 4,012 个引用只是字面量
data:image/...;base64...,并不包含可解码数据。 - 表格结构损坏:41 份文件含原始 HTML 表格,共 7,550 个
<table>;35/41 份存在<table>/<tr>/<td>数量不平衡。另有 4 份 007 用例文档使用 GFM 表格,其中 203 个表格块里至少 60 个行列数不一致。 - 重复和超长噪声:出现 261,838 字符的单行点线、数万字符的重复英语句子、LaTeX 箭头/颜色命令和重复汉字。001 两份文件的非空行重复比例分别达到 81.8% 和 84.1%。
- 结构扁平化:全库 29,358 个 Markdown 标题中有 28,736 个是一级标题,占 97.9%;至少 378 个标题缺少空格、只有
#或存在其他明显语法问题。 - 字符与格式污染:有 10 个替换字符
�、20 个私用区字符、11 个 NBSP、5 个零宽字符、1,474 个多余的\-转义,以及 151,616 行尾部双空格。
最重要的实施建议是:不要只产出一份“清洗 Markdown”。应同时产出:
clean_fidelity.md:忠实版,保留有法律/业务意义的全部内容,所有修复必须能追溯到源文件。clean_compare.md:对比版,从忠实版派生,移除页眉页脚、失效目录页码、转换器噪声和确定的重复版式块,用于文档相似度计算。audit.json:记录每一次删除、替换、合并、回源重提取和人工确认。
这样可以避免为了提升对比效果而不可逆地破坏原文,也能避免把幻觉文本、通用图片占位符和重复页眉当成“相同内容”。
2. 审计范围与统计口径
2.1 纳入和排除
纳入:
compare/001-2/uploads/*.md:2 份compare/002-21/uploads/*.md:21 份compare/003-10/uploads/*.md:10 份compare/004-2/uploads/*.md:2 份compare/005-3/uploads/*.md:3 份compare/006-3/uploads/*.md:3 份compare/007-4/uploads/*.md:4 份
排除:
- 8 份 README:它们是测试说明,不是待清洗输入。
review.json、blocks_*.json、match_index.json、summary.json:它们是旧输入产生的下游结果,只用于理解测试背景,不能作为清洗真值。file_*_reviewed.docx:本次未把它们当作 Markdown 清洗对象;后续可作为辅助核对材料,但是否能作为权威源需单独确认。
2.2 基础规模
45 份输入合计约 36.39 MiB、388,482 个物理行。所有文件都能按 UTF-8 读取,但“能解码”不代表内容无损,文件中仍有 � 和私用区字符。
下表中的“幻觉特征”使用一组偏保守的固定模板进行计数,包括 The quick brown fox...、勾股定理模板、The image contains...、The concept of a concept...、The steps are: 等;因此它只是明确下限,不包含全部乱码和中文重复污染。
| 用例 | 文档数 | 大小 MiB | 行数 | HTML 表格 | GFM 表格行 | 图片引用 | 空 Base64 占位 | 幻觉特征 | 最大单行字符数 | 总体判断 |
|---|---|---|---|---|---|---|---|---|---|---|
| 001-2 | 2 | 6.41 | 48,450 | 2,596 | 0 | 109 | 0 | 0 | 4,482 | 高风险:表格未闭合、重复率极高、图片定位不可用 |
| 002-21 | 21 | 15.23 | 158,462 | 2,593 | 592 | 2,000 | 0 | 1,530 | 28,624 | 严重:模型幻觉和重复文本最集中 |
| 003-10 | 10 | 9.20 | 116,358 | 1,646 | 2 | 1,793 | 0 | 137 | 261,838 | 严重:存在灾难性长行、乱码、幻觉和 LaTeX 污染 |
| 004-2 | 2 | 0.41 | 5,726 | 109 | 0 | 36 | 0 | 7 | 8,001 | 高风险:OCR 语义错误、缺图、幻觉 |
| 005-3 | 3 | 2.67 | 31,537 | 476 | 0 | 359 | 0 | 7 | 11,599 | 高风险:重复、缺图、表格和少量幻觉 |
| 006-3 | 3 | 1.12 | 14,701 | 130 | 0 | 162 | 0 | 22 | 9,151 | 高风险:含 OCR 文档,仍有明显幻觉和缺图 |
| 007-4 | 4 | 1.35 | 13,248 | 0 | 2,792 | 4,012 | 4,012 | 0 | 5,916 | 严重:图片内容全部为无效占位,表格和 Word 目录损坏 |
3. 对下游“文件对比”功能的直接影响
这些污染会系统性扭曲相似度,不只是影响阅读体验:
The quick brown fox...等同一幻觉模板出现在多个本来无关的投标文件里,会制造跨文档假阳性匹配。- 007 中 4,012 个完全相同的空图片占位符会被当成大量相同行。
- 001 中同一“综合单价分析表”说明被重复约 900 次;这与 README 中 001、003 的“近似匹配占 99% 以上”和超大
review.json有明显关联。这里只能判断为高度可疑的影响因素,不能在没有重新跑对比的情况下断言它是唯一原因。 - 平铺成一级标题、把表格压成一行、把页眉页脚混入正文,会改变分块边界,并使段落/句子/近似三档匹配分布失真。
- 如果把不同手机号、身份证号、图片都统一替换成同一个
[PHONE]、[ID]、[IMAGE],又会制造新的假相同内容。因此占位符必须保留“不同原值不同 token”的性质。
清洗后必须重新生成 blocks_*.json、match_index.json、review.json 和 summary.json。旧匹配数量不能作为清洗后的等值验收条件,应保留为“脏输入性能基线”,另建“干净输入语义基线”。fileIndex 和测试用例映射必须保持不变。
4. 问题清单与清洗要求
4.1 C001:固定模板型模型幻觉
优先级:P0,阻断语义版交付。
已确认的例子包括:
The quick brown fox jumps over the lazy dog.:全库 1,071 次。The equation $x^2 + y^2 = z^2$ represents a Pythagorean triple...:全库 62 次。The image contains a single character...The concept of a concept is fundamental in physics...- The steps are:Agree to be汽车法规和商业期刊的出版
典型证据:
002-21/file_14第 1,164 行:一行内重复quick brown fox约 411 次。002-21/file_3第 3,804 行:同类重复约 428 次。002-21/file_5第 2,915 行:The image contains...及数字说明被重复扩展。002-21/file_8第 5,379 行:28,624 字符的英语概念重复行。003-10/file_2开头即出现无关英文、勾股定理和中文乱码。
清洗要求:
- 固定模板命中后先标记其所在段、表格单元格和推定页面,不应只删除匹配到的几个单词。
- 有源 PDF 时,按页或按区域重新提取;没有源文件时,将该段放入
quarantine,不能把删除后的残缺上下文冒充完整正文。 - 黑名单适合做拦截器,不适合做唯一清洗器。应再检测异常语言切换、低词汇多样性、同短语高频循环和超长单行。
- 清洗结果中这些已知模板必须为 0;审计文件须记录被移除的原始范围和回源依据。
4.2 C002:超长重复串和退化输出
优先级:P0/P1,视能否回源而定。
典型问题:
003-10/file_2第 91 行长 261,838 字符,主体是目录点线重复。- 同文件第 8,924 行长 19,089 字符,主体是重复的 LaTeX
\rightarrow。 002-21/file_15第 4,898 行长 11,267 字符,主体是重复\textcolor{red}{\blacksquare}。003-10/file_7第 24,211 行含嵌套、重复的\textcolor{red}。- 多处出现成千上万次的
园、\cdots、...或错误短语,例如“建设工程执行”。
检测规则建议:
- 普通文本单行超过 2,000 字符告警,超过 10,000 字符阻断;结构化表格在解析后按单元格重新执行该规则。
- 同一字符连续 20 次以上、同一 2—20 字符片段连续 10 次以上告警。
- 单行压缩率异常高、唯一 token 比例过低、相邻重复 n-gram 比例过高时进入隔离。
- 目录点线只保留为结构化 TOC 信息,不保留数十万字符的视觉填充。
不允许简单按固定长度截断,因为长 HTML 表格可能包含真实内容。必须先判断是表格、目录点线、Base64、SVG 还是普通文本。
4.3 I001:图片引用全部失效
优先级:P0。
全库有 8,471 个图片引用,本地图片资产为 0:
- 007:4,012 个
或 PNG 变体。这里的...是文本,不是被终端隐藏的真实数据,无法解码恢复。 - 001:109 个目标形如
page=9,bbox=[...],不是标准图片路径,也没有对应裁剪图。 - 其余:4,350 个
images/<hash>.jpg等相对引用,但仓库中不存在相应文件。 - 7,073/8,471 个图片没有 alt 文本。
清洗要求:
- 从原始 PDF/DOCX 回源导出图片,使用内容哈希命名,并生成
assets/manifest.json。 - 对印章、签名、证书、身份证件、扫描表格等“有语义图片”执行 OCR/版面识别,但仍要保留原图引用,不能只留推测文本。
- 001 的
page+bbox必须转换为结构化来源坐标,再从对应 PDF 裁剪;不能直接当 Markdown URL。 - 如果确实采用纯文本模式,图片位置应写成唯一、可追踪的标记,例如
[IMAGE_MISSING:007-4:file_1:0001],不能用所有文件共享的[IMAGE],否则会制造假匹配。 - 生产级“完整清洗”验收要求 broken reference 为 0。无法回源的图片必须明确标为未解决,不能计作完整通过。
4.4 T001:HTML 表格损坏和超长单行
优先级:P0/P1。
41 份文件中共有 7,550 个 HTML 表格。静态标签计数如下:
<table>7,550,</table>7,155。<tr>101,760,</tr>101,019。<td>657,263,</td>656,575。- 35/41 份含 HTML 表格的文件至少有一类标签不平衡;7 份连 table 层级都不平衡。
001 最严重:
file_0:table=1315/1124。file_1:table=1281/1080。
清洗要求:
- 使用容错 HTML 解析器构建 DOM,记录解析器自动补齐了哪些标签;禁止用正则直接替换所有表格标签。
- 对每个表格校验
rowspan/colspan展开后的网格是否矩形、行列数是否与表头一致、单元格顺序是否可追溯。 - 简单矩形表格可转为 GFM;包含合并单元格、斜线表头、嵌套结构的表格应保留规范化 HTML,或另存为结构化 JSON。强行转 GFM 会丢失语义。
- 一行一个完整 HTML 表格应格式化为多行结构,避免长行拖垮分块器和 diff,但换行必须发生在 DOM 节点之间。
- 类似
004-2/file_0第 613 行中“国家、职位、导演、客户”等明显不符合资格审查表语境的表头,应回源确认,不能只修标签。
4.5 T002:GFM 表格行列数不一致
优先级:P1。
007 四份文件共有 203 个连续 GFM 表格块、2,792 个表格行,至少 60 个表格块出现不同行拥有不同列数:
file_0:36 个块,21 个不一致。file_1:55 个块,20 个不一致。file_2:42 个块,7 个不一致。file_3:70 个块,12 个不一致,另有 2 个块缺分隔行。
此外,002-21/file_7 有一个 584 行的大型 GFM 表格,同时出现 3 列和 5 列;002-21/file_3 也有不一致的孤立表格块。
这通常是把 Word/PDF 合并单元格硬投影到 GFM 的结果。清洗器应先恢复二维网格;无法无损表达的表格应改用规范 HTML/JSON,而不是补若干空 | 来“通过语法检查”。
4.6 H001:标题层级扁平、标题断裂和错误标题
优先级:P1。
问题表现:
- 001—006 几乎把所有章节都输出为
#,没有文档层级。 - 存在
#零星维修...、#(正本)等缺少空格的标题。 - 存在只有
#的空标题。 - 同一个标题被版面换行切成多个连续一级标题,例如项目名称被拆成 2—3 行。
- 普通正文、图片识别结果和幻觉句子也被错误标成标题。
清洗要求:
- 每个逻辑文档保留一个主标题 H1;主要章为 H2,节为 H3,依次递进,不跳级。
- 使用编号模式(“第一章”“一、”“(一)”“1.”)、目录结构、相邻上下文和重复页眉信息共同推断层级。
- 连续短标题行在确认属于同一版面标题后合并;不能只根据行长合并。
- 修复
#标题为# 标题,删除空标题;被判为正文的行去掉标题标记。 - 标题文本中的项目编号、公司名、年份不得因规范化而改变。
4.7 P001:段落、硬换行和词内断裂
优先级:P1。
151,616 行以两个空格结尾,主要来自 002—006 的转换器。这会把几乎每个物理行强制为 Markdown <br>,使原本同一段的文字被切碎。还存在:
物 业、项 目、服\n务项目等版面换行造成的词内空格或断行。- 页码、目录页码和正文混在同一行。
- 句子被错误拼接成超长段,或每句话都被拆成独立段。
- 项目编号中的连字符被转义成
440442\-2025\-00435,同一标识在不同文件中形式不一致。
清洗要求:
- 先识别标题、列表、表格、地址、编号、签名区,再做段落重组。
- 普通段落内部把版面软换行合并为空或一个空格;中文字符之间通常直接合并,中英/数字边界按规则保留空格。
- 列表项、诗行、地址、落款、表格单元格内的有意义换行不得统一删除。
\-仅在确认是转换器多余转义时还原;项目编号和负号的字符本身必须保留。- Unicode 采用 NFC,不建议全局 NFKC;NFKC 可能改变罗马数字、圈号、单位和兼容字符的法律原貌。
4.8 D001:页眉、页脚、目录页码和文档边界
优先级:P1。
已检测到至少 1,166 个“独立页码样式候选”,但其中也会混入 0/1000 等评分或限制值,所以不能仅凭正则删除。明确例子包括 1 / 390、368 / 390、4 / 6。
清洗要求:
- 只有在同一文本出现在多页相近顶部/底部位置,或页码形成合理序列时,才判定为页眉页脚。
clean_fidelity.md可通过元数据保留页码映射;clean_compare.md删除纯版式页码和重复运行标题。- 002 中
file_16—file_19开头分别表现为符合性审查、综合文件、商务部分、技术部分,可能是同一投标人的分卷/分册。清洗器必须保存原始fileIndex和卷册边界,不能自行拼接。 - 目录文本可转换为结构化章节导航;目录点线和页码不应参与正文相似度。
4.9 D002:重复内容与模板内容
优先级:P1,但严禁盲删。
重复既可能是转换器错误,也可能是投标文件真实模板。典型统计:
- 001 两份文件非空行重复比例分别为 81.8% 和 84.1%。同一“综合单价分析表”及说明出现约 900 次。
002-21/file_3非空行重复比例 44.8%,含“装约买箱箱装”等乱码高频重复。002-21/file_15中Agree to be重复 813 次。002-21/file_5中- The steps are:重复 818 次。002-21/file_20中目录式条目“施工等级 282”“工期保证措施 282”分别重复 165、164 次。
处理原则:
- 明确的幻觉/转换器退化重复应回源替换或隔离。
- 重复页眉、页脚、页码在对比版删除。
- 合法合同条款、报价表说明和表头在忠实版保留。对比版可把同一文档内重复模板块标为同一
template_block_id,在相似度计算时降权,而不是直接删除。 - 跨文档共同出现的合法招标模板本来就是对比目标的一部分,不应因“重复”而全部抹除。项目需要明确是检测抄袭、检测共同模板,还是两者分别评分。
4.10 L001:Word/PDF 转换遗留语法
优先级:P1/P2。
包括:
- 007
file_1有 171 个(#_Toc...)Word 目录链接,但全库没有对应显式锚点。 - 001 有 2,594 个
<div align="center">,用 HTML 仅表达居中版式。 - 575 个行内数学片段中有不少重复的
\textcolor、\rightarrow、\cdots和勾股定理幻觉。 - 20 个私用区字符主要是 U+F0B7、U+F070、U+F0D8,常见于 Wingdings/项目符号映射。
- 10 个
�出现在 7 份文件中,已经无法靠 Unicode 规范化恢复原字符。
处理要求:
- Word TOC 链接要么根据清洗后标题生成真实 slug,要么移除链接只保留目录文字;不得保留悬空锚点。
- 纯版式
<div align>转成语义标题/段落;居中信息可进样式元数据。 - 私用区字符按原字体映射或源文件回查,不能一律删除。
�必须逐处回源,无法回源时产生显式未解决项。- LaTeX 只有在源文件确实包含公式/符号时保留;重复生成的视觉符号应由原图或文本含义替代。