Названия команд Canonicalize NFL

Это на самом деле проблема классификации машинного обучения, но я считаю, что это очень хороший быстрый и грязный способ сделать это. Я хочу нарисовать строку, описывающую команду НФЛ, например "Сан-Франциско" или "49ers" или "Сан-Франциско 49ers" или "SF-сорока", для канонического имени для команды. (Есть 32 команды НФЛ, поэтому на самом деле это означает поиск ближайшего из 32 ящиков, чтобы поместить заданную строку.)

Входящие строки на самом деле не являются полностью произвольными (они из структурированных источников данных вроде этого: http://www.repole.com/sun4cast/stats/nfl2008lines.csv), так что это не так необходимо обрабатывать каждый сумасшедший угловой случай, как в приведенном выше примере 49ers.

Я также должен добавить, что если кто-то знает источник данных, содержащий как шансы на деньги в Vegas, так и реальные результаты игры за последние несколько лет игр NFL, это избавит от необходимости этого. Причина, по которой мне нужна канонизация, состоит в том, чтобы сопоставить эти два несопоставимых набора данных: один с коэффициентами и один с результатами:

Идеи для более качественных, более понятных источников данных очень приветствуются!

Добавлено: для этих данных может быть достаточно подходящая идея подстроки; благодарю! Можно ли сделать его более надежным, выбрав имя команды с ближайшим расстоянием левенштейна?

Ответ 1

Здесь что-то много надежное даже для произвольного ввода пользователем, я думаю. Во-первых, сопоставьте каждую команду (я использую трехбуквенный код как каноническое имя для каждой команды) в полностью прописанную версию с именем города и команды, а также любые прозвища в круглых скобках между городом и именем команды.

Scan[(fullname[[email protected]#] = #[[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"}}]

Затем для любой заданной строки найдите самую длинную общую подпоследовательность для каждого из полных имен команд. Чтобы отдать предпочтение сопоставлениям строк в начале или в конце (например, "автомобиль" должен соответствовать "пантерам каролины", а не "кардиналам из аризоны" ) сэндвич как входной строки, так и полных имен между пробелами. В зависимости от того, какое полное имя команды имеет [sic:] самая длинная длинная общая подпоследовательность с входной строкой, мы возвращаем команду. Здесь реализация алгоритма Mathematica:

teams = [email protected];

(* 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] &, [email protected], [email protected]]

canonicalize[s_] := argMax[[email protected][" "<>s<>" ", 
                                 " "<>[email protected]#<>" ", IgnoreCase->True]&, teams]

Ответ 2

Быстрая проверка на вид показывает, что оба набора данных содержат местоположения команд (т.е. "Миннесота" ). Только у одного из них есть имена команд. То есть, один список выглядит следующим образом:

Denver
Minnesota
Arizona
Jacksonville

а другой выглядит как

Denver Broncos
Minnesota Vikings
Arizona Cardinals
Jacksonville Jaguars

Похоже, в этом случае какое-то довольно простое подстрочное совпадение сделало бы это.

Ответ 3

Если вы знаете имена источников и получателей, вам просто нужно их сопоставить. В php вы просто используете массив с ключами из источника данных и значений из адресата. Затем вы будете ссылаться на них следующим образом:

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

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