从测试集泄漏面试题延伸:相似样本怎样跨集合去重

图中同源与重复样本先形成不可跨集合的组,再按组分配训练、验证和测试。

把一份文档切成多个段落,然后随机分成训练集和测试集,文件名不同,内容就独立了吗?如果测试段落的近似版本、相邻答案片段或原文改写已经在训练里,按行随机分配仍然会留下很强的重叠。更可靠的入口,是先定义哪些记录不能跨集合,再分配组。

先确定你要隔离什么

分组键可以来自原始文档、同一题目的版本、同一会话或同一个业务对象。选择取决于评测目标:如果要检验未见文档上的能力,就不能把同文档的改写与切片分散;如果只检验同一已知文档里的新问题,则又是另一种任务定义。

因此,严格隔离并不是一种脱离目标的万能切分法。先写清希望模型面对哪类未见变化,再确定同源家族的边界,才能解释测试结果。否则,分组做得很复杂,也可能没有对应真实使用场景。

原始记录最好有稳定 ID、来源、版本和处理关系。切块、摘要、翻译或生成改写时,把父记录关系保留下来,比之后只凭文本相似度猜它们是不是同源可靠。

精确重复先做,清洗别过头

可以先在明确规范化规则下计算指纹,发现完全相同或只差无关排版的记录。规则必须可追溯,并保留原文;不能为了提高命中率把数字、比较符号和否定词都删掉。

例如“小于零”和“大于零”只差一个关键关系,若处理把区别消掉,就可能把不同问题当成同题。同样,版本号和单位在技术数据中往往携带含义,不能一律按噪声处理。

精确匹配能覆盖一部分重复,却无法保证找全语义改写。指纹不相同只说明在当前配方下不同,不等于内容从未重叠,更不等于已经获得独立测试证据。

先分家族,再分训练与测试

近似匹配先产生候选

可以把文本转换成词或字符片段集合,用重叠程度寻找疑似近重复;数据量大时,再用相应近似方法减少候选比较。无论采用哪种方式,相似分数都应和明确的片段口径、阈值一起记录。

高相似可能只是共享模板,低相似也可能是深度改写。候选命中需要结合来源和任务判断,不宜直接自动删除全部内容。尤其是很短的样本,少量公共片段就可能占很大比例,阈值不能脱离长度解释。

如果把候选关系连成图再按连通分量分组,可以保守地减少跨集合连接,但相似关系不具有严格传递性。一条误连边可能形成很大的组,需要检查异常群组,不能把连通等同于实体相同或语义等价。

按组分配,检查交叉关系

组确定之后,再把整个组分到训练、验证或测试,避免同一组成员被拆散。划分后还要反查精确重复、父子关系和疑似近重复是否跨集合,而不是认为分组函数运行成功就足够。

随机种子、分配规则和组版本应记录,便于重跑。若后来新增记录,应该先判断它属于哪个已有家族,再决定去向;重新按行随机一次,可能让原来的隔离悄悄失效。

比例也不是唯一目标。大组会影响样本量和类别分布,需要同时报告各集合的任务、来源和难度差异。为了凑精确比例而拆开一个本该隔离的家族,会破坏最初目标。

时间边界要另外守住

若评测还要求模拟未来数据,不能为了把一个家族放在一起,就把较晚版本塞回训练集。跨越时间边界的家族需要隔离、移出训练候选或按明确政策处理,而不是让分组规则覆盖时间约束。

同样,划分之后进行生成式数据增强,要知道生成器是否已经接触测试材料;衍生数据仍应继承相应来源关系。数据流向的记录,比给最终文件贴上 train 或 test 名字更重要。

用反例验收这条流程

可以准备同文档切片、轻微改写、同名不同内容和仅差否定词的样本,检查哪些被归组、哪些只是候选,以及是否存在跨集合关系。有限字符串实验只验证实现规则,不证明训练语料已经无污染。

最终应把去重覆盖范围和未检查的风险一起报告。如果测试文件没有任何相同哈希,但其中一题的完整答案解析保留在训练里,你会把这次检查描述成“无重复”,还是“只通过了精确文本匹配”?