Привет, Пикабу. Несмотря на происходивший трэш и угар, я продолжу описывать WSS пока рейтинг ещё не достиг порога блокировки. Для меня удивительно ещё то, что число подписчиков возросло. Расскажу о ходе создания WSS в порядке, близком к хронологическому, как и было обещано в http://pikabu.ru/story/_2783809 .
С самого начала ядром всей концепции был поиск по интересам: каким-бы аноном не была-бы цель - всё равно её интересы определяемы по активности в сообществах. Интересы, цели и идеи человека - ключевые аспекты, почти всё остальное значительно менее важно. Началось всё с попыток ручного последовательного поиска http://vk.com/search в пределах целевых сообществ (список их уже был приведён), но стала очевидна необходимость автоматизации (идея была расценена как безумная), тогда с API я работать ещё не умел.
Позже я наткнулся на новости про Эмму и Криса, также про подобные кустарные попытки наладить data mining социальных сетей для того, чтобы подобрать себе друзей/подруг быстрее и селективнее. После этого я (в очередной раз) убедился в том, что безумная идея не является безумной, а является реальной, оправданной и не новой - что только укрепило мои намерения реализовать систему широкоформатного скрининга (методология "шотгана" с конвейерами фильтров мне была отлично знакома уже несколько лет с диплома, потому все сложности для меня были только технические). После этого я начал осваивать API vk.com и писать не биоинформатические скрипты, не без сторонней помощи - но та была минимальна. Не вижу смысла описывать технические тонкости, потому перейду к первым версиям.
В первых прототипах принцип работы был прост: запрашиваются полные списки всех членов группы с выдачей основной (пол, возраст, отношения, город, образование, фотка) информации, удалялись дубликаты (ведь нередко люди состояли в нескольких целевых группах, в "сырых" списках это давало дублирование) и выполнялась первичная фильтрация - отбор пола F, отсечение неподходящего возраста и удаление отношений типа "кто-то есть", при этом для предотвращения потерь случаи с не указанными параметрами оставлялись. Сразу-же было видно что сила фильтров недостаточна - остаётся очень много кандидаток, явно слабых, нужно было улучшать систему. Первые-же полученные данные подвергались exploratory analysis (EDA), чтобы понять что представляет собой то, с чем я работаю, как фильтровать дальше, что убрать и что добавить (конечно, EDA много делали раньше и лучше, я знал чего ожидать). EDA показал что, как это обычно бывает с данными от "естественных источников" - в данном случае людей, разреженность данных очень значительна, некоторые параметры указаны столь редко, что вряд-ли могут использоваться для фильтрования. В десятках процентов случаев возраст был урезан или отсуствовал, часто не было страны и города, в большинстве случаев не было указано образования. Более не было возможно придумать действительно селективных (отбрасывающих действительно не подходящих) и сильных (отсекающих наибольшее число не подходящих) фильтров, потому было решено группировать кандидаток на категории - высокоприоритетных, среднеприоритетных и низкоприоритетных, чтобы сначала вручную проработать самых интересных, постепенно переходя к менее интересным.
Для условно следующей версии были введены фильтры, отсекающие заблокированных пользователей (дополнительное поле 'deactivated' в возвращаемых данных, оно не всегда было на первых выборках) и отбрасывающие очень давно неактивных (параметр last_seen - дата последнего посещения), хотя величина этого "давно" берётся с потолка в размере 1 месяца. Чтобы решать задачу группировки был введён первый вариант системы вычисления рейтинга (score): присваивались баллы за наличие указанного возраста, образования, отношений (высокая прибавка если "в активном поиске", маленькая за "одна" и нет за не указанный параметр), также был сделан список "городов интереса" - серия городов, в которых либо рядом с которыми есть возможность поживания, за нахождение в которых присваивался высокий дополнительный балл. "Города интереса" это одно из внешних ограничений, проблемы профессионального географического детерминизма и крайне труднорешаемости квартирного вопроса в этой стране. Система вычисления score позволила разбить кандидаток на 3 категории: ~50 человек высокого приоритета, куда попали почти все "в активном поиске"; ~200 человек среднего приоритета, где в большинстве были кандидатки из "городов интереса", поскольку среди них был город Москва; ~2500 канидаток низкого приоритета, у которых было мало указанных параметров и которые были из много откуда. 50 человек - столько можно без проблем проработать за 2-3 дня, учитывая ограничения платформы, в роде лимитов сообщений и запросов.
Около трети списка высокого приоритета было отброшено ещё при ручном просмотре страниц без попыток связи, оставшимся рассылались либо запросы на добавление с мини-вариантом рассылочного текста, либо сам рассылочный текст с небольшими адаптациями. Вместе со списком высокого приоритета прорабатывались и кандидатки средней категории из главного "города интереса". Основным результатом были явные отказы по причине не заинтересованности в отношениях такого типа, реже были сообщения об отказе по причине наличия отношений - но с положительным отзывом о проекте, также значительную часть запросов проигнорировали даже после переспрашиваний (все явные отказы и не прошедшие ручную проверку отправляются в чёрный список WSS). За несколько итераций с мелкими изменениями в WSS было проверено порядка 200 человек, было несколько согласий на общение, но меня несколько удивил контингент: значительное число феминисток (в т.ч. и радикальных), были спамерши, кое-кому оказалось 15 лет (девочка из СпБ была оперативно послана), но самым неожиданным был результат наткнуться на двух транссексуалов - двух из двухсот человек, при встречаемости ~ 1:100000, один из которых был почти самым высокорейтинговым случаем. Стало понятно что систему рейтинга и фильтрования нужно сильно доработать, поскольку WSS реагировал больше на полноту заполнения анкеты, чем на то, что надо.
Для повышения селективности было добавлено получение информации о группах и подписках кандидаток, чтобы отсекать спамерш (с 1000 групп), как-то сортировать по членству в группах и точнее оценивать идеологичность (для этого список целевых групп был немного расширен и появились категории для идеологических групп - упомянутые T, R, N, S и I с разным рейтинговым весом). Параметры про образование, город и возраст были исключены из вычисления рейтинга (но оставлены в получении). Поскольку запрос получения списка всех групп пользователя выполняется только индивидуально для каждого пользователя - получение этой информации занимает значительное время (лимит у vk 3 запроса в секунду), потому такая ресурсоёмкая задача была поставлена после всех существующих фильтров. Простейший фильтр против спамерш (и, вероятно, камвхор) удалял кандидаток с 1000 групп, состоявших только в какой-то одной целевой группе - таких было не мало, визуальный просмотр их страниц подтверждал то, что я всё делаю правильно. За количество групп для score был введён штраф, логарифмически зависивший от числа групп, чтобы не очень резко отсекались любительницы беспорядочно вступать в группы, это может отсечь и тех, кто нужен. Эксперименты с корреляционным анализом и кластеризацией для членств в группах не удались, в основном из-за крайней разреженности состояния в группах (очень редко состояло больше нескольких человек в одной группе для моей выборки в 3000 кандидаток), потому списки были оставлены для будущих возможных средств обработки. Технически, из-за растущих объёмов кода, скачивание информации о группах было оформлено в виде отдельного служебного скрипта. Как и можно было предположить - к радикальным изменениям в количестве кандидаток это не привело, зато по топовым спискам стало видно что у инструмента растёт селективность.
Баловство с поиском vk другими людьми показало что, с некоторыми усилиями, можно обойти сокрытие года рождения для случаев частично указанного возраста с помощью итеративного поиска с указанием узкого диапазона возраста. За несколько попыток (некорректная работа имела место для прототипа - мне сообщали на поздних итерациях рассылок что возраст был указан и оценён он был не верно) была сделана служебная подпрограмма для прогона кандидаток с частично указанным возрастом, которая проверяла попадание возраста в диапазон 21-25 лет (потому и названо "реверсивная оценка возраста" - RAE) - сделать более точную оценку оказалось не стоящим того, т.к. vk.search, как оказалось, имеет значительно более строгие ограничения на число запросов и интервалы времени (мне его много раз блокировали на часы и сутки, причём по IP), которые не документированы из соображений безопасности. Оценка возраста и так занимала много часов, потому я не планирую это дорабатывать - оно того не стоит, главное чтобы возраст подходил, дальше можно просто спросить. Впрочем, RAE на дала существенного сокращения числа кандидаток, хотя минус 1-2 сотни это уже хорошо.
Следующим этапом увеличения силы измерения идеологичности было решено сделать анализ текста (ре)постов на стене, поскольку с помощью text mining можно делать много удивительных вещей, плохо что пока не для русского языка. На предварительных экспериментах была быстро отработана скачка и отбор plant text постов за всё время и только от пользователя (но репосты тоже учитывались), применение на всей выборке показало что это самый времяпотребляющий шаг (скачивание для 3000 кандидаток занимает порядка суток), конечный объём данных несжатого простого текста составляет 2Гб (!), без багов и отладки тоже не обошлось. Сразу-же был добавлен штраф за размер стены, также логарифмический по числу постов, ибо нефиг спамить. Первые попытки анализа текстов основывались на классических подходах информационного поиска на корреляционном и сравнительном анализе