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')
所有的结果似乎都是正确的