0

我有一个包含足球队名称的数据库(例如在下面的第一个条目中,Marshall 和 Southern Methodist)。然后,与我的数据库名称匹配的是一些不同但可识别的名称(在下面的第一个条目中,SMU,Marshall):

[u'Houston', u'Alabama']
[u'Houst', u'Alab']


[u'Florida State', u'North Carolina State']
[u'NCSt', u'FlaSt']


[u'Penn State', u'Iowa']
[u'PnSt', u'Iowa']


[u'Oklahoma', u'Texas']
[u'Texas', u'Okla']


[u'Florida Atlantic', u'South Florida']
[u'SFla', u'FlAtl']


[u'Georgia', u'Tennessee']
[u'Geo', u'Tenn']


[u'San Jose State', u'Idaho']
[u'UI', u'SJSU']


[u'Washington State', u'Arizona State']
[u'ArzSt', u'WshSt']


[u'Fresno State', u'Nevada']
[u'Nevad', u'FrsSt']


[u'Oregon State', u'Arizona']
[u'ARIZ', u'OSU']


[u'Clemson', u'Virginia Tech']
[u'VTech', u'Clem']


[u'Chattanooga', u'Arkansas']
[u'UTC', u'AR']


[u'USC', u'Stanford']
[u'USC', u'Stanf']


[u'Baylor', u'Colorado']
[u'BU', u'CU']


[u'North Texas', u'Louisiana-Lafayette']
[u'NoTex', u'LaLaf']


[u'Tulane', u'Army']
[u'TLN', u'ARMY']


[u'Troy', u'Florida International']
[u'TROY', u'FIU']


[u'Louisiana-Monroe', u'Arkansas State']
[u'ASU', u'ULM']


[u'Texas Tech', u'Iowa State']
[u'TT', u'ISU']


[u'Akron', u'Western Michigan']
[u'AKRON', u'WMU']


[u'Liberty', u'Toledo']
[u'LIBERTY', u'TOLEDO']


[u'Virginia', u'Middle Tennessee']
[u'Virg', u'MTnSt']


[u'Oklahoma State', u'Texas A&M']
[u'TexAM', u'OKSt']


[u'Notre Dame', u'UCLA']
[u'NDame', u'UCLA']


[u'Rutgers', u'Cincinnati']
[u'Cincy', u'Rutgr']


[u'Ohio State', u'Purdue']
[u'Prdue', u'OhSt']


[u'LSU', u'Florida']
[u'Fla', u'LSU']


[u'Air Force', u'UNLV']
[u'AFA', u'UNLV']


[u'Nebraska', u'Missouri']
[u'Misso', u'Neb']


[u'New Mexico State', u'Boise State']
[u'NMxSt', u'BoiSt']


[u'Pittsburgh', u'Navy']
[u'Navy', u'Pitt']


[u'Wake Forest', u'Florida State']
[u'WFrst', u'FlaSt']


[u'San Jose State', u'Hawaii']
[u'Hawa', u'SJSt']


[u'UCF', u'South Florida']
[u'UCF', u'SFla']

对于每组四个名称,我需要将我的数据库名称与正确的新名称相匹配。我现在可以使用很多 if 语句来做到这一点,但这需要很多代码,而且不会特别优雅。这里有更好的匹配方式吗?

4

3 回答 3

1

除非您有一些指示语句部分的指标,否则如果不抓住所有 TBH,这几乎是不可能的。例如。

如果

Kentucky Mississippi State
MS UK

是这样表示的

[Kentucky Mississippi State]
[MS] [UK]

很容易分解和解析。

^\[([a-zA-Z,\s]*)\](?:\n)\[([a-zA-Z,\s]*)\]

正则表达式可视化

在 Debuggex 上实时编辑

编辑:

只需阅读您的更新数据。

^\[u\'([a-zA-Z,\s]*)\',\su\'([a-zA-Z,\s]*)'\]\n\[u\'([a-zA-Z,\s]*)\',\su\'([a-zA-Z,\s]*)\'\]$

正则表达式可视化

在 Debuggex 上实时编辑

一切都在捕获组中捕获:)

于 2013-09-03T23:14:51.540 回答
1
from difflib import SequenceMatcher

li = [\
([u'Houston', u'Alabama'],
 [u'Houst', u'Alab']),

([u'Florida State', u'North Carolina State'],
 [u'NCSt', u'FlaSt']),

([u'Penn State', u'Iowa'],
 [u'PnSt', u'Iowa']),

([u'Oklahoma', u'Texas'],
 [u'Texas', u'Okla']),

([u'Florida Atlantic', u'South Florida'],
 [u'SFla', u'FlAtl']),

([u'Georgia', u'Tennessee'],
 [u'Geo', u'Tenn']),

([u'San Jose State', u'Idaho'],
 [u'UI', u'SJSU']),

([u'Washington State', u'Arizona State'],
 [u'ArzSt', u'WshSt']),

([u'Fresno State', u'Nevada'],
 [u'Nevad', u'FrsSt']),

([u'Oregon State', u'Arizona'],
 [u'ARIZ', u'OSU']),

([u'Clemson', u'Virginia Tech'],
 [u'VTech', u'Clem']),

([u'Chattanooga', u'Arkansas'],
 [u'UTC', u'AR']),

([u'USC', u'Stanford'],
 [u'USC', u'Stanf']),

([u'Baylor', u'Colorado'],
 [u'BU', u'CU']),

([u'North Texas', u'Louisiana-Lafayette'],
 [u'NoTex', u'LaLaf']),

([u'Tulane', u'Army'],
 [u'TLN', u'ARMY']),

([u'Troy', u'Florida International'],
 [u'TROY', u'FIU']),

([u'Louisiana-Monroe', u'Arkansas State'],
 [u'ASU', u'ULM']),

([u'Texas Tech', u'Iowa State'],
 [u'TT', u'ISU']),

([u'Akron', u'Western Michigan'],
 [u'AKRON', u'WMU']),

([u'Liberty', u'Toledo'],
 [u'LIBERTY', u'TOLEDO']),

([u'Virginia', u'Middle Tennessee'],
 [u'Virg', u'MTnSt']),

([u'Oklahoma State', u'Texas A&M'],
 [u'TexAM', u'OKSt']),

([u'Notre Dame', u'UCLA'],
 [u'NDame', u'UCLA']),

([u'Rutgers', u'Cincinnati'],
 [u'Cincy', u'Rutgr']),

([u'Ohio State', u'Purdue'],
 [u'Prdue', u'OhSt']),

([u'LSU', u'Florida'],
 [u'Fla', u'LSU']),

([u'Air Force', u'UNLV'],
 [u'AFA', u'UNLV']),

([u'Nebraska', u'Missouri'],
 [u'Misso', u'Neb']),

([u'New Mexico State', u'Boise State'],
 [u'NMxSt', u'BoiSt']),

([u'Pittsburgh', u'Navy'],
 [u'Navy', u'Pitt']),

([u'Wake Forest', u'Florida State'],
 [u'WFrst', u'FlaSt']),

([u'San Jose State', u'Hawaii'],
 [u'Hawa', u'SJSt']),

([u'UCF', u'South Florida'],
 [u'UCF', u'SFla']) ]


def comp(N,D,sq = SequenceMatcher(None)):
    sq.set_seqs(N[0],D[0])
    a = sq.ratio()
    sq.set_seqs(N[1],D[1])
    b = sq.ratio()
    
    sq.set_seqs(N[0],D[1])
    x = sq.ratio()
    sq.set_seqs(N[1],D[0])
    y = sq.ratio()

    if a>x and b>y:
        return (N[0],D[0]), (N[1],D[1])
    else:
        return (N[0],D[1]),(N[1],D[0])


print '\n'.join('%-30s   %s' % comp(N,D) for N,D in li)

结果

(u'Houston', u'Houst')             (u'Alabama', u'Alab')
(u'Florida State', u'FlaSt')       (u'North Carolina State', u'NCSt')
(u'Penn State', u'PnSt')           (u'Iowa', u'Iowa')
(u'Oklahoma', u'Okla')             (u'Texas', u'Texas')
(u'Florida Atlantic', u'FlAtl')    (u'South Florida', u'SFla')
(u'Georgia', u'Geo')               (u'Tennessee', u'Tenn')
(u'San Jose State', u'SJSU')       (u'Idaho', u'UI')
(u'Washington State', u'WshSt')    (u'Arizona State', u'ArzSt')
(u'Fresno State', u'FrsSt')        (u'Nevada', u'Nevad')
(u'Oregon State', u'OSU')          (u'Arizona', u'ARIZ')
(u'Clemson', u'Clem')              (u'Virginia Tech', u'VTech')
(u'Chattanooga', u'UTC')           (u'Arkansas', u'AR')
(u'USC', u'USC')                   (u'Stanford', u'Stanf')
(u'Baylor', u'BU')                 (u'Colorado', u'CU')
(u'North Texas', u'NoTex')         (u'Louisiana-Lafayette', u'LaLaf')
(u'Tulane', u'TLN')                (u'Army', u'ARMY')
(u'Troy', u'TROY')                 (u'Florida International', u'FIU')
(u'Louisiana-Monroe', u'ULM')      (u'Arkansas State', u'ASU')
(u'Texas Tech', u'TT')             (u'Iowa State', u'ISU')
(u'Akron', u'AKRON')               (u'Western Michigan', u'WMU')
(u'Liberty', u'TOLEDO')            (u'Toledo', u'LIBERTY')
(u'Virginia', u'Virg')             (u'Middle Tennessee', u'MTnSt')
(u'Oklahoma State', u'OKSt')       (u'Texas A&M', u'TexAM')
(u'Notre Dame', u'NDame')          (u'UCLA', u'UCLA')
(u'Rutgers', u'Rutgr')             (u'Cincinnati', u'Cincy')
(u'Ohio State', u'OhSt')           (u'Purdue', u'Prdue')
(u'LSU', u'LSU')                   (u'Florida', u'Fla')
(u'Air Force', u'AFA')             (u'UNLV', u'UNLV')
(u'Nebraska', u'Neb')              (u'Missouri', u'Misso')
(u'New Mexico State', u'NMxSt')    (u'Boise State', u'BoiSt')
(u'Pittsburgh', u'Pitt')           (u'Navy', u'Navy')
(u'Wake Forest', u'WFrst')         (u'Florida State', u'FlaSt')
(u'San Jose State', u'SJSt')       (u'Hawaii', u'Hawa')
(u'UCF', u'UCF')                   (u'South Florida', u'SFla')

.

编辑

from difflib import SequenceMatcher

li = [\
 ([u'Liberty', u'Toledo'], #######
 [u'LIBERTY', u'TOLEDO']),

([u'Chattanooga', u'Arkansas'], ################
 [u'UTC', u'AR']),

([u'Texas Tech', u'Iowa State'], ###########
 [u'TT', u'ISU'])  ]


def comp(N,D,sq = SequenceMatcher(None)):
    sq.set_seqs(N[0],D[0])
    a = sq.ratio()
    sq.set_seqs(N[1],D[1])
    b = sq.ratio()
    
    sq.set_seqs(N[0],D[1])
    x = sq.ratio()
    sq.set_seqs(N[1],D[0])
    y = sq.ratio()

    sq.set_seqs(N[0].lower(),D[0].lower())
    al = sq.ratio()
    sq.set_seqs(N[1].lower(),D[1].lower())
    bl = sq.ratio()
    
    sq.set_seqs(N[0].lower(),D[1].lower())
    xl = sq.ratio()
    sq.set_seqs(N[1].lower(),D[0].lower())
    yl = sq.ratio()

    return ((N[0],D[0]), (N[1],D[1]),
            a,b,a*b,a+b,
            (N[0].lower(),D[0].lower()), (N[1].lower(),D[1].lower()),
            al,bl,al*bl,al+bl,
            (N[0],D[1]),(N[1],D[0]),
            x,y,x*y,x+y,
            (N[0].lower(),D[1].lower()),(N[1].lower(),D[0].lower()),
            xl,yl,xl*yl,xl+yl)

print '\n'.join(('====='*14)+ '\n'
                '%-25s   %s\n'
                '    %-10f                  %f       -->   x%f  +%f\n'
                '%-25s   %s\n'
                '    %-10f                  %f       -->   x%f  +%f\n\n'
                '%-25s   %s\n'
                '    %-10f                  %f       -->   x%f  +%f\n'
                '%-25s   %s\n'
                '    %-10f                  %f       -->   x%f  +%f\n'
                % comp(N,D) for N,D in li)

结果

======================================================================
(u'Liberty', u'LIBERTY')    (u'Toledo', u'TOLEDO')
    0.142857                    0.166667       -->   x0.023810  +0.309524
(u'liberty', u'liberty')    (u'toledo', u'toledo')
    1.000000                    1.000000       -->   x1.000000  +2.000000

(u'Liberty', u'TOLEDO')     (u'Toledo', u'LIBERTY')
    0.153846                    0.153846       -->   x0.023669  +0.307692
(u'liberty', u'toledo')     (u'toledo', u'liberty')
    0.307692                    0.153846       -->   x0.047337  +0.461538

======================================================================
(u'Chattanooga', u'UTC')    (u'Arkansas', u'AR')
    0.142857                    0.200000       -->   x0.028571  +0.342857
(u'chattanooga', u'utc')    (u'arkansas', u'ar')
    0.142857                    0.400000       -->   x0.057143  +0.542857

(u'Chattanooga', u'AR')     (u'Arkansas', u'UTC')
    0.000000                    0.000000       -->   x0.000000  +0.000000
(u'chattanooga', u'ar')     (u'arkansas', u'utc')
    0.153846                    0.000000       -->   x0.000000  +0.153846

======================================================================
(u'Texas Tech', u'TT')      (u'Iowa State', u'ISU')
    0.333333                    0.307692       -->   x0.102564  +0.641026
(u'texas tech', u'tt')      (u'iowa state', u'isu')
    0.333333                    0.307692       -->   x0.102564  +0.641026

(u'Texas Tech', u'ISU')     (u'Iowa State', u'TT')
    0.000000                    0.000000       -->   x0.000000  +0.000000
(u'texas tech', u'isu')     (u'iowa state', u'tt')
    0.153846                    0.333333       -->   x0.051282  +0.487179

上面的代码结果显示:

1/
关联比率 a = 0.142857(u'Liberty', u'LIBERTY')低于关联比率 x = 0.153846 (u'Liberty', u'TOLEDO')
这足以使条件a>x and b>y评估为 False 并导致关联(u'Liberty', u'TOLEDO') 作为结果的一部分返回,而它是不希望的关联,
并且除此之外,关联的比率(u'Toledo', u'TOLEDO')(u'Toledo', u'LIBERTY')正确描述第一个(u'Toledo', u'TOLEDO') 是所需的关联。

lower()方法应用于字符串时,它显然解决了关联以来的缺陷(u'liberty', u'liberty')(u'toledo', u'toledo')现在比率为 1.000000

2/
然而,干预lower()会引发另外两个以前正确的案例的缺陷。

如果没有lower(),则
关联不正确(u'Chattanooga', u'AR') (u'Arkansas', u'UTC')比率为 0.000000
,则获胜关联 (u'Chattanooga', u'UTC') (u'Arkansas', u'AR')是正确的结果。

使用lower(),
降低的正确与未降低(u'chattanooga', u'utc')的版本具有相同的比率 0.142857,
但与(u'chattanooga', u'ar')现在值 0.153846的不正确相比
,正确(u'chattanooga', u'utc')不如不正确,(u'chattanooga', u'ar')
因此条件被评估为 False,然后(u'Chattanooga', u'AR') (u'Arkansas', u'UTC')在不正确时返回关联。

.

这与正确关联(u'Texas Tech', u'ISU') (u'Iowa State', u'TT')的比率 0.000000 低于比率 0.333333 和 0.307692 的不正确关联完全相同(u'Texas Tech', u'TT') (u'Iowa State', u'ISU')

降低时,
比率(u'iowa state', u'tt')从 0.000000 增加到 0.333333,而其他关联(u'iowa state', u'isu')保持相同的劣势比率 0.307692。因此条件再次被评估为 False。

3/很明显,新的
缺陷是由于标签非常短。只有一两个低位字母与长的低位名称匹配,而这些字符串的未低位版本之间没有匹配,情况就发生了翻滚。u'AR'u'TT''chattanooga'u'texas tech'

很明显,问题的出现是因为我的布尔表达式a>x and b>y对这两个表达式中的每一个都赋予了很大的权重,a>x并且b>y分别给予了很大的权重。
我认为必须找到一个条件,将它们a>x的结果和b>y
相乘的结果结合在一起并不给我的印象是这是一个好方法。
在下面的代码中,我选择添加比率并执行不止一个条件评估。

from difflib import SequenceMatcher

li = [\
([u'Houston', u'Alabama'],
 [u'Houst', u'Alab']),

([u'Florida State', u'North Carolina State'],
 [u'NCSt', u'FlaSt']),

([u'Penn State', u'Iowa'],
 [u'PnSt', u'Iowa']),

([u'Oklahoma', u'Texas'],
 [u'Texas', u'Okla']),

([u'Florida Atlantic', u'South Florida'],
 [u'SFla', u'FlAtl']),

([u'Georgia', u'Tennessee'],
 [u'Geo', u'Tenn']),

([u'San Jose State', u'Idaho'],
 [u'UI', u'SJSU']),

([u'Washington State', u'Arizona State'],
 [u'ArzSt', u'WshSt']),

([u'Fresno State', u'Nevada'],
 [u'Nevad', u'FrsSt']),

([u'Oregon State', u'Arizona'],
 [u'ARIZ', u'OSU']),

([u'Clemson', u'Virginia Tech'],
 [u'VTech', u'Clem']),

([u'Chattanooga', u'Arkansas'],
 [u'UTC', u'AR']),

([u'USC', u'Stanford'],
 [u'USC', u'Stanf']),

([u'Baylor', u'Colorado'],
 [u'BU', u'CU']),

([u'North Texas', u'Louisiana-Lafayette'],
 [u'NoTex', u'LaLaf']),

([u'Tulane', u'Army'],
 [u'TLN', u'ARMY']),

([u'Troy', u'Florida International'],
 [u'TROY', u'FIU']),

([u'Louisiana-Monroe', u'Arkansas State'],
 [u'ASU', u'ULM']),

([u'Texas Tech', u'Iowa State'],
 [u'TT', u'ISU']),

([u'Akron', u'Western Michigan'],
 [u'AKRON', u'WMU']),

([u'Liberty', u'Toledo'],
 [u'LIBERTY', u'TOLEDO']),

([u'Virginia', u'Middle Tennessee'],
 [u'Virg', u'MTnSt']),

([u'Oklahoma State', u'Texas A&M'],
 [u'TexAM', u'OKSt']),

([u'Notre Dame', u'UCLA'],
 [u'NDame', u'UCLA']),

([u'Rutgers', u'Cincinnati'],
 [u'Cincy', u'Rutgr']),

([u'Ohio State', u'Purdue'],
 [u'Prdue', u'OhSt']),

([u'LSU', u'Florida'],
 [u'Fla', u'LSU']),

([u'Air Force', u'UNLV'],
 [u'AFA', u'UNLV']),

([u'Nebraska', u'Missouri'],
 [u'Misso', u'Neb']),

([u'New Mexico State', u'Boise State'],
 [u'NMxSt', u'BoiSt']),

([u'Pittsburgh', u'Navy'],
 [u'Navy', u'Pitt']),

([u'Wake Forest', u'Florida State'],
 [u'WFrst', u'FlaSt']),

([u'San Jose State', u'Hawaii'],
 [u'Hawa', u'SJSt']),

([u'UCF', u'South Florida'],
 [u'UCF', u'SFla']) ]

def comp(N,D,sq = SequenceMatcher(None)):
    sq.set_seqs(N[0],D[0])
    a = sq.ratio()
    sq.set_seqs(N[1],D[1])
    b = sq.ratio()
    
    sq.set_seqs(N[0],D[1])
    x = sq.ratio()
    sq.set_seqs(N[1],D[0])
    y = sq.ratio()

    sq.set_seqs(N[0].lower(),D[0].lower())
    al = sq.ratio()
    sq.set_seqs(N[1].lower(),D[1].lower())
    bl = sq.ratio()
    
    sq.set_seqs(N[0].lower(),D[1].lower())
    xl = sq.ratio()
    sq.set_seqs(N[1].lower(),D[0].lower())
    yl = sq.ratio()

    if ((a>0.5 and b>0.5 and a+b>1.4)
        or (al>0.5 and bl>0.5 and al+bl>1.4)):
        return (N[0],D[0]), (N[1],D[1])
    elif ((x>0.4 and y>0.4 and x+y>1.4)
          or (xl>0.4 and yl>0.4 and xl+yl>1.4)):
        return (N[0],D[1]), (N[1],D[0])
    elif x+y==0.0 and a+b>0.1:
        return (N[0],D[0]), (N[1],D[1])
    elif a+b==0.00 and x+y>0.1:
        return (N[0],D[1]), (N[1],D[0])
    elif a+b > x + y + 0.5:
        return (N[0],D[0]), (N[1],D[1])
    elif x+y > a + b + 0.5:
        return (N[0],D[1]), (N[1],D[0])
    elif a+b > x + y:
        return (N[0],D[0]), (N[1],D[1])
    elif x+y > a + b:
        return (N[0],D[1]), (N[1],D[0])

    
print '\n'.join('%-30s   %s' % comp(N,D) for N,D in li)

结果

(u'Houston', u'Houst')           (u'Alabama', u'Alab')
(u'Florida State', u'FlaSt')     (u'North Carolina State', u'NCSt')
(u'Penn State', u'PnSt')         (u'Iowa', u'Iowa')
(u'Oklahoma', u'Okla')           (u'Texas', u'Texas')
(u'Florida Atlantic', u'FlAtl')   (u'South Florida', u'SFla')
(u'Georgia', u'Geo')             (u'Tennessee', u'Tenn')
(u'San Jose State', u'SJSU')     (u'Idaho', u'UI')
(u'Washington State', u'WshSt')   (u'Arizona State', u'ArzSt')
(u'Fresno State', u'FrsSt')      (u'Nevada', u'Nevad')
(u'Oregon State', u'OSU')        (u'Arizona', u'ARIZ')
(u'Clemson', u'Clem')            (u'Virginia Tech', u'VTech')
(u'Chattanooga', u'UTC')         (u'Arkansas', u'AR')
(u'USC', u'USC')                 (u'Stanford', u'Stanf')
(u'Baylor', u'BU')               (u'Colorado', u'CU')
(u'North Texas', u'NoTex')       (u'Louisiana-Lafayette', u'LaLaf')
(u'Tulane', u'TLN')              (u'Army', u'ARMY')
(u'Troy', u'TROY')               (u'Florida International', u'FIU')
(u'Louisiana-Monroe', u'ULM')    (u'Arkansas State', u'ASU')
(u'Texas Tech', u'TT')           (u'Iowa State', u'ISU')
(u'Akron', u'AKRON')             (u'Western Michigan', u'WMU')
(u'Liberty', u'LIBERTY')         (u'Toledo', u'TOLEDO')
(u'Virginia', u'Virg')           (u'Middle Tennessee', u'MTnSt')
(u'Oklahoma State', u'OKSt')     (u'Texas A&M', u'TexAM')
(u'Notre Dame', u'NDame')        (u'UCLA', u'UCLA')
(u'Rutgers', u'Rutgr')           (u'Cincinnati', u'Cincy')
(u'Ohio State', u'OhSt')         (u'Purdue', u'Prdue')
(u'LSU', u'LSU')                 (u'Florida', u'Fla')
(u'Air Force', u'AFA')           (u'UNLV', u'UNLV')
(u'Nebraska', u'Neb')            (u'Missouri', u'Misso')
(u'New Mexico State', u'NMxSt')   (u'Boise State', u'BoiSt')
(u'Pittsburgh', u'Pitt')         (u'Navy', u'Navy')
(u'Wake Forest', u'WFrst')       (u'Florida State', u'FlaSt')
(u'San Jose State', u'SJSt')     (u'Hawaii', u'Hawa')
(u'UCF', u'UCF')                 (u'South Florida', u'SFla')

所有的结果似乎都是正确的

于 2013-09-04T01:06:50.813 回答
1

Fuzzy Wuzzy 是一个非常酷的名称匹配工具。

这是一个例子:

> choices = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]
> process.extract("new york jets", choices, limit=2)
  [('New York Jets', 100), ('New York Giants', 78)]
> process.extractOne("cowboys", choices)
  ("Dallas Cowboys", 90)

更多细节在这里

于 2013-09-04T01:12:34.453 回答