Канонизируйте названия команд НФЛ - PullRequest
4 голосов
/ 23 января 2009

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

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

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

Мы приветствуем идеи для лучшего, более доступного источника данных!

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

Ответы [ 3 ]

2 голосов
/ 23 января 2009

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

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]
1 голос
/ 23 января 2009

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

Denver
Minnesota
Arizona
Jacksonville

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

Denver Broncos
Minnesota Vikings
Arizona Cardinals
Jacksonville Jaguars

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

0 голосов
/ 23 января 2009

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

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

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