You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何可靠识别不同写法的同名俱乐部?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 00:15:28