2011-11-20 12 views
9

Próbuję wymyślić parser do gry piłkarskiej. Używam tutaj określenia "język naturalny", więc proszę o zachowanie mnie, ponieważ niewiele wiem o tym polu.Analizator języka naturalnego do analizowania danych play-by-play

Oto kilka przykładów tego, co ja pracuję z (format: Czas DOWN & DIST | OFF_TEAM | opis):

04:39|4th and [email protected]|Dal|Mat McBriar punts for 32 yards to NYJ14. Jeremy Kerley - no return. FUMBLE, recovered by NYJ.| 
04:31|1st and [email protected]|NYJ|Shonn Greene rush up the middle for 5 yards to the NYJ21. Tackled by Keith Brooking.| 
03:53|2nd and [email protected]|NYJ|Mark Sanchez rush to the right for 3 yards to the NYJ24. Tackled by Anthony Spencer. FUMBLE, recovered by NYJ (Matthew Mulligan).| 
03:20|1st and [email protected]|NYJ|Shonn Greene rush to the left for 4 yards to the NYJ37. Tackled by Jason Hatcher.| 
02:43|2nd and [email protected]|NYJ|Mark Sanchez pass to the left to Shonn Greene for 7 yards to the NYJ44. Tackled by Mike Jenkins.| 
02:02|1st and [email protected]|NYJ|Shonn Greene rush to the right for 1 yard to the NYJ45. Tackled by Anthony Spencer.| 
01:23|2nd and [email protected]|NYJ|Mark Sanchez pass to the left to LaDainian Tomlinson for 5 yards to the 50. Tackled by Sean Lee.| 

już teraz, pisałem niemego parser, który obsługuje wszystkie proste rzeczy (playID, kwartał, czas, dół & dystans, ofensywny zespół) wraz z niektórymi skryptami, które idą i pobierają te dane i odkażają je do formatu pokazanego powyżej. Pojedyncza linia zostaje przekształcona w obiekt "Play", który ma być zapisany w bazie danych.

Najtrudniejszą częścią (przynajmniej dla mnie) jest parsowanie opisu gry. Oto kilka informacji, które chciałbym, aby wyodrębnić z tego łańcucha:

Przykład ciąg:

"Mark Sanchez pass to the left to Shonn Greene for 7 yards to the NYJ44. Tackled by Mike Jenkins." 

Wynik:

turnover = False 
interception = False 
fumble = False 
to_on_downs = False 
passing = True 
rushing = False 
direction = 'left' 
loss = False 
penalty = False 
scored = False 
TD = False 
PA = False 
FG = False 
TPC = False 
SFTY = False 
punt = False 
kickoff = False 
ret_yardage = 0 
yardage_diff = 7 
playmakers = ['Mark Sanchez', 'Shonn Greene', 'Mike Jenkins'] 

Logika, że ​​miałem na moim początkowym parsera poszedł coś takiego :

# pass, rush or kick 
# gain or loss of yards 
# scoring play 
    # Who scored? off or def? 
    # TD, PA, FG, TPC, SFTY? 
# first down gained 
# punt? 
# kick? 
    # return yards? 
# penalty? 
    # def or off? 
# turnover? 
    # INT, fumble, to on downs? 
# off play makers 
# def play makers 

Opisy mogą być bardzo owłosione (wiele pomyłek & odzyskiwanie z karami itp.) I zastanawiałem się, czy mogę skorzystać z niektórych modułów NLP. Prawdopodobnie zamierzam spędzić kilka dni na głupi/statyczny automat, jak na przykład parser, ale jeśli ktoś ma sugestie, jak się do niego podejść za pomocą technik NLP, chciałbym o nich usłyszeć.

+9

Biorąc pod uwagę temat pytania, uważam, że interesujące jest to, że zakreślacz SO jest podświetlany przez wszystkie ludzkie imiona ... – Jon

Odpowiedz

4

Myślę, że pyparsing byłby tutaj bardzo przydatny.

Twój tekst wejściowy wygląda bardzo regularnie (w przeciwieństwie do prawdziwego języka naturalnego), a pyparsing jest w tym dobry. powinieneś rzucić okiem na to.

Na przykład, aby przeanalizować następujące zdania:

Mat McBriar punts for 32 yards to NYJ14. 
Mark Sanchez rush to the right for 3 yards to the NYJ24. 

byłoby zdefiniować zdanie parsującej z czymś (poszukaj dokładnej składni w docs):

name = Group(Word(alphas) + Word(alphas)).setResultsName('name') 

action = Or(Exact("punts"),Exact("rush")).setResultsName('action') + Optional(Exact("to the")) + Or(Exact("left"), Exact("right"))) 

distance = Word(number).setResultsName("distance") + Exact("yards") 

pattern = name + action + Exact("for") + distance + Or(Exact("to"), Exact("to the")) + Word() 

I pyparsing pęknie ciągi przy użyciu ten wzór. Zwróci także słownik z nazwą, działaniem i odległością - wyodrębniony ze zdania.

+0

Sprawdzę to i zgłoś się, dzięki. – Jon

0

Wyobrażam sobie, że pyparsing będzie działał całkiem dobrze, ale systemy oparte na regułach są dość kruche. Jeśli więc przekroczysz piłkę nożną, możesz wpaść w kłopoty.

Myślę, że lepszym rozwiązaniem dla tego przypadku byłaby część taggerów mowy i leksykon (słownik do odczytu) nazw zawodników, pozycji i innych terminów sportowych. Wrzuć go do swojego ulubionego narzędzia do nauki maszyn, wymyśl dobre funkcje i myślę, że całkiem nieźle.

NTLK to dobre miejsce na start z NLP. Niestety, pole nie jest bardzo rozwinięte i nie ma tam narzędzia, które byłoby jak bam, problem rozwiązany, łatwy serowy.

Powiązane problemy