tgoop.com/bminaiev_blog/50
Last Update:
Telegram ML Competition. Решение.
Первая часть.
Я начал с того, что попытался собрать какой-то датасет из реальных кусков сообщений, которые люди оборачивают в кавычки. Скачивать реальные чаты через API мне показалось плохой идеей (явно же забанят довольно быстро), поэтому вместо чатов я скачивал каналы, которые можно смотреть по ссылке типа https://www.tgoop.com/s/bminaiev_blog, которая не требует авторизации.
Я не нашел какого-то нормального списка из всех существующих каналов, поэтому я руками набрал какой-то небольшой список исходных каналов, а потом в них смотрел на репосты или ссылки на другие каналы и добавлял их в очередь для скачивания и так по кругу. В итоге у меня набралось порядка миллиона каналов, для каждого из которых я распарсил сколько-то последних сообщений, которые видны при открытии канала через www.tgoop.com/s/
.
Из этого датасета было довольно очевидно, что большинство вещей, которые обернуты в кавычки, это какой-то трэш, а не код. И если оценивать будут действительно количество правильно определенных текстов, то сделать решение, которое работает лучше, чем return OTHER;
довольно сложно. Спойлер: всего два участника из ~100 написали что-то лучшее чем такой бейзлайн.
В этот раз у меня было довольно мало времени на участие в контесте, поэтому от идеи "нужно натренировать какую-нибудь маленькую модель и научиться ее запускать через что-нибудь типа llama2.c" я очень быстро дошел до "нужно за выходные написать хоть что-то работающее хотя бы на каком-то наборе языков".
Я нашел существующую библиотеку, которая умеет определять язык, и работает довольно быстро. Внутри у нее есть какой-то относительно неплохой токенизатор, а потом она просто перемножает вероятность встретить каждый токен для каждого языка программирования. Но у нее есть две проблемы. Во-первых, она не умеет определять, что текст не является кодом. А во-вторых, она никак не учитывает реальную популярность языков, поэтому часто возвращает язык, который вряд ли вообще присутствует в датасете.
Чтобы быстро решить вторую проблему, я просто выкинул большинство языков программирования и оставил ~10 самых популярных. Понятно, что можно сделать что-то лучше (например, ввести какие-нибудь веса для языков программирования), но когда времени мало, и так сойдет.
Чтобы побороться с первой проблемой я вначале думал просто добавить условие "если никакой язык программирования не набрал скор лучше какого-то барьера, то верни OTHER". Но из-за того, что трэша в датасете было много, работало это так себе. В итоге я нашел список ключевых слов для каждого языка программирования и сказал, что если в тексте нет ни одного ключевого слова, то он OTHER. Пришлось еще немного обработать эти списки и убрать из него слова типа "in", "or", "not". После этого результат получился уже относительно неплохой.
Рассказ получился длинный, но надеюсь кому-нибудь было интересно :)
BY Боря программирует
Share with your friend now:
tgoop.com/bminaiev_blog/50