7

Jestem w trakcie pisania bota, który umieszcza zakłady na stronie internetowej Betfair przy użyciu ich interfejsu API Python. Chcę postawić zakłady na mecze piłki nożnej (piłki nożnej), gdy są one w grze.Probabalistyczne dopasowywanie ciągów znaków w języku Python

Założyłem kod XML, który przekazuje mi dane na żywo z gier, jednak źródło danych XML nie zawsze używa tej samej nazwy dla drużyn piłkarskich, które używają Betfair.

Na przykład, odnosząc się do Manchester United, Betfair może używać "Man Utd", podczas gdy kanał XML może używać "Man United" lub innego wariantu. Nie ograniczam się do popularnych rynków, więc tworzenie standardowej tabeli konwersji Betfair na XML nie jest wykonalne.

Próbuję użyć pewnego rodzaju probabilistycznego dopasowywania ciągów, aby dać mi wskazówkę, że te dwa źródła danych odnoszą się do tych samych zespołów.

Do tej pory grałem z Wielebnym, który wydaje się wykonywać pewne bayesowskie obliczenia, jednak nie sądzę, że używam go poprawnie, ponieważ muszę przerwać ciąg znaków na znaki trainguesser. Następnie po prostu przeciętnie prawdopodobieństwo, że każda litera jest związana z każdym nazwiskiem, jestem świadomy, że jest matematycznie niepoprawny, ale myślałem, że to może być wykonalny test heurystyczny.

Oto mój kod:

import scorefeed 
from reverend.thomas import Bayes 

guesser = Bayes() 
teams=['home','away'] 


def train(team_no, name): 

    for char in name: 
     guesser.train(teams[team_no], char) 

def untrain(team_no, name): 

    for char in name: 
     guesser.untrain(teams[team_no], char) 

def guess(name): 

    home_guess = 0.0 
    away_guess = 0.0 

    for char in name: 

     if len(guesser.guess(char)) > 0: 

      for guess in guesser.guess(char): 

       if guess[0] == teams[0]: 
        home_guess = home_guess + guess[1] 
        print home_guess 
       if guess[0] == teams[1]: 
        away_guess = away_guess + guess[1] 
        print away_guess 
    home_guess = home_guess/float(len(name)) 
    away_guess = away_guess/float(len(name)) 

    probs = [home_guess, away_guess] 
    return probs 

def game_match(betfair_game_string, feed_home, feed_away): 
    home_team = betfair_game_string[0:betfair_game_string.find(' V ')] 
    away_team = betfair_game_string[betfair_game_string.find('V')+2:len(betfair_game_string)] 

    train(0, home_team) 
    train(1, away_team) 

    probs = [] 
    probs.append(guess(feed_home)[0]) 
    probs.append(guess(feed_away)[1]) 

    untrain(0, home_team) 
    untrain(1, away_team) 

    return probs 



print game_match("Man Utd V Lpool", "Manchester United", "Liverpool") 

Prawdopodobieństwo wytwarzany z bieżącej konfiguracji jest [0.4705411764705883, 0.5555]. Byłbym wdzięczny za wszelkie pomysły i ulepszenia.

EDYCJA: Mam inną myśl, chcę prawdopodobieństwo, że jest to ten sam mecz na Betfair i na kanale. Ale to daje mi prawdopodobieństwo, że imię pasuje, i że drugie imię pasuje. Muszę znaleźć prawdopodobieństwo, że pierwsze i drugie imię pasują do siebie. Dlatego mam zakodowane się następującą funkcję, która wydaje się dać mi więcej sensownych wyników:

def prob_match(probs): 

    prob_not_home = 1.0 - probs[0] 
    prob_not_away = 1.0 - probs[1] 

    prob_not_home_and_away = prob_not_home*prob_not_away 
    prob_home_and_away = 1.0 - prob_not_home_and_away 

    return prob_home_and_away 

jeszcze bym wdzięczny za wszelkie sugestie dotyczące różnych metod i zaleceń istniejących bibliotek, które robią to samo, lub wskazówek na korygowaniu mój prawdopodobieństwo obliczenia.

+1

Czy rozwiązałeś ten problem? – briankip

+0

Nigdy nie rozwiązałem go poprawnie, najlepszym rozwiązaniem, jakie znalazłem, było użycie tego, co wstawiłem do edycji. Jest kilka rzeczy, których chciałbym teraz spróbować, być może porównując kodowanie soundexów dwóch ciągów lub może powtarzalną sieć neuronową wykorzystującą LSTM lub coś podobnego. – James

Odpowiedz

2

Oto moja rada. Przeczytaj http://norvig.com/spell-correct.html, zaimplementuj coś na podstawie tego i sprawdź, jak działa. Mam nadzieję, że będzie dobrze działać.

Przyspieszenie poprzez buforowanie wyników w locie, tak aby po odgadnięciu przypuszczenia dla danej nazwy, po prostu ponownie wykorzystuje przypuszczenia.

Twoja implementacja powinna zawierać raport wyjątków o najbardziej wątpliwych domysłach, aby można ręcznie sprawdzić i odrzucić lub naprawić.

Powiązane problemy