Вопрос

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

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

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

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

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

Это было полезно?

Решение

Я думаю, вот что-то достаточно надежное даже для произвольного пользовательского ввода.Сначала сопоставьте каждую команду (я использую 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]

Другие советы

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

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];
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top