Pergunta

Este é realmente um problema de classificação de aprendizagem de máquina, mas eu imagino que há um perfeitamente boa maneira rápida e suja para fazê-lo. Eu quero mapear uma string descrevendo um time da NFL, como "San Francisco" ou "49ers" ou "San Francisco 49ers" ou "SF forty-niners", a um nome canônico para a equipe. (Há 32 times da NFL para que ele realmente significa apenas encontrar o mais próximo de 32 caixas para colocar uma determinada cadeia em.)

As cordas de entrada não são realmente totalmente arbitrária (eles são de fontes de dados estruturados como este: http://www.repole.com/sun4cast/stats/nfl2008lines.csv ) por isso não é realmente necessário para lidar com todos os casos canto louco como no exemplo 49ers acima.

Gostaria também de acrescentar que no caso de alguém souber de uma fonte de dados que contém ambos os probabilidades Vegas moneyline, bem como resultados de jogos reais para os últimos anos de jogos da NFL, que evitaria a necessidade para isso. A razão que eu preciso a canonização é combinar esses dois conjuntos diferentes de dados, um com probabilidades e um com os resultados:

Idéias para o melhor, mais parsable, fontes de dados são muito bem-vindos!

Adicionado: A ideia substring correspondente poderia muito bem ser suficiente para estes dados; obrigado! Poderia ser feito um pouco mais robusto, escolhendo o nome da equipe com a distância levenshtein mais próximo?

Foi útil?

Solução

Aqui está uma coisa muito forte mesmo para a entrada do usuário arbitrária, eu acho. Em primeiro lugar, mapear cada time (estou usando um código de 3 letras como o nome canônico para cada equipe) para uma versão totalmente soletrou para fora com cidade e nome da equipe, bem como quaisquer apelidos entre parênteses entre a cidade eo nome da equipe.

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"}}]

Então, para qualquer dado corda, encontrar o maior subsequência comum para cada um dos nomes completos das equipes. Dar preferência a cordas correspondentes no início ou no fim (por exemplo, "carro" deve coincidir com "Carolina Panthers" em vez de "Arizona Cardinals") sanduíche tanto a cadeia de entrada e os nomes completos entre espaços. Qualquer que seja a equipe nome completo tem a [sic]: mais longa mais longa-common-subsequence com a cadeia de entrada é a equipe que voltar. Aqui está uma implementação Mathematica do algoritmo:

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]

Outras dicas

inspeção rápida por shows de vista que ambos os conjuntos de dados contêm locais das equipes (ou seja, 'Minnesota'). Apenas um deles tem nomes das equipes. Ou seja, uma lista se parece com:

Denver
Minnesota
Arizona
Jacksonville

e os outros olhares como

Denver Broncos
Minnesota Vikings
Arizona Cardinals
Jacksonville Jaguars

Parece que, neste caso, algumas simples substring correspondente bastante iria fazê-lo.

Se você sabe os nomes de origem e de destino, então você só precisa mapeá-los. No PHP, você iria usar apenas um array com as chaves da fonte de dados e os valores do destino. Então você teria que fazer referência a eles como:

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

foreach($incoming_name as $name) {
   echo $map[$name];
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top