如何比较 python 中体育游戏的相似字符串列表?

How to compare a list of similar strings in python for sport games?

我有一个具有各种属性的体育游戏词典列表。这些列表都是由列表中只有一项运动组成的。所以我有篮球比赛单,棒球比赛单等等

我想以相同的方式格式化所有“游戏”值,以便相同的特定体育比赛(Pit Steelers vs LA Rams)都具有相同的字符串值。特定游戏的示例可以是 "PIT Steelers vs LA Rams",但这也可以格式化为 "Pittsburgh Steelers vs Los Angeles Rams"。对于某个特定游戏,我可能在列表中有多达 7 个词典,格式略有不同。

我不能选择只使用球队名称或城市,因为在同一项运动中,在 NFL 和 NCAA 等两个不同的联盟中,可能会有与这些特定球队名称或城市相同的比赛。

我在想我会使用最广泛的游戏名称作为键。例如,我会使用 "Pittsburgh Steelers vs Los Angeles Rams" 而不是 "PIT Steelers vs LA Rams" 作为用作基线的键。

有没有一种方法可以将这些其他匹配项与密钥进行比较,并说如果密钥中此字符串的百分比超过 X,请将此字符串游戏替换为密钥?你会怎么做?我愿意接受所有建议!

谢谢!

编辑:这是使用 difflib 的尝试。我生成了 1000 个随机游戏并导入 excel 并按比例排序。我们可以看到它不是一个完美的组合。

您可以使用 fuzzy wuzzy 库来替换字符串。制作球队的主要列表,然后您可以使用 fuzzy wuzzy 包来提取与其他字符串最相似的球队。不过它不会是完美的,因为您需要测试不同的场景,例如 'CAR' 不会 return Carolina Panthers,它会 return 'Arizona Cardinals''LVR' 返回 'Los Angels Rams'。所以你只需要付钱,然后可能对于那些少数情况,只需制定一些逻辑来找回正确的团队。

from fuzzywuzzy import process

nfl_teams = ['Arizona Cardinals', 'Atlanta Falcons', 'Carolina Panthers', 'Chicago Bears',
         'Dallas Cowboys', 'Detriot Lions','Green Bay Packers','Los Angeles Rams',
         'Minnesota Vikings','New Orleans Saints','New York Giants', 'Philadelphia Eagles',
         'San Francisco 49ers','Seattle Seahawks','Washington Redskins','Baltimore Ravens',
         'Buffalo Bills','Cinncinnati Bangals','Cleveland Browns','Denver Broncos',
         'Houston Texans','Indanapolis Colts','Jacksonville Jaguars','Kansas City Chiefs',
         'Las Vegas Raiders','Los Angeles Chargers','Miami Dolphins','New England Patriots',
         'New York Jets','Pittsburgh Steelers','Tennessee Titans']

matchups = ['OAK Raiders vs CHI Bears','GB Packers vs MIN Vikings','PIT Steelers vs LA Rams', 'PHI vs DEN']
for each in matchups:
    team1, team2 = each.split('vs')[0].strip(), each.split('vs')[-1].strip()
    team1_alpha = process.extractOne(team1, nfl_teams)[0]
    team2_alpha = process.extractOne(team2, nfl_teams)[0]
    
    print ('%s ----->   %s vs %s' %(each, team1_alpha, team2_alpha))

输出:

OAK Raiders vs CHI Bears ----->   Las Vegas Raiders vs Chicago Bears
GB Packers vs MIN Vikings ----->   Green Bay Packers vs Minnesota Vikings
PIT Steelers vs LA Rams ----->   Pittsburgh Steelers vs Los Angeles Rams
PHI vs DEN ----->   Philadelphia Eagles vs Denver Broncos

或者,如果您确实想进行比较以查看它们的相似程度。

from fuzzywuzzy import fuzz
var1 = "Pittsburgh Steelers vs Los Angeles Rams" 
var2 = "PIT Steelers vs LA Rams"

print(fuzz.ratio(var1, var2))  

print(fuzz.token_sort_ratio(var1, var2))

print(fuzz.token_set_ratio(var1, var2))

输出:

68
71
82

创建一个不包含城市的团队简称列表,然后扫描这些简称的标题。您应该在每个标题中找到两个简短的团队名称,然后您可以使用它们将标题分组到独特的游戏中。

team_long_names = ['Arizona Cardinals', 'Atlanta Falcons', 'Carolina Panthers', 'Chicago Bears',
         'Dallas Cowboys', 'Detriot Lions','Green Bay Packers','Los Angeles Rams',
         'Minnesota Vikings','New Orleans Saints','New York Giants', 'Philadelphia Eagles',
         'San Francisco 49ers','Seattle Seahawks','Washington Redskins','Baltimore Ravens',
         'Buffalo Bills','Cinncinnati Bangals','Cleveland Browns','Denver Broncos',
         'Houston Texans','Indanapolis Colts','Jacksonville Jaguars','Kansas City Chiefs',
         'Las Vegas Raiders','Los Angeles Chargers','Miami Dolphins','New England Patriots',
         'New York Jets','Pittsburgh Steelers','Tennessee Titans']

team_short_names = [n.lower().split(' ')[-1] for n in team_long_names]

game_titles = ['Atlanta Falcons vs New York Jets', 'ATL Falcons vs NY Jets', 'Falcons v Jets',
            'SF 49ers vs PIT Steelers', 'San Fransico 49ers vs Pittsburg Steelers', '49ers vs Steelers',
            'Dallas Cowboys vs LA Chargers', 'DAL Cowboys vs Los Angles Chargers', 'Cowboys v Chargers',
            'Blah blah Falcons and Foo bar Jets']

titles_by_key = []

for title in game_titles:
    game_key = '-'.join([word for word in title.lower().split(' ') if word in team_short_names])
    titles_by_key.append(game_key + ": " + title)

print(sorted(titles_by_key))

输出:

['49ers-steelers: 49ers vs Steelers',
 '49ers-steelers: SF 49ers vs PIT Steelers',
 '49ers-steelers: San Fransico 49ers vs Pittsburg Steelers',
 'cowboys-chargers: Cowboys v Chargers',
 'cowboys-chargers: DAL Cowboys vs Los Angles Chargers',
 'cowboys-chargers: Dallas Cowboys vs LA Chargers',
 'falcons-jets: ATL Falcons vs NY Jets',
 'falcons-jets: Atlanta Falcons vs New York Jets',
 'falcons-jets: Blah blah Falcons and Foo bar Jets',
 'falcons-jets: Falcons v Jets']

这并不能解决球队名称与不同联赛可能发生冲突的问题,但我怀疑可能有更简单的策略将联赛检测为 pre-processing 步骤。