Канонизируйте названия команд НФЛ
Это на самом деле проблема классификации машинного обучения, но я думаю, что есть хороший способ быстро и грязно это сделать. Я хочу сопоставить строку, описывающую команду НФЛ, такую как "Сан-Франциско" или "49ers" или "Сан-Франциско 49ers" или "SF сорок девятки", с каноническим названием команды. (Есть 32 команды НФЛ, так что на самом деле это просто означает поиск ближайшего из 32 контейнеров для ввода заданной строки.)
Входящие строки на самом деле не являются полностью произвольными (они поступают из источников структурированных данных, таких как: http://www.repole.com/sun4cast/stats/nfl2008lines.csv), поэтому нет необходимости обрабатывать каждый случай сумасшедшего угла, как в Пример 49ers выше.
Я также должен добавить, что в случае, если кто-то знает об источнике данных, содержащих как шансы на денежную линию Вегаса, так и фактические результаты игр за последние несколько лет игр в НФЛ, это устранит необходимость в этом. Причина, по которой я нуждаюсь в канонизации, состоит в том, чтобы сопоставить эти два разнородных набора данных, один с коэффициентами и один с результатами:
Идеи для лучшего, более доступного источника данных очень приветствуются!
Добавлено: Идея сопоставления подстроки вполне может быть достаточной для этих данных; Спасибо! Можно ли сделать его немного более надежным, выбрав название команды с ближайшим расстоянием Левенштейна?
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"}}]
Затем для любой заданной строки найдите самую длинную общую подпоследовательность для каждого из полных названий команд. Чтобы отдать предпочтение строкам, совпадающим в начале или в конце (например, "автомобиль" должен соответствовать "пантерам Каролины", а не "кардиналам Аризоны"), поместите как входную строку, так и полные имена между пробелами. Полное имя какой-либо команды имеет [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]
Быстрый осмотр на виду показывает, что оба набора данных содержат местоположения команд (например, "Миннесота"). Только у одного из них есть названия команд. То есть один список выглядит так:
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];
}