https://t.me/contest/268



Прошёл наконец-то второй раунд Data Clustering Contest по детекции категорий телеграм каналов. В первом раунде надо было детектить язык и категорию русских и английских каналов, о нём я уже говорил. Во втором раунде надо было детектить помимо обычных категорий ещё и всякие проблемные типа торговли оружием, взломанного софта и так далее плюс три новых языка — узбекский, фарси и арабский. На второй контест у меня было значительно меньше времени из-за работы, поэтому и занял 3 место с призом в $3800.



На вход давались телеграм каналы с больше, чем 1000 подписчиков. Условия



Как решал?



Язык



По детекции языка я выбрал микс CLD2 и CLD3, старые и новые детекции языка в Chromium браузере. Первый безумно быстро работает и хороший на средних-больших текстах (100+ символов). CLD2 обычный байесовский классификатор по 3-4 граммам UTF-8 символов и понятно, почему на мелких текстах оно было хуже. Когда CLD2 выдавал колеблющиеся вероятности, я применял CLD3, который уже работает с 2 уровнями слоев нейронки. CLD3 где-то в 3-5 раз медленнее CLD2, но количество каналов с очень мелкими постами было не слишком много, где-то процентов 10. В итоге получилось 96% качества, когда как следующее решение в контесте выдавало максимум 94.3%. Из забавного, полпроцента где-то потерял из-за того, что арабский детектился как шведский https://github.com/google/cld3/issues/45, хотя ничего этому не должно предвещать. Плюс была плохая инструкция, что делать, если несколько языков в постах, я выбирал majority, оказалось, в финальной разметке было правило, что если есть менее популярный язык (например, персидский и английский), надо выбирать его (персидский).



Категории



C классификацией было сложнее. Телеграм каналы очень плохие по своему контенту и где-то 10-14 категорий занимали 90% всех каналов, это категории с новостями, спортом, криптовалютами, гэмблингом и тому подобное. Было сложно находить хорошие примеры каналов даже в тех датасетах, которые давали.



Мой взор упал на https://tgstat.com/, это база телеграм каналов с большим пересечением по категориям требуемых в условии. Тем не менее, там показываются топ 100 по всем категориям, в итоге было максимум 4к каналов на обучение. У них даже есть API, которое за 10000 каналов требует 45000 рублей при утверждении, что у них где-то 150 тысяч размеченных. Я честно им предложил выкупить всю базу, но они мне отказали.



Ну отказали и отказали. У них был @SearcheeBot, который по inline кнопкам поиска показывал все каналы, в итоге я скачал через Telegram API всю их базу, 150 тысяч каналов. Через 2 дня после этого они ограничили количество результатов в inline кнопке до тысячи, видимо, им не понравилось :)



В итоге у меня было 150к каналов с размеченными категориями, пересечение с датасетом самого телеграма в условиях: русский 60%, английский 33%, узбекский 44%, фарси 10%, арабский 5%. Также Телеграм меня заблочил за прокачку постов каналов, в итоге я использовал t.me/c как веб версию и качал где-то пару суток все 150к каналов. То есть у меня на руках был приличный датасет, с приличным количеством размеченных каналов, которые скорее всего будут в тестирующих датасетах. Все каналы, которые не нашлись, я перевёл на английский и закинул в толоку, потратил $300 и увеличил ещё покрытие на 5-10% всех каналов.



В итоге было 160к размеченных данных, на которых я применил fasttext классификатор с learning rate 1.0, one-vs-all лоссом и выбил по меркам телеграма 53-58% качества. Здесь мне не хватило практики, так как я не настоящий сварщик машинного обучения, думаю, с 160к размеченными каналами можно было бы написать классификатор процентов на 15 лучше. Но я не умею обучать BERT или DSSM и ещё не умереть по времени. Потратил на два раунда суммарно часов 120.



Из плохого мне пришлось ещё руками докручивать несколько категорий из-за плохой разметки, что по моим оценкам дало 3% качества. Были проблемы gambling vs sport и bets vs economics.



Было весело, участвуйте.