Ц
Цифры в спорте
@numbers_in_sport620 подп.
664просмотров
3 декабря 2025 г.
Score: 730
В блоге отдела аналитики Пармы (очень советую почитать, но он на Notion), одной из немногих площадок, где люди из клуба делятся с сообществом своими знаниями и наработками, вышла статья про сопоставление имён игроков в разных источниках данных. Проблема важная, потому что мы бы хотели аккумулировать в единый PLAYER_ID все данные об игроке из всех доступных нам источников, но этому активно мешает тот факт, что логика нейминга у каждого источника своя. И если с Олегом Ивановым, скорее всего, проблем не будет, то простор для написания имён балканских и уж тем более латиноамериканских игроков огромен. Пример: Бителло может быть Bitello, а может Joao Paulo de Souza Mares. Догадаться, что это один игрок нетривиальная задача. В Парме используют следующий алгоритм действий: • Из каждого источника данных берутся имя игрока и дата его рождения • Удаляются ударения, знаки препинания (актуально для балканских и латиноамериканских игроков) заменяются на пробелы, лишние пробелы (спереди-сзади или если получилось два пробела подряд) удаляются, имена переводятся в нижний регистр (нет заглавных букв) • К имени добавляют дату в виде DDMYY, где M — это месяцы, закодированные первыми 12 буквами английского алфавита (01 — А, 02 — B и т. д.) • Для сопоставления используется алгоритм TF-IDF: имя разбивается на перекрывающиеся n-граммы. N-грамма — это несколько символов подряд. Возьмём опять Бителло. N-граммы его имени с размером 3 и перекрытием 2 (такие параметры используют в Парме) будут [«Бит», «ите», «тел»…]. Каждая n-грамма в зависимости от своей распространённости получает вес (чем чаще она встречается, тем меньше уникальность и вес). Для каждого имени получается вектор длиной, равной количеству уникальных n-грамм во всей выборке, на которых считается косинусное сходство. • Мэппинг происходит только если: а) близость двух векторов имён выше определённого нижнего порога (например, 0.5), и есть двунаправленность, т.е. имя А в первом источнике лучшее совпадение для имени Б во втором и наоборот Коллеги выложили код своего решения на гитхаб (за что им отдельная благодарность), так что каждый может его попробовать. Я сам делал аналогичную систему сопоставления ID и имён баскетболистов с двух главных источников данных по НБА: nba.com и bbref.com. Там логика простая — сначала ищутся полные совпадения в двух источниках, а затем разбираются корнер-кейсы (если что-то не сопоставилось или сопоставилось несколько раз). Система работает, но для футбола не подойдёт из-за отличающегося на порядки числа игроков. В НБА за всю её историю до сих пор не сыграло 6 тысяч игроков. В футболе игроков сотни тысяч или миллионы. Я тоже думал про «уточнение» имён футболистов дополнительными данными, но использовал для этого текущие команды и лиги. Смысл тот же, но почему-то сам до использования более уникального параметра, как дата рождения игрока, не догадался. Это ещё раз показывает, как классно, когда делятся знаниями. Решение от Пармы, как и всё, неидеально. В примере с Бителло, скорее всего, даже добавление даты рождения не даст «пробить» векторам нижний порог сходства. Тут нужно использовать дополнительные механики. Но оно (решение) - это хорошая базовая модель, которую можно использовать в полуавтоматическом режиме (мэппить 90-95% игроков, а случаи, аналогичные Бителло, сопоставлять руками) или пытаться улучшить, чтобы получить полностью автоматизированный пайплайн сопоставления игроков. Также в статье опущена часть сбора данных, а она может занять процентов 90% времени разработки инструмента и потребовать разного рода приседаний. Это касается в первую очередь общедоступных сайтов, например Transfermarkt, который активно борется с парсингом. Если вы работаете с API провайдеров, то эта часть упрощается до чтения JSON и не представляет труда. А за открытость к сообществу отделу аналитики Пармы отдельный поклон. Статья в блоге Пармы Код на гитхаб Код на гитхаб моего решения для НБА @numbers_in_sport
664
просмотров
3965
символов
Нет
эмодзи
Нет
медиа

Другие посты @numbers_in_sport

Все посты канала →
В блоге отдела аналитики Пармы (очень советую почитать, но о — @numbers_in_sport | PostSniper