4

これは実際には機械学習の分類問題ですが、それを行うための完全に手っ取り早い方法があると思います。「サンフランシスコ」、「49ers」、「サンフランシスコ 49ers」、「SF フォーティーナイナーズ」などの NFL チームを表す文字列を、チームの正式な名前にマッピングしたいと考えています。(32 の NFL チームがあるため、実際には、特定の文字列を配置するために最も近い 32 のビンを見つけることを意味します。)

入力文字列は実際には完全に恣意的なものではありません (これらは次のような構造化データ ソースからのものです: http://www.repole.com/sun4cast/stats/nfl2008lines.csv ) 。上記の49ersの例。

また、マネーライン ベガス オッズと過去数年間の NFL ゲームの実際のゲーム結果の両方を含むデータ ソースを誰かが知っている場合は、これを行う必要がなくなることも付け加えておく必要があります。正規化が必要な理由は、これらの 2 つの異なるデータ セット (1 つはオッズ、もう 1 つは結果) を一致させるためです。

より優れた、より解析可能なデータソースのアイデアは大歓迎です!

追加: 部分文字列一致のアイデアは、このデータには十分かもしれません。ありがとう!レーベンシュタイン距離が最も近いチーム名を選択することで、もう少し堅牢にすることはできますか?

4

3 に答える 3

2

これは、任意のユーザー入力に対しても十分に堅牢なものだと思います。まず、各チーム (私は各チームの正規名として 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」は「arizona cardinals」ではなく「carolina panthers」と一致する必要があります)、入力文字列と氏名の両方をスペースで挟みます。チームのフルネームが入力文字列で [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]
于 2009-01-23T07:49:04.740 に答える
1

一見すると、両方のデータセットにチームの場所 (「ミネソタ」など) が含まれていることがわかります。そのうちの 1 つだけがチームの名前を持っています。つまり、1 つのリストは次のようになります。

Denver
Minnesota
Arizona
Jacksonville

もう一方は次のように見えます

Denver Broncos
Minnesota Vikings
Arizona Cardinals
Jacksonville Jaguars

この場合、非常に単純な部分文字列マッチングでそれができるようです。

于 2009-01-23T00:11:44.727 に答える
0

ソース名と宛先名の両方がわかっている場合は、それらをマップするだけです。PHP では、データ ソースからのキーと宛先からの値を持つ配列を使用するだけです。次に、次のように参照します。

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

foreach($incoming_name as $name) {
   echo $map[$name];
}
于 2009-01-22T22:19:41.037 に答える