规范化NFL球队名称

时间:2009-01-22 22:07:55

标签: parsing machine-learning canonical-form

这实际上是一个机器学习分类问题,但我想这是一个非常好的快速和肮脏的方法。我想将描述NFL球队的字符串(如“旧金山”或“49人队”或“旧金山49人队”或“SF四十名队员”)映射到球队的规范名称。 (有32个NFL球队,所以它真的只是意味着找到最近的32个箱子来放入一个给定的字符串。)

传入的字符串实际上并不是完全任意的(它们来自结构化数据源,如:http://www.repole.com/sun4cast/stats/nfl2008lines.csv)所以不必像上面的49ers例子那样处理每一个疯狂的角落情况。

我还应该补充一点,如果有人知道包含moneyline Vegas赔率的数据来源以及过去几年NFL比赛的实际比赛结果,那么就不需要这样做了。我需要规范化的原因是匹配这两个不同的数据集,一个是赔率,另一个是结果:

非常欢迎更好,更易解析的数据来源的想法!

补充:子字符串匹配的想法可能足以满足这些数据;谢谢!通过选择最近的levenshtein距离的团队名称,可以使其更加强大吗?

3 个答案:

答案 0 :(得分:2)

我认为,即使对于任意用户输入,这也是非常强大的。首先,将每个团队(我使用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"}}]

然后,对于任何给定的字符串,找到每个团队全名的最长公共子序列。要优先考虑在开头或结尾匹配的字符串(例如,“car”应匹配“carolina panthers”而不是“arizona cardinals”)将输入字符串和空格之间的全名夹在中间。无论哪个球队的全名都有[sic:]最长的最长共同子序列,输入字符串是我们返回的球队。这是算法的Mathematica实现:

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]

答案 1 :(得分:1)

通过视线快速检查显示两个数据集都包含团队的位置(即“明尼苏达州”)。其中只有一人拥有球队的名字。也就是说,一个列表如下:

Denver
Minnesota
Arizona
Jacksonville

,另一个看起来像

Denver Broncos
Minnesota Vikings
Arizona Cardinals
Jacksonville Jaguars

似乎,在这种情况下,一些非常简单的子串匹配就可以做到。

答案 2 :(得分:0)

如果你知道源名称和目的地名称,那么你只需要映射它们。 在php中,您只需使用包含数据源中的键和目标值的数组。然后你会像:

那样引用它们
$map = array('49ers' => 'San Francisco 49ers',
             'packers' => 'Green Bay Packers');

foreach($incoming_name as $name) {
   echo $map[$name];
}