如何可靠识别不同写法的同名俱乐部?SequenceMatcher方案存缺陷
俱乐部名称匹配优化方案
for x in range(len(fclub1)-1): for y in range(x+1,len(fclub1)-1): if SequenceMatcher(None,fclub1[x], fclub1[y]).ratio() > 0.4: if SequenceMatcher(None,fclub2[x], fclub2[y]).ratio() > 0.4: if float(fbest_odds_1[x]) < float(fbest_odds_1[y]): fbest_odds_1[x] = fbest_odds_1[y] if float(fbest_odds_x[x]) < float(fbest_odds_x[y]): fbest_odds_x[x] = fbest_odds_x[y] if float(fbest_odds_2[x]) < float(fbest_odds_2[y]): fbest_odds_2[x] = fbest_odds_2[y] fclub1.pop(y) fclub2.pop(y) fbest_odds_1.pop(y) fbest_odds_x.pop(y) fbest_odds_2.pop(y)
上述代码无法可靠匹配不同博彩商的俱乐部名称,例如
Manchester United与Man. Utd.。调整SequenceMatcher的匹配阈值后,又出现误匹配问题:将Aston Villa与Atherton Collieries、Leeds与Liversedge判定为同一俱乐部,现寻求最优识别方案。
优化方案
1. 标准化俱乐部名称
先对所有俱乐部名称做预处理,统一格式并消除缩写、别名差异:
- 去除标点符号、多余空格,统一转为小写
- 展开常见缩写(如
Man. Utd.→manchester united,Aston Villa FC→aston villa) - 维护一个别名映射字典,覆盖博彩商常用的俱乐部别称,示例:
CLUB_ALIASES = { "man utd": "manchester united", "man. utd.": "manchester united", "aston villa fc": "aston villa", "leeds united": "leeds" } def normalize_club_name(name): # 预处理:去标点、转小写、去空格 cleaned = name.lower().replace('.', '').replace(',', '').strip() # 替换别名 return CLUB_ALIASES.get(cleaned, cleaned)
2. 基于核心关键词的匹配
放弃单一的整体相似度计算,改为提取名称中的核心关键词(如俱乐部的主名称词),通过关键词重叠度判断匹配:
from difflib import SequenceMatcher def get_core_keywords(name): # 拆分名称为单词,过滤无意义后缀(如fc、united可根据需求调整) stop_words = {"fc", "football club", "united", "city", "town"} words = [word for word in name.split() if word not in stop_words] return set(words) def is_same_club(name1, name2): norm1 = normalize_club_name(name1) norm2 = normalize_club_name(name2) # 完全匹配直接返回True if norm1 == norm2: return True # 提取核心关键词 kw1 = get_core_keywords(norm1) kw2 = get_core_keywords(norm2) # 关键词交集占比超过60%则判定匹配(可根据需求调整阈值) if not kw1 or not kw2: return False match_ratio = len(kw1 & kw2) / max(len(kw1), len(kw2)) # 同时结合整体相似度做二次验证,避免极端情况 seq_ratio = SequenceMatcher(None, norm1, norm2).ratio() return match_ratio >= 0.6 and seq_ratio >= 0.3
3. 结合上下文验证匹配
博彩数据通常包含比赛的对手、联赛、开赛时间等信息,可利用这些上下文辅助验证:
- 若两个俱乐部对应的对手名称完全不同,可直接排除匹配可能
- 同一联赛内的俱乐部名称重复概率更低,可结合联赛信息缩小匹配范围
内容的提问来源于stack exchange,提问作者Nikola Filipovic
相关产品推荐
相关产品推荐

