菜单

国家名称匹配与别名:先定规范名再谈模糊匹配

同一个国家会有通用名、本地名、缩写、旧名与口语说法。没有一份规范名做基准,模糊匹配就只是在猜。本文说明规范名、显示名与别名该怎么分层。

发布于

  • 名称匹配
  • 别名表

国家名称匹配与别名是同一个问题的两面:用户输入的写法很多,而系统需要一个稳定的判断。如果先上手做模糊匹配,结果往往是把「看起来像」当成「就是」,最后只能靠一张越来越长的例外表来收场。稳妥的顺序是先定规范名,再谈别名与模糊。

为什么同一个国家会有好几个名字?

同一个国家和地区在不同语境下的名字可以同时存在好几种,而每一种都有它的道理。

  • 通用名:跨语言沟通时使用的中性写法。
  • 本地名:该国家和地区自己的语言里的正式写法。
  • 官方长名与简称:正式文书用长名,日常与界面用简称。
  • 缩写:字母缩写与代码化的短写法。
  • 旧名:历史上使用过、现在仍有人沿用的名字。
  • 口语与转写变体:不同转写方案、不同习惯带来的拼写差异。

这些写法没有哪一种是「错的」,但系统必须决定哪一个作为基准。没有基准,后面每一步判断都建立在相对比较之上,永远无法收敛,也无法解释为什么这一次命中了那一次没有。

这些名字还有一个共同点:它们都不是「错的」。系统无法通过判断对错来消除分歧,只能通过定义一个基准来化解。这也是名称匹配的问题很少能靠更聪明的算法解决的原因,它首先是一个建模问题。

规范名、显示名与别名怎么分层

三层分开,很多争论会自然消失。

规范名是内部基准:唯一的、稳定的,用来做判断与关联。它不追求好看,也不追求本地化,只追求不歧义。

显示名是按语言与情境呈现的名字。同一个规范名可以对应多个显示名,它们是平等的,不存在哪个更正式。

别名是通往规范名的入口集合。别名不需要唯一,一个别名甚至可能指向不同的规范名——这种情况必须被发现,而不是被悄悄合并。

分层之后,三件常被混为一谈的事各自有了归属:搜索命中走别名,界面呈现走显示名,数据关联走规范名。

国家和语言这两侧的边界本身就是分开的,这一点先理清了,名称分层才不会被语言问题搅乱,见国家与语言的区别。

别名都是从哪儿来的?

别名可以按来源分类,不同来源的质量差别很大。

  • 官方与规范来源给出的替代写法:质量最高,数量最少。
  • 历史名称:需要标注有效期,否则会和现用名混淆。
  • 转写方案差异:同一门语言的不同转写习惯,会产出一批看起来相似但并不相同的拼写。
  • 用户实际输入:覆盖面最广,噪声也最大,通常要人工确认之后才能进别名表。
  • 站点自身的历史数据:旧的显示名、旧的导入结果,往往沉淀着真实使用过的写法。

关键不是把别名收全,而是每条别名都能回答「它从哪来、什么时候有效」。缺了这两项,别名表会在几年后变成一堆没人敢删的记录。

用户实际输入这一类尤其要谨慎对待,相关的搜索行为与测试切面见国家选择字段测试。

模糊匹配为什么必须排在规范化之后

模糊匹配很诱人,因为它看起来能一次解决所有拼写差异。但它的效果完全取决于前面有没有做过规范化。

顺序应该是这样的:先去空白与不可见字符,再统一字符宽度与大小写,再处理变音符号与特殊字符,然后才轮到编辑距离一类的相似度判断。

如果顺序反过来,先算相似度再清理字符,相似度会把噪声一起算进去,得到一批看起来合理、实际无意义的结果。

另一个常见错误是给模糊匹配设一个很松的阈值然后不设兜底。松阈值会把不相关的名称也吸进来,而用户看到的是「系统替我选了个别的国家」——这种错误比搜不到更糟,因为搜不到用户会重试,选错了用户可能直接提交。

可行的做法是:规范名与别名命中为准,模糊匹配只作为候选提示,最终仍需用户确认。

大小写、空格与字符宽度怎么处理?

这几种差异看起来琐碎,却是匹配失败的主要来源。

大小写:字母语言里它最简单,但要注意某些语言的大小写转换规则并不对称,转换之后再比较可能失真。

空格与标点:名称里的空格、连字符、点号是否属于名称本身,要一次性决定;不同来源对同一个名称的处理方式可能不同。

字符宽度:全角与半角的数字、字母在外观上接近,在比较时却是不同字符,必须先归一再比较。

变音符号:去掉变音符号能提高命中率,但也会带来碰撞,所以这一层通常放在严格匹配之后作为补充。

不可见字符:从别处复制粘贴带来的零宽字符会让两个看起来完全一样的名称不相等,这类问题在排查时最难被发现。

把这些处理干净之后,才轮到真正意义上的模糊。国家和地区名称在不同语言下的呈现差异,可以从国家和地区一览按地区浏览时观察到。

给开发者:把匹配做成一条有顺序的流水线

把这些步骤写成一条有顺序的流水线,比散落在各处的临时判断要好维护得多。

输入先进清洗环节,再进规范化环节,然后依次尝试精确命中规范名、命中别名,最后才进入相似度候选。每一环节的输出都应当可以被单独观察,这样命中出错时能定位到是哪一层的问题。

别名表要能双向查:给一个输入找候选,也要能给一个规范名列出它所有的别名,后者是发现冲突的主要手段。

这也是同一类字符串处理问题在姓名上的翻版,规范化与排序规则的处理思路可以互相参照,见姓名数据的地区差异。

最后留一个反馈入口:用户纠正过一次匹配,就该留下痕迹,而不是等到下一次又错一遍。

下一步

先把规范名定下来并保证唯一,再把现有别名按来源分类、补上「从哪来、什么时候有效」。然后按清洗、归一、精确、别名、模糊这个顺序把匹配逻辑重排一遍。

做完之后回头看那张例外表:如果它明显变短了,说明顺序对了;如果它还在变长,通常说明规范化那一层还没做干净。

文中出现的别名示例与拼写变体都是为说明匹配层次而编造的合成数据,不代表任何官方名称清单,也不构成对任何国家和地区名称写法的认定。

继续阅读

各国地址与身份数据格式相关文章