4

这实际上是一个机器学习分类问题,但我想有一个非常好的快速而简单的方法来做到这一点。我想将描述 NFL 球队的字符串(如“San Francisco”或“49ers”或“San Francisco 49ers”或“SF 49ers”)映射到球队的规范名称。(有 32 支 NFL 球队,所以这实际上只是意味着找到 32 个箱中最近的一个来放入给定的字符串。)

传入的字符串实际上并不是完全任意的(它们来自这样的结构化数据源:http ://www.repole.com/sun4cast/stats/nfl2008lines.csv ),因此并不需要像在上面的 49 人示例。

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

非常欢迎关于更好、更可解析的数据源的想法!

补充:子串匹配的想法可能对这个数据就足够了;谢谢!是否可以通过选择距离最近的队名来使其更健壮一些?

4

3 回答 3

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]
于 2009-01-23T07:49:04.740 回答
1

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

Denver
Minnesota
Arizona
Jacksonville

另一个看起来像

Denver Broncos
Minnesota Vikings
Arizona Cardinals
Jacksonville Jaguars

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

于 2009-01-23T00:11:44.727 回答
0

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

$map = array('49ers' => 'San Francisco 49ers',
             'packers' => 'Green Bay Packers');

foreach($incoming_name as $name) {
   echo $map[$name];
}
于 2009-01-22T22:19:41.037 回答