7

Я в процессе написания бота, который ставит ставки на веб-сайте Betfair, используя их API Python. Я хочу делать ставки на футбольные матчи, когда они играют в игру.Probabalistic String Matching in Python

Я закодировал XML-канал, чтобы дать мне живые данные из игр, однако XML-фид не всегда использует одно и то же имя для футбольных команд, как использование Betfair.

Например, если ссылаться на «Манчестер Юнайтед Бетфейр», можно использовать «Манчестер Юнайтед», в то время как XML-канал может использовать «Man United» или какой-либо другой вариант. Я не ограничиваюсь популярными рынками, поэтому создание стандартной таблицы преобразования имен Betfair в XML не представляется возможным.

Я пытаюсь использовать какое-то вероятностное сопоставление строк, чтобы дать мне указание, что два источника данных относятся к тем же командам.

До сих пор я играл с преподобным, который, кажется, выполняет байесовские вычисления, однако я не думаю, что я использую его должным образом, поскольку мне нужно разбить строку на символы до trainguesser. Затем я просто усредняю ​​вероятность того, что каждая буква связана с каждым именем, я знаю, что это математически неверно, но я думал, что это может быть выполнимый эвристический тест.

Вот мой код:

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") 

Вероятность производится с текущей установкой является [0.4705411764705883, 0.5555]. Я был бы очень благодарен за любые идеи или улучшения.

EDIT: У меня была другая мысль: мне нужна вероятность того, что это будет тот же самый матч на Betfair и фиде. Но это дает мне вероятность совпадения первого имени и совпадения второго имени. Мне нужно найти вероятность совпадения первых И-вторых имен. Поэтому я закодирован до следующей функции, которая, кажется, чтобы дать мне более разумные результаты:

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 

я бы до сих пор ценю любые предложения для различных методов или рекомендаций существующих библиотек, которые делают то же самое, или советов по исправлению моей вероятности расчеты.

+1

Вы решили эту проблему. – briankip

+0

Я никогда не решал это правильно, лучшим решением, которое я нашел, было то, что я ввел в редактирование. Есть несколько вещей, которые я хотел бы попробовать в настоящее время, возможно, сравнение кодировок soundex двух строк или, возможно, повторяющейся нейронной сети, использующей LSTM или что-то в этом роде. – James

ответ

2

Вот мой совет. Прочитайте http://norvig.com/spell-correct.html, реализуйте что-то на этом основании и посмотрите, насколько хорошо он работает. Надеюсь, он будет работать достаточно хорошо.

Ускорьте это путем кеширования результатов на лету так, чтобы как только он вычислил предположение для данного имени, он просто повторяет предположение.

У вашей реализации должен быть отчет об исключениях из самых сомнительных догадок, чтобы вы могли вручную просмотреть и либо отклонить, либо исправить их.