Canonicalize NFL球队的名字
-
19-08-2019 - |
题
这实际上是一个学习机的分类问题,但我想有一个完美的快速和肮脏的方式来做到这一点。我想地图一串描述一NFL球队,比如"旧金山"或"49人"或"旧金山49人队"或"SF第四十九指帮",以规范名称为队伍。(有32个橄榄球队的,所以它真的只是意味着找到最近的32箱放给字符串中。)
进入串实际上不完全是任意的(他们是从结构化数据来源是这样的: http://www.repole.com/sun4cast/stats/nfl2008lines.csv),所以它不是真的有必要到处理每一个疯狂的角样的情况下,在49人队上面的例子。
我还要补充一点,在种情况下,任何人都知道的一个来源的数据含有输赢盘拉斯维加斯的赔率以及实际的游戏结果,过去几年的橄榄球游戏,这样就不需要这个。我需要的是规范化,以配合这两个不同的数据集,一个可能性和一个有成果:
想法更好,更parsable、来源的数据,都非常欢迎!
添加:Substring匹配的想法可能满足这种数据;谢谢!它可能犯了一个小小的更强大的通过挑选团队的名字与最近编辑距离?
解决方案
这里的东西很多强大,甚至为任意的用户输入的,我想。首先,地图,每个团队(我采用的3字母代码作为规范名称为每个团队的)一个完全拼写出版与城市和团队的名称以及任何昵称在括号之间的城市和团队的名字。
Scan[(fullname[First@#] = #[[2]])&, {
{"ari", "Arizona Cardinals"}, {"atl", "Atlanta Falcons"},
{"bal", "Baltimore Ravens"}, {"buf", "Buffalo Bills"},
{"car", "Carolina Panthers"}, {"chi", "Chicago Bears"},
{"cin", "Cincinnati Bengals"}, {"clv", "Cleveland Browns"},
{"dal", "Dallas Cowboys"}, {"den", "Denver Broncos"},
{"det", "Detroit Lions"}, {"gbp", "Green Bay Packers"},
{"hou", "Houston Texans"}, {"ind", "Indianapolis Colts"},
{"jac", "Jacksonville Jaguars"}, {"kan", "Kansas City Chiefs"},
{"mia", "Miami Dolphins"}, {"min", "Minnesota Vikings"},
{"nep", "New England Patriots"}, {"nos", "New Orleans Saints"},
{"nyg", "New York Giants NYG"}, {"nyj", "New York Jets NYJ"},
{"oak", "Oakland Raiders"}, {"phl", "Philadelphia Eagles"},
{"pit", "Pittsburgh Steelers"}, {"sdc", "San Diego Chargers"},
{"sff", "San Francisco 49ers forty-niners"}, {"sea", "Seattle Seahawks"},
{"stl", "St Louis Rams"}, {"tam", "Tampa Bay Buccaneers"},
{"ten", "Tennessee Titans"}, {"wsh", "Washington Redskins"}}]
然后,对于任何给定的串,找到最长共同的子序列的每个成员的全名小组。优先考虑串匹配的开始或结束(例如,"车"应与"卡罗来纳州的美洲豹"而不是"亚利桑那红雀队")的三明治两个字符串输和全名之间的空间。哪个球队的全名具有[原文:]最长时间最长的共子序列与输入串是团队我们返回。这里有一个数学实施的算法:
teams = keys@fullnames;
(* argMax[f, domain] returns the element of domain for which f of that element is
maximal -- breaks ties in favor of first occurrence. *)
SetAttributes[argMax, HoldFirst];
argMax[f_, dom_List] := Fold[If[f[#1] >= f[#2], #1, #2] &, First@dom, Rest@dom]
canonicalize[s_] := argMax[StringLength@LongestCommonSubsequence[" "<>s<>" ",
" "<>fullname@#<>" ", IgnoreCase->True]&, teams]
其他提示
快速检视显示,这两个数据集包含队的位置(即"明尼苏达州").只有一个他们具有的团队'的名称。也就是说,一个名单看起来像:
Denver
Minnesota
Arizona
Jacksonville
和其它看起来像
Denver Broncos
Minnesota Vikings
Arizona Cardinals
Jacksonville Jaguars
似乎是,在这种情况下,一些非常简单子串匹配将会这样做。
如果你知道两者的来源和目的地的名字,然后你只需要地图。在php,你只是使用一系列有钥匙的数据来源和价值观从目的地。然后你将会参照他们如:
$map = array('49ers' => 'San Francisco 49ers',
'packers' => 'Green Bay Packers');
foreach($incoming_name as $name) {
echo $map[$name];
}