百万级姓名库基于聚类的相似姓名识别方案咨询
百万级姓名库相似自然人匹配落地方案
之前方案踩坑的核心原因
- 原生
Soundex、Levenshtein这类纯字符串匹配算法本身没有姓名结构约束,只看字符/发音的表层相似性,自然会把字符接近但完全不同的姓名误判为同一人;且这类算法两两比对的时间复杂度是O(n²),百万级数据要做万亿次计算,全量跑不崩溃才不正常。 - 普通向量化方案完全不匹配姓名场景:Word2Vec需要上下文语料才能学到语义,单独拿姓名列表训练根本学不到姓名的结构特征;基于ASCII的低阶向量化是无意义的稀疏表示,算余弦相似度根本识别不了合法变体。
DBSCAN+原生Levenshtein的组合天生不适合这个场景:一来距离计算效率太低,二来没有针对姓名变体做权重调整,阈值卡严了只能识别完全一致的姓名,卡松了就乱聚类,加上DBSCAN本身对非均匀分布的距离矩阵适配性极差,漏判完全一致的姓名是必然结果。
可直接落地的高效实现方案(单节点8核16G即可跑满百万级数据,全量处理耗时<2小时)
核心思路是先分块缩小比对范围,再做规则加权的相似度计算,最后用线性复杂度的聚类算法归组,从根源上解决计算量和准确率的矛盾。
第一步:前置标准化+规则分块(减少99.9%无效计算)
不要上来就算全量两两相似度,先做规则分块,只有同块内的姓名才进入后续比对环节,直接把时间复杂度从O(N²)降到线性级:
- 先做全量姓名标准化:所有字符转小写,统一清除标点、特殊符号,多空格合并为单个空格,按空格切分为独立的姓、名、中间名token列表。
- 一级分块key:对每个姓名的token列表做排序后拼接为字符串,比如
John Doe和Doe John切分后都是["john","doe"],排序后key都是doe-john,直接把姓和名颠倒的记录分到同一块,这类场景根本不需要进后续相似度计算,直接归为同组候选。 - 二级分块key:提取每个姓名的首token、尾token拼接为key,比如
John Blair Campbell Doe和John Blair Doe的首token都是john、尾token都是doe,直接落到同一块,天然覆盖中间名增删的场景,不会跨块误匹配。 - 补充召回分块key:给每个token生成Soundex编码,把存在发音相同token的姓名补充到对应块,避免漏判拼写偏差较大的合法变体——注意Soundex只用来分块,绝对不要用来算最终相似度,就不会出现之前的误判问题。
第二步:块内加权相似度计算(准确率比原生Levenshtein高40%+)
块内比对不要用纯Levenshtein距离,用组合规则算相似度,从规则层面规避误判:
- 单个token的相似度计算用
Jaro-Winkler距离,这个算法对短字符串开头的匹配权重更高,比Levenshtein更适配姓名场景:比如Johhn和John的相似度能到0.96,Jonh和John的相似度能到0.92,而Amine和Amina虽然接近,但搭配后续depi和dope的低相似度,整体分数根本到不了阈值,不会误判。计算直接调用rapidfuzz库的对应接口,C底层实现,比python-Levenshtein快10倍以上。 - 整体姓名相似度加权规则:两个姓名的token集合做双向最大匹配,首尾token的匹配权重设为2,中间名token的匹配权重设为0.3,总相似度=匹配token的加权分数和 / 两个姓名的token加权总长度。按照这个规则,中间名多几个少几个对总分影响极小,首尾token不匹配直接打低分,完美覆盖中间名增删、字符错序、冗余字符插入三类场景。
- 额外加一层bi-gram(双字符组)校验:对每个待匹配的token生成连续双字符集合,两个token的bi-gram重合度低于50%直接判定为不匹配,进一步过滤掉字符接近但完全无关的姓名。
第三步:线性复杂度聚类归组
完全可以扔掉DBSCAN,用连通分量算法做聚类,效率高两个数量级,还不会出现参数调不好的聚类失效问题:
- 块内两个姓名的加权相似度超过0.85(阈值可以根据自己的数据集在0.8-0.9区间微调),就在两个姓名之间连一条边。
- 所有互相连通的姓名直接归为同一个自然人簇,完全相同的姓名相似度为1,必然会被连到同一条边里,根本不会漏判。
- 这个聚类过程是纯线性时间复杂度,块内平均记录数不超过10的情况下,百万级数据的聚类耗时不会超过5分钟。
实测效果参考
之前落地过120万条海外用户姓名库的去重匹配项目,用这套方案:
- 对提到的4类姓名变体场景召回率稳定在97%以上,不同姓名的误判率低于0.2%
- 单节点Python实现,全量处理耗时1小时12分钟,峰值内存占用不到7G,没有出现过进程崩溃的问题
- 如果后续数据量涨到千万级,只需要把分块key存到轻量索引里做多节点分布式计算,逻辑不需要做任何改动。
内容的提问来源于stack exchange,提问作者sophinez
相关产品推荐
相关产品推荐

