如何检测门店名称变体与重复?求Python实现代码
门店名称重复与变体检测需求
我手头有约50个门店名称数据,需要检测其中是否存在名称变体及重复数据。之前试过Fuzzy工具但效果不好,目前这批数据没有重复,但我想学习存在重复数据时的检测代码。我之前用sqldf提取唯一值的代码如下:
import sqldf q = """ SELECT DISTINCT store_name FROM df ORDER BY store_name asc """ unique_sn = sqldf.run(q) print(unique_sn.iloc[:,0:])
附:门店名称列表
| 序号 | store_name |
|---|---|
| 0 | 3351 - Albuquerque, NM (XF) |
| 1 | 3352 - Lakewood, CO (XF) |
| 2 | 3353 - Colorado Springs, CO (XF) |
| 3 | 3354 - Thornton, CO (XF) |
| 4 | 3355 - Las Cruces, NM (XF) |
| 5 | 3356 - Boulder, CO (XF) |
| 6 | 3357 - Centennial, CO (XF) |
| 7 | 3358 - Denver, CO (XF) |
| 8 | 3359 - Loveland, CO (XF) |
| 9 | 3360 - Arvada, CO (XF) |
| 10 | 3361 - Longmont, CO (XF) |
| 11 | 3362 - Pueblo, CO (XF) |
| 12 | 3363 - Fort Collins, CO (XF) |
| 13 | 3364 - Barnes Marketplace - Colorado Springs, CO (XF) |
| 14 | 3365 - Gardens on Havana - Aurora, CO (XF) |
| 15 | 3367 - Animas Valley Mall - Farmington, NM (XF) |
| 16 | 3368 - Prairie Center - Brighton, CO (XF) |
| 17 | 3369 - Plaza Santa Fe - Santa Fe, NM (XF) |
| 18 | 3370 - Promenade at Castle Rock - Castle Rock, CO (XF) |
| 19 | 3371 - Crown Point - Parker, CO (XF) |
| 20 | 3372 - The Shops at NorthCreek - Denver, CO (XF) |
| 21 | 3373 - Orchard Town Center - Westminster, CO (XF) |
| 22 | 3374 -Shops at Walnut Creek -Westminster, CO (XF) |
| 23 | 3403 - Park City, UT |
| 24 | 3453 - Orem, UT (XF) |
| 25 | 3454 - Tucson - River, AZ (XF) |
| 26 | 3455 - Draper, UT (XF) |
| 27 | 3456 - Layton2, UT (XF) |
| 28 | 3457 - Salt Lake City, UT (XF) |
| 29 | 3458 - Academy Square - Logan, UT (XF) |
| 30 | 3459 - Arizona Pavilions - Tucson, AZ (XF) |
| 31 | 3460 - Jordan Landing - West Jordan, UT (XF) |
| 32 | 3461 - Fashion Plaza - Murray, UT (XF) |
| 33 | 3463 - Summit Place - Silverthorne, CO (XF) |
| 34 | 3464 - Glenwood Meadows - Glenwood Springs, CO (XF) |
| 35 | 59000 - Southwest Plaza - Littleton, CO (XF) |
| 36 | 59001 - Applewood Village - Wheat Ridge, CO (XF) |
| 37 | 59002 - Greeley - Greeley, CO (XF) |
| 38 | 59003 - Northfield Stapleton - Denver, CO (XF) |
| 39 | 59008 - Southglenn/Cherry Hills - Greenwood Village, CO (XF) |
| 40 | 59009 - South Aurora - Aurora, CO (XF) |
| 41 | 59011 - River Point at Sheridan - Sheridan, CO (XF) |
| 42 | 59031 - Hunter's Crossing - American Fork, UT (XF) |
| 43 | 59032 - Sugarhouse - Salt Lake City, UT (XF) |
| 44 | 59033 -Mountain View Village - Riverton, UT (XF) |
| 45 | 59034 - Highbury Centre - West Valley City, UT (XF) |
| 46 | 59038 - Diamond Plaza - Ogden, UT (XF) |
| 47 | 59046 - Broadmoor Towne Center - Colorado Springs, CO (XF) |
| 48 | 59055 - Albuquerque, NM (Uptown) |
| 49 | 59056 - Albuquerque, NM (Cottonwood) (BP) |
重复数据检测与名称变体识别方案
1. 精确重复检测
用Pandas内置方法可以更高效地检测精确重复:
import pandas as pd # 假设数据已加载到df中 # 找出所有重复行(keep=False显示所有重复项,默认只显示除第一个外的重复项) duplicate_rows = df[df.duplicated(subset='store_name', keep=False)] print("精确重复的门店名称:") print(duplicate_rows) # 提取唯一值并排序(替代sqldf的实现) unique_df = df.drop_duplicates(subset='store_name').sort_values('store_name') print("去重后的门店列表:") print(unique_df)
2. 名称变体检测(优化版模糊匹配)
针对Fuzzy工具效果不佳的问题,先做文本标准化再匹配,能大幅提升准确率:
步骤1:文本标准化
统一格式,去除干扰信息:
import re def standardize_name(name): # 转小写统一格式 name = name.lower() # 去除多余空格(首尾+中间多空格) name = re.sub(r'\s+', ' ', name).strip() # 移除括号及内部内容(如(XF)、(Uptown)) name = re.sub(r'\(.*?\)', '', name).strip() # 移除数字前缀(如3351 - ) name = re.sub(r'^\d+ - ', '', name).strip() return name # 对门店名称应用标准化 df['standardized_name'] = df['store_name'].apply(standardize_name)
步骤2:模糊匹配识别变体
用fuzzywuzzy库结合标准化文本,设置相似度阈值筛选变体:
from fuzzywuzzy import fuzz from itertools import combinations # 提取标准化后的唯一名称 unique_std_names = df['standardized_name'].unique() # 设置相似度阈值(值越高匹配越严格,可根据需求调整) threshold = 80 variants = [] # 遍历所有名称对计算相似度 for name1, name2 in combinations(unique_std_names, 2): similarity = fuzz.ratio(name1, name2) if similarity >= threshold: variants.append((name1, name2, similarity)) # 输出检测到的变体 print("检测到的名称变体:") for var in variants: print(f"{var[0]} 与 {var[1]} 相似度:{var[2]}%") # 关联回原始门店名称 print("\n变体对应的原始名称:") for std_name in unique_std_names: original_names = df[df['standardized_name'] == std_name]['store_name'].tolist() print(f"标准化名称:{std_name}") print(f"原始名称:{original_names}")
内容的提问来源于stack exchange,提问作者Alan Siu
相关产品推荐
相关产品推荐

