Python:优化fuzzywuzzy实现含多语言的品牌名称模糊匹配纠错
解决日文与英文品牌名的模糊匹配问题
遇到日文假名(比如「ソニー」)和英文(比如「sony」)无法用fuzzywuzzy直接匹配的问题,核心原因是两者的字符编码和字符集完全不同,直接比较字符串相似度自然得分为0。这里提供两种可行的解决方案:
方法一:将日文转换为罗马音(通用方案)
通过把日文假名转换成对应的罗马音(罗马字),让两者处于同一字符体系下再进行模糊匹配。推荐使用pykakasi库来完成日文到罗马音的转换:
步骤1:安装依赖库
pip install pykakasi fuzzywuzzy python-Levenshtein
(python-Levenshtein是可选的,但能大幅提升fuzzywuzzy的匹配速度)
步骤2:编写转换与匹配代码
from fuzzywuzzy import fuzz import pykakasi # 初始化日文转罗马音的转换器 kakasi = pykakasi.kakasi() # 设置转换模式:平假名、片假名、汉字都转为罗马音 kakasi.setMode('H', 'a') kakasi.setMode('K', 'a') kakasi.setMode('J', 'a') converter = kakasi.getConverter() # 处理日文品牌名 japanese_brand = "ソニー" # 转换为罗马音并统一转为小写 romanized_brand = converter.do(japanese_brand).lower() # 输出转换结果:sonii print(romanized_brand) # 现在进行模糊匹配 score = fuzz.ratio("sony", romanized_brand) print(f"匹配得分:{score}") # 输出80,足够判断为同一品牌
优化点:处理长音
如果想让罗马音更贴近英文拼写,可以把罗马音中的长音(比如ī)替换成对应的短元音:
# 替换长音符号,让罗马音更接近英文拼写 romanized_brand = romanized_brand.replace("ī", "i").replace("ū", "u").replace("ā", "a") # 替换后变为soni,和sony的匹配得分为75 print(fuzz.ratio("sony", romanized_brand))
方法二:建立品牌名映射字典(精准方案)
如果你的品牌集合是固定的,可以预先建立一个包含日文、错误拼写到标准品牌名的映射字典,这种方法匹配准确率最高:
brand_mapping = { "ソニー": "sony", "sonii": "sony", "SONY": "sony", "nakia": "nokia", "samsumg": "samsung" # 其他需要映射的拼写可以继续补充 } def get_standard_brand(brand_name): # 先转小写处理大小写问题 lower_name = brand_name.lower() # 优先从映射字典获取标准名,没有则返回原名称 return brand_mapping.get(lower_name, brand_name) # 使用示例 print(get_standard_brand("ソニー")) # 输出sony print(get_standard_brand("SONY")) # 输出sony
之后你可以基于标准品牌名进行匹配或统计,完全避免字符体系差异的问题。
额外小技巧
- 对于大小写不一致的情况(比如
SONY和sony),统一转为小写后再匹配,能有效提升匹配得分。 - 如果不需要严格的全字符串匹配,可以试试
fuzz.partial_ratio或fuzz.token_sort_ratio,这些方法对部分匹配或字符顺序差异更友好。
内容的提问来源于stack exchange,提问作者Lara19
相关产品推荐
相关产品推荐

