문제

이것은 실제로 머신 러닝 분류 문제이지만,이를 수행 할 수있는 완벽한 빠른 방법이 있다고 생각합니다. 나는 "샌프란시스코"또는 "49ers"또는 "샌프란시스코 49ers"또는 "SF Forty-Niners"와 같은 NFL 팀을 설명하는 문자열을 팀의 표준 이름에 매핑하고 싶습니다. (32 개의 NFL 팀이 있으므로 실제로 주어진 문자열을 넣기 위해 가장 가까운 32 개의 쓰레기통을 찾는 것을 의미합니다.)

들어오는 문자열은 실제로 완전히 임의적이지 않습니다 (그들은 이와 같은 구조화 된 데이터 소스에서 나온 것입니다. http://www.repole.com/sun4cast/stats/nfl2008lines.csv) 따라서 위의 49ers 예와 같이 모든 미친 코너 케이스를 처리 할 필요는 없습니다.

또한 누군가가 Moneyline Vegas 확률과 지난 몇 년간의 NFL 게임의 실제 게임 결과를 포함하는 데이터 소스를 알고있는 경우에도 이에 대한 필요성이 없을 것이라고 덧붙여 야합니다. 내가 정식화가 필요한 이유는이 두 가지 다른 데이터 세트를 일치시키는 것입니다. 하나는 확률이 있고 하나는 결과가 있습니다.

더 나은, 더 많은 파시브, 데이터 소스에 대한 아이디어는 매우 환영합니다!

추가 : 하위 문자열 일치 아이디어는이 데이터에 충분할 수 있습니다. 감사해요! 가장 가까운 Levenshtein 거리로 팀 이름을 선택하여 조금 더 강력하게 만들 수 있습니까?

도움이 되었습니까?

해결책

임의의 사용자 입력조차도 강력한 것이 있습니다. 먼저, 각 팀 (각 팀의 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 :]가있는 사람은 우리가 돌아 오는 팀입니다. 다음은 알고리즘의 수학 구현입니다.

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