01一切从标题归一化开始

最省事的方案是把标题清洗成规范串再比对:转小写、只保留字母数字汉字、剥掉营销话术词表,然后以 (类目, 品牌, 规范标题) 为组键做哈希,得到 canonical_product_id。

用确定性哈希而不是自增 ID,是为了跨日稳定:同一组键在任何一天都算出同一个 ID,历史数据才能按商品串联。ID 一旦不稳定,所有跨日特征(价格变动、榜单名次变化)都会碎掉。

模糊匹配(MinHash / LSH)明确留作论文里的对比实验,不进生产链路。原因是它给出的结果不可复现——同样的输入换一次并行度就可能不同,而生产表要求的是“这一行为什么和那行合并了”必须能被解释。

02标题方案在关键类目上直接归零

跨源配对结果一看,内存和固态这两个类目的标题键命中几乎为零。

原因很具体:一个源把规格写进营销长句,另一个源用极短的规格化标题。它们在字面上就不是同一句话。偏偏内存是价格失真最严重的类目——也就是说,标题方案失效的地方,正好是最需要它的地方。

于是加了规格键:从抽取出的容量、频率、代数等字段构造键。问题从此变成另一类。

03规格键造出的错误全是“假合并”

·套装与单条

用总容量做键,于是 16GB(2×8GB) 的套装和 16GB 的单条进了同一组。

关键推论在这里:只补一个乘积归一是修不好的。把 2×8 归一成 16 之后,它和真正的 16GB 单条仍然同键——因为归一恰好抹掉了唯一的区分信息。必须把“套装性”本身升为键的维度:用单条容量 + 套装数,而不是总容量。

根因还有一层:抽取和构造键的两个 stage 各写了一套正则(所谓孪生口径漂移),一边改了另一边没改,键就悄悄漂了。这类问题不在任何一次代码评审的视野里,因为它两边都“对”。

·concat_ws 把 null 段吞掉了

拼键时用了 concat_ws。它对 null 的行为是跳过该段,而不是留下空位。于是主频抽取失败时,键不是 DDR4|16|null 而是 DDR4|16——不同频率的商品全部落进同一个键,而且从键面上看不出这里少了一个字段。

修法是让缺失显式成为一个哨兵值。**参与身份定义的字段不允许“消失”,只能“未知”。**消失会让不同实体共用键,未知只会让匹配变保守。

·品牌双双未知

两行品牌都是 unknown 时,品牌维度失效,跨品牌合并发生了。修复之后这类情况仍能靠标题键合并跨源同款——因为不同品牌的标题天然不同。这是个便宜的兜底。

·规格粒度到极限

同代、同容量的两个不同系列(比如一个走性价比线一个走高端线),在纯规格键下必然同组。这是规格键的粒度固有局限,不是 bug。

解法是再加一层“系列串”:从规范标题里剥掉规格词之后剩下的残留部分,够长才允许生效(太短就是噪声)。拿不到系列信息时退回上一层键,而不是丢弃这一行。

04键的整体形状:从最精确到最保守逐级回退

text
spec_series  单条容量 + 套装数 + 主频 + 代数 + 系列串   最精确
spec         规格字段,不含系列                          次之
title        字符多重集键(bag_key)                     最保守兜底

每一级都有“证据不足”的判定(spec_ok / series_ok),不足就回退。这个结构是整篇里最重要的设计:置信度不够时降低匹配的野心,而不是放弃这条记录。

05bag_key:把标题变成字符多重集

标题键从“规范标题相等”改成“规范标题的字符排序后相等”。词序完全不同也能匹配上——跨源最大的差异来源之一就是词序(品牌放前面还是放后面、参数顺序不同)。

为什么选字符袋而不是 token 袋:

  • 归一化之后已经去掉分隔符,token 边界本身就不一致;
  • 字符袋的假合并风险是“字谜碰撞”(用同一批字符拼出的不同短语),在真实商品标题空间里可以忽略;
  • 键里还带着 类目#品牌 前缀,进一步收窄了碰撞面。

这条改动要在 Spark 上确认 split(col, "") 的行为确实是按字符切分,我是先在本地拿小样本验证过再上的。

06支配所有取舍的那条原则

误判成不同(漏合并)=召回损失,指标偏保守,可接受、可后续迭代。 误判成相同(假合并)=数据造假:把两件商品的价格当同款比对,凭空制造出价差。

不对称在于后果的可逆性。漏合并只是少了一些样本,分析结论仍然成立;假合并制造出的价差看起来就是一个发现,而它根本不存在。做比价分析时,最危险的错误不是“看不出来”,而是“看错了还看不出来”。

落成口号就是:合并必须高置信,宁可少合并,不可假合并。

代价要如实读:收紧键之后跨源可配对的组明显变少,这不是能力退化,是清掉了假合并;同时字符袋又激活了另一批原本因词序对不上的跨源同款。一进一退都要在结论里写清楚,不能只报喜。

07相关文章