Ботов отличать от людей и правда сложновато. Я и сам толком не могу это сделать. Но зато я придумал неплохой велоси... метод, как отличать в VK «интересных людей» от «не очень интересных». В плане сетевого общения, естественно, а не по жизни.
Если вам в друзья стучится кто-то, а вы с первого взгляда не можете понять это вообще нормальный человек или хрен знает кто, этот метод может дать немного полезной информации о пользователе. Использовать его для выявления актуальных таргет-групп вряд ли выйдет, потому что VK поставил ограничение на возможность скачивания содержимого стен пользователей, да и медленный больно он. Т.е. можно, но надо сильно дорабатывать, оптимизировать и изворачиваться, чтобы обходить ограничения.
Основная идея
Основная идея заключается в том, что боты, унылые (в сетевом плане) личности, всякие массовые собиратели друзей-подписчиков не очень заботятся о том, кто у них в друзьях, хотя могут достаточно много «писать» у себя на стене содержательных постов. Но унылые личности свою ленту особо не читают, а ботам это вообще не надо. Тем более это не надо массовым собирателям подписчиков и звездам.
Но людям, которые имеют хоть какие-то коммуникативные интересы относительно ВК, как раз очень важно, кто у них в друзьях. И, конечно, они не будут у себя в друзьях собирать 6000 чуваков, которые шапрят только репосты, картинки голых баб и рекламу сливных бочков со скидкой со склада в Новом Уренгое.
И на этом основании можно попытаться составить критерий, по которому выделять людей, которые интересуются содержанием своей ленты. Такие люди проявляют черты настоящего человека. Человека, который, как минимум, осуществляет содержательный односторонний коммуникативный акт. В наше время это уже не так мало.
Сразу мне в голову пришли два критерия:
- Средний словарь друзей человека за N последних постов.
- Процентное количество постов без текстов у друзей проверяемого человека.
И на основе чего-то такого уже можно пытаться строить какую-то модель, которая бы отличала интересных людей от не очень интересных.
И как в итоге я это проверял?
Я выбрал 50 случайных своих друзей и 50 случайных подписчиков, которые отвечали некоторым критериям, которые бы отрезали совсем очевидных фейков, детей или людей, которые не пользуются этим всем. Типа того, что пользователь не должен быть деактивирован и у него должно быть при этом больше 50 существующих друзей.
Всех этих людей я просмотрел и обозначил, кто из них «бот», а кто нет. Естественно, большинство друзей были настоящими, а большинство подписчиков предлагали что-нибудь купить (но несколько настоящих людей там было).
Дальше у каждого из друзей проверяемого я брал первые 100 постов, если их было столько на стене. Для каждого человека считал два таких фактора:
- Средний размер словаря друзей человека за их первые 100 постов. Т.е. 50 друзей, у каждого примерно по 100 постов. Для каждого друга все слова из 100 постов сгребаются в кучу, стеммируются и считается количество уникальных слов друга. Дальше считается среднее для всех 50-и друзей. От этого значения брался корень — SQRT(Dic).
- Если у друга больше 60 из 100 постов без слов, он обозначается «потерянным». Процент «потерянных» людей в друзьях это второй фактор — Percent.
Еще один фактор проявился случайно. Это логарифм от Айди в ВК log10(ID)
На этом всем я обучил логистическую регрессию, и получил такую:
log(OR) = 9.92-1.537*log10(ID)+0.067*SQRT(Dic)-0.023*Percent
Для тестовой части выборки получился очень неплохой классификатор с AUC = 0.93. Вот такая у него ROC кривая:
ROC кривая классификатора, определяющего содержательность страницы человека
Некоторые вопросы вызывает такая значимость ID ВК для классификации содержательности личности, но кажется, увы, оно так и работает. Чем дальше ID от 1, тем больше вероятность, что это просто бот, который сделан, чтобы рекламировать микрокредиты. Без ID классификатор тоже работает, но хуже. AUC = 0.78. Это не прям хорошо, но и не прям бесполезно.
В любом случае, конечное решение по полезности персонажа за принимающим решение.
Дополнительная проверка
Я взял у одного из своих товарищей все его 5000 подписчиков, где, естестенно, рекламного шлака 95% и прогнал регрессию без дополнительного дообучения. При отсечке на 20%, результаты вышли такие TP = 78%, FP = 11%. Т.е., в целом, на произвольном человеке это тоже более ли менее работает.
Могут ли делать ботов, которые проходят этот тест?
Да, достаточно легко сгенерировать бота у которого в окружении друзей будут какие-то псевдосодержательные посты, но пока это никому не надо. Ну и тяжело с разным контентом заморачиваться, потому что если всем ботам один и тот же генерировать, это тоже легко распознать.
А нельзя ли сделать приложение, которое бы людей по ID проверяло?
Наверное можно, но мне влом делать прилу ВК. Если кто хочет, пусть сам сделает. Вроде метод описан, идея его несложна.
Не слишком ли банально?
Достаточно. Но вдруг кому пригодится как база для своих разработок. Этот метод легко можно усложнять, например, считая не просто длины словарей, а учитывая контент. Тут уже можно применить всю мощь NLP и обучать по контенту. Еще можно брать более сложные классификаторы: деревья, нейросети и т.д. Все это можно усложить, но важно, что даже простые что-то интересное дают.
Автор: magisterbes