批量替换前构造反例样本,核心不是再找一批“应该被替换”的正例,而是主动找出替换规则会误伤的文本。做法是:先按规则命中的上下文分类,再从每类里挑出替换后语义会变、链接会断或代码会坏的最小片段,逐条手工确认。正例只能证明规则能跑通,反例才能划出不能照搬的边界。
两种条件下的选择完全不同。第一种是纯展示文本替换,比如统一某个旧称、修正错别字,命中位置基本落在正文段落里,反例样本可以少而精,重点放在同形异义词和专有名词上。第二种是带结构或语义的替换,比如改标题模板、改内链锚文本、改短代码参数,命中的可能是标签、属性、URL 片段,这时反例必须覆盖代码边界,否则一次全站替换就可能把可用的结构改坏。
区分依据很简单:看替换目标是否可能出现在标签、属性、链接或脚本里。只出现在可见文字中的词,风险集中在语义;可能出现在 <a href>、<img alt>、<code> 或短代码里的词,风险集中在结构。前者可以用少量人工样本判断,后者必须把反例样本当成回归测试集来建。
这四类不需要平均取样。哪一类在当前博客里出现得多,就多取几条;某一类完全不存在,可以只留一条占位反例,说明边界已确认。
第一步,把替换规则写成可检验的表达式或明确说明,包括是否区分大小写、是否要求词边界、是否允许跨越标签。第二步,从现有内容里导出所有命中片段及其前后各若干字符的上下文,按上面的四类归档。第三步,每类挑一到三条最短的片段,单独存成一份样本清单,并标注“替换后预期结果”。
第四步,先在这份样本上试跑,而不是直接全站执行。试跑后逐条比对:预期改的有没有改到,预期不该改的有没有被误伤。只要有一条反例被误伤,就回到规则本身调整边界条件,而不是在结果里手工补救。这个动作的结果直接决定下一步:样本全部通过,才把规则扩大到全量;有误伤,就先收窄规则,再重新取一批反例验证。
假设要把正文中的“云笔记”统一替换为“云端笔记”,同时站内还有产品名“云笔记 Pro”和一段代码示例里的变量名 cloudnote。若规则只按字面匹配,替换会改掉产品名,也会在部分代码注释里留下不一致的中文。合理的反例样本应包含:正文普通句、产品名所在句、代码块中的同形词、以及“云笔记”出现在链接锚文本中的一条。试跑后若发现产品名被改,说明规则需要排除特定后缀;若代码块被改,说明替换范围应限定在正文渲染层而非原始内容层。这两个结果分别指向不同的下一步动作,不能混为一谈。
替换前后做比较时,流量、点击或抓取的变化不能单独归因于这次替换。季节波动、搜索需求变化、数据采集口径差异都会造成同样的起伏。判断规则是否可靠,主要看反例样本的通过情况,而不是看某个统计数字有没有动。统计归零或某类请求减少,也可能来自采集延迟、缓存或抓取节奏变化,需要结合样本结果一起看,不能作为替换正确的唯一证据。
因此,批量替换的正确顺序是:先明确规则边界,再按四类边界构造反例样本,在小样本上试跑并逐条确认,只有反例全部符合预期,才把同一规则应用到全量内容;任何一条反例被误伤,都先改规则,再重新验证。