构造反例样本的目的,是在批量替换真正执行前,先找出一批“替换后会变坏”的页面。做法不是随机抽样,而是按替换规则的触发条件反向筛选:先列出哪些文本形态会被规则命中,再从每个形态里挑出替换后语义会受损的页面,单独跑一遍替换并逐条比对。反例样本验证不通过,就先改规则,不要扩大执行范围。
批量替换文本通常落在两类里,处理方式完全不同。
<b> 统一换成 <strong>,或把全角括号统一为半角。这类替换的反例样本重点是“边界字符”,即恰好处于匹配边缘、可能被误伤或漏掉的位置。两类替换的风险来源不同,反例样本的构造方法也不同。判断依据很简单:替换后页面的意思是否可能改变。会改变,就按语义替换处理。
不要从全站随机抽页面,而是从“会被规则命中”的页面里,按词的实际角色分类,每类挑少量样本。
假设某旧合作方名称同时出现在三种位置:正文里说明“该功能由某方提供”、页脚的合作声明、以及一段历史沿革描述。如果规则是无差别删除,那么页脚和历史沿革会被清空,而正文那句可能变成没有主语的残句。这三类页面就是必须进入反例样本的对象。
如果反例样本里出现语义受损,下一步不是继续挑更多样本,而是把规则拆细:哪些位置允许替换,哪些位置必须保留或改写。规则改完,重新用同一批反例样本验证,通过后再考虑扩大范围。
格式替换的风险不在语义,而在匹配边界和数据完整性。反例样本应优先包含以下几类:
构造方法是:先用规则在反例样本上做一次替换,检查替换结果的标签配对、字符编码和字段结构是否仍然完整。发现一处结构被破坏,就说明规则的匹配范围过宽或过窄,需要加上前后限定条件,而不是靠人工逐个修补。
有两种情况可以跳过专门的反例样本,但仍需保留替换前版本。
反过来,只要满足以下任一条件,就必须构造反例样本:命中位置数量大到无法逐条确认、同一字符串在不同页面承担不同角色、替换涉及品牌或合作方表述、替换会改动结构化字段或链接。这些条件下,漏掉一个反例的代价通常高于多花时间构造样本。
反例样本全部通过后,先在小范围正式页面执行替换并保留替换前快照,观察一段时间再做前后比较。比较时要注意,搜索需求本身会随季节波动,采集口径也可能因工具或时间窗不同而变化,因此改动前后的差异不能直接归因于这次替换。比较的目的是发现异常,不是证明替换有效。若小范围执行后未出现结构错误或语义问题,再按同一规则扩大范围;若出现异常,回到规则层修正,而不是在结果层逐个回改。