Frage

Dies ist eigentlich ein Klassifikationsproblem für maschinelles Lernen, aber ich denke, es gibt einen ganz guten quick-and-dirty Weg, es zu tun. Ich mag für das Team einen String beschreibt ein NFL-Team, wie „San Francisco“ oder „49er“ oder „San Francisco 49ers“ oder „SF forty-niners“, zu einem kanonischen Namen zuzuordnen. (Es gibt 32 NFL-Teams, so dass es wirklich nur bedeutet, die nächste von 32 Bins zu finden in eine bestimmte Zeichenkette zu setzen.)

Die eingehenden Strings sind nicht eigentlich völlig willkürlich (sie sind aus strukturierten Datenquellen wie folgt aus: http://www.footballlocks.com/nfl_odds.shtml

  • http://www.repole.com/sun4cast/freepick.shtml
  • Ideen für eine bessere, parsable, Datenquellen sind sehr willkommen!

    hinzugefügt: Die Idee Teilzeichenfolge Anpassung könnte auch für diese Daten ausreichen; Vielen Dank! Könnte es etwas robuster durch Kommissionierung der Teamnamen mit dem nächsten levenshtein Entfernung gemacht werden?

    War es hilfreich?

    Lösung

    Hier ist etwas viel robust auch für beliebige Benutzereingabe, glaube ich. Zuerst Karte jedes Team (Ich verwende einen 3-Buchstaben-Code wie der kanonischen Namen für jedes Team) in eine vollständig ausgeschrieben Version mit Stadt und Teamnamen sowie alle Spitznamen in Klammern zwischen Stadt und Teamnamen.

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

    Dann wird für jede gegebene Zeichenfolge, finden Sie die längste gemeinsame Teilfolge für jede der vollständigen Namen der Teams. Um den Vorzug geben, Strings am Anfang oder Ende passenden (zB „Auto“ sollte „Carolina Panther“ entspricht und nicht als „Arizona Cardinals“) Sandwich sowohl die Eingabezeichenfolge und die vollständigen Namen zwischen Räumen. Unabhängig davon, welche Mannschaft den vollständigen Namen hat das [sic:] längste längsten Common-Subsequenz mit der Eingabezeichenfolge ist das Team, das wir zurückkehren. Hier ist eine Mathematica Implementierung des Algorithmus:

    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]
    

    Andere Tipps

    Schnelle Inspektion durch Sicht zeigt, dass beide Datensätze der Team Standorten (das heißt ‚Minnesota‘) enthalten. Nur einer von ihnen hat die Namen der Teams. Das heißt, eine Liste wie folgt aussieht:

    Denver
    Minnesota
    Arizona
    Jacksonville
    

    und die andere sehen aus wie

    Denver Broncos
    Minnesota Vikings
    Arizona Cardinals
    Jacksonville Jaguars
    

    Scheint, wie in diesem Fall, würde einige ziemlich einfach Teilzeichenfolge Matching es tun.

    Wenn Sie sowohl die Quell- und Zielnamen kennen, dann müssen Sie sie einfach abzubilden. In PHP, würden Sie nur ein Array mit Schlüsseln aus der Datenquelle und Werten aus dem Ziel verwenden. Dann würden Sie sie wie Referenz:

    $map = array('49ers' => 'San Francisco 49ers',
                 'packers' => 'Green Bay Packers');
    
    foreach($incoming_name as $name) {
       echo $map[$name];
    }
    
    Lizenziert unter: CC-BY-SA mit Zuschreibung
    Nicht verbunden mit StackOverflow
    scroll top