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