parsing - 标准化 NFL 球队名称

标签 parsing machine-learning canonical-form

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

传入的字符串实际上并不是完全任意的(它们来自像这样的结构化数据源: http://www.repole.com/sun4cast/stats/nfl2008lines.csv ),因此实际上没有必要像上面 49ers 示例中那样处理每个疯狂的极端情况。

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

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

补充:子字符串匹配的想法可能足以满足此数据;谢谢!通过选择具有最近编辑距离的团队名称,可以使其更加稳健吗?

最佳答案

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

然后,对于任何给定的字符串,找到每个球队全名的最长公共(public)子序列。为了优先匹配开头或结尾的字符串(例如,“car”应匹配“carolina panthers”而不是“arizona cardinals”),请将输入字符串和全名夹在空格之间。哪个团队的全名与输入字符串具有[sic:]最长的最长公共(public)子序列,就是我们返回的团队。这是该算法的 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]

关于parsing - 标准化 NFL 球队名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/471029/

相关文章:

machine-learning - 适合新手的 WEKA 教程/示例

Python - 如何使用 pos_tag (NLTK) 中的标签?

java - 如何使用Java API通过XSLT解析xml字符串并仅在内存中生成输出?

javascript - JavaScript 如何检测正则表达式?

C++ .obj 解析器面

c++ - c++11对于三种方法的规则如何实现 "... = default;"

python - 提取 HTML 表单的字段名称 - Python

python - pytorch前向检查输入尺寸错误

直接调用 XML 规范化算法与作为 xml 数字签名的一部分调用时相比,XML 规范化算法会给出两种不同的结果?