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 train
guesser
. 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.
Czy rozwiązałeś ten problem? – briankip
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