基于视觉相似度或音译的大规模企业名称去重技术方案问询
大规模多语言企业名称去重解决方案
核心问题拆解
- 同形异编码字符冲突:比如拉丁
ABCEHKOyTX和西里尔АВСЕНКОуТХ视觉一致但编码不同,普通Unicode归一化(如NFKC)无法完全覆盖 - 跨语言音译匹配:比如拉丁
Oleg和西里尔Олег需要识别为同一主体 - 特殊字符组合映射:比如
bl和Ы这类非直接同形但需关联的情况
分步实现方案
1. 字符归一化基础处理
先做基础Unicode归一化,再针对同形字符构建自定义映射表:
- 先对所有字符串执行
NFKC归一化,处理部分兼容字符 - 构建同形字符映射字典,覆盖常见视觉混淆字符,比如西里尔
А→拉丁A、В→B、С→C等 - 代码示例(Python):
homoglyph_map = { 'А': 'A', 'В': 'B', 'С': 'C', 'Е': 'E', 'Н': 'H', 'К': 'K', 'О': 'O', 'у': 'y', 'Т': 'T', 'Х': 'X', 'Ы': 'bl' # 提前嵌入特殊字符组合映射 } def normalize_homoglyphs(s): normalized = s.normalize('NFKC') return ''.join([homoglyph_map.get(c, c) for c in normalized])
2. 音译匹配增强
采用规则+轻量模型结合的方式处理跨语言音译:
- 规则层面:针对高频企业名/前缀后缀做固定音译映射,比如俄转英的
Олег→Oleg、Иван→Ivan - 模型层面:将字符串转换为跨语言音素序列,通过计算音素编辑距离判断相似度,阈值达标则判定为匹配
- 简化落地:先构建常用企业名音译词典,未命中的字符串再用音素转换做模糊匹配
3. 字符组合映射扩展
针对bl和Ы这类特殊组合,调整归一化顺序优先处理多字符匹配:
- 先替换组合字符,再处理单字符同形映射,避免单字符匹配提前触发
- 代码示例(调整后的逻辑):
# 优先匹配长字符组合 combined_map = { 'Ы': 'bl' } homoglyph_map = { 'А': 'A', 'В': 'B', 'С': 'C', 'Е': 'E', 'Н': 'H', 'К': 'K', 'О': 'O', 'у': 'y', 'Т': 'T', 'Х': 'X' } def normalize_with_combos(s): # 先替换组合字符 for combo, replacement in combined_map.items(): s = s.replace(combo, replacement) # 再处理同形单字符 normalized = s.normalize('NFKC') return ''.join([homoglyph_map.get(c, c) for c in normalized])
4. 大规模数据高效去重
针对大规模列表,用哈希+分组的方式提升效率:
- 对每个企业名执行上述归一化+音译转换后,生成唯一"指纹"字符串
- 用哈希表(如Python的
defaultdict)将相同指纹的企业名分组,完成精准去重 - 模糊匹配场景:用倒排索引结合编辑距离/余弦相似度做聚类,处理音译相似度较高的条目
注意事项
- 映射字典需持续迭代,覆盖更多语言的同形字符
- 音译模型要针对企业名场景微调,避免普通人名音译的偏差
- 超大规模数据处理时,采用分批处理或分布式哈希表控制内存占用
内容的提问来源于stack exchange,提问作者Oleg Oshkoderov
相关产品推荐
相关产品推荐

