NFLチーム名の正規化
-
19-08-2019 - |
質問
これは実際には機械学習の分類問題ですが、それを行うための完全に優れた迅速で汚い方法があると思います。 <!> quot; San Francisco <!> quot;のようなNFLチームを説明する文字列をマップしたいまたは<!> quot; 49ers <!> quot;または<!> quot; San Francisco 49ers <!> quot;または<!> quot; SF forty-niners <!> quot ;、チームの正規名に。 (32個のNFLチームがあるので、実際には、指定された文字列を入れるために最も近い32個のビンを見つけることを意味します。)
着信文字列は実際には完全にarbitrary意的ではありません(次のような構造化データソースからのものです: http://www.repole.com/sun4cast/stats/nfl2008lines.csv ))ので、上記の49ersの例のようにすべてのクレイジーなケースを処理する必要はありません。
また、過去数年間のNFLゲームのベガスのオッズと実際のゲーム結果の両方を含むデータのソースを知っている人がいる場合は、この必要性がなくなります。正規化が必要な理由は、これら2つの異なるデータセットを照合するためです。1つはオッズで、もう1つは結果です。
より良い、より解析可能なデータソースのアイデアは大歓迎です!
追加:このデータには部分文字列一致のアイデアで十分かもしれません。ありがとう!最も近いレベンシュタイン距離のチーム名を選択することで、もう少し堅牢にすることができますか?
解決
これは、任意のユーザー入力に対しても十分な堅牢性があると思います。まず、各チーム(各チームの正規名として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"}}]
次に、任意の文字列について、チームのフルネームのそれぞれについて最長の共通サブシーケンスを見つけます。先頭または末尾で一致する文字列を優先するには(たとえば、<!> quot; car <!> quot;は<!> quot; arizona cardinals <ではなく、<!> quot; carolina panthers <!> quot;と一致する必要があります!> quot;)入力文字列とフルネームの両方をスペースで挟みます。入力された文字列が[sic:] longest longest-common-subsequenceであるチームのフルネームが返されるチームです。アルゴリズムの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]
他のヒント
視力検査により、両方のデータセットにチームの場所が含まれていることがわかります(つまり、<!> quot; Minnesota <!> quot;)。それらの1つだけがチームの名前を持っています。つまり、1つのリストは次のようになります。
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];
}