С телефонным спамом знакомы все, кто засветил свой номер в интернете, заполнил сомнительную анкету в офлайне или кому просто не повезло попасть в многочисленные базы. Сегодня мы расскажем читателям Хабрахабра о том, как с помощью отзывов пользователей и машинного обучения мы научили приложение Яндекс предупреждать о нежелательных звонках.
Звонки с незнакомых номеров – это всегда тяжелый выбор. Звонит ли это долгожданный курьер или очередной оператор с «уникальным» рекламным предложением? Для решения этой проблемы существуют мобильные приложения, которые работают на базе справочников известных организаций. Отчасти они решают проблему. Но наиболее агрессивные спамеры, сомнительные коллекторы и злоумышленники в такие базы не попадают. Что делать?
Идея создания собственного определителя номеров пришла к нам случайно. Внимание привлёк один из сотрудников компании, который носил с собой два телефона. Когда на основной телефон звонили с незнакомого номера, он вводил этот номер в поисковике на втором устройстве и искал отзывы в сети. Этот способ трудно назвать удобным, но мы вдохновились и решили немного автоматизировать его. Собрали первый прототип для Android, который делал следующее: во время входящего звонка открывалось окно с webview, в котором загружались результаты поиска по номеру входящего звонка. Отлично! Нам удалось сэкономить на одном телефоне. А если серьезно, то, несмотря на упрощение рутины, пользы от этого было мало.
Попробуйте вбить любой номер телефона в поисковой системе. Вы гарантированно найдете сайты, которые намекают на то, что у них есть отзывы на номер. Но если кликнуть по результату, то в большинстве случаев окажется, что на сайте просто сгенерированы страницы для всех возможных номеров, но самих отзывов там нет. Искать в таких условиях информацию о входящих звонках слишком долго и неэффективно. Единственный способ сделать хорошо – это находить ответ сразу. Но для этого нужны данные.
У Яндекса есть Справочник. Это база знаний об организациях, которая пополняется как компаниями, так и пользователями. Оттуда берётся информация об организациях, когда их ищут в Поиске или Картах. Когда наш внутренний прототип определителя номеров для мобильного устройства впервые перешёл от простой выдачи к вердиктам, данные подтягивались именно из Справочника. Но этого было недостаточно: слишком уж часто звонят с номеров, принадлежность которых к тем или иным компаниям не афишируется. Чтобы побороть эту проблему, нужно дополнительно собирать отзывы у пользователей, которым звонили с этих номеров.
Начали с простого. С прошлого лета поиск Яндекса предлагает пользователям оставить отзыв на телефонный номер, который они ищут в поиске. Обычное текстовое поле для отзыва в свободной форме. Мы не стали ограничивать отзыв конкретными вариантами ответа, потому что не до конца представляли себе разнообразие источников нежелательных звонков. Проблема в том, что разбор отзывов в свободной форме достаточно трудно автоматизировать. Но мы обошли эти трудности с помощью краудсорсинговой платформы Толока, пользователи которой помогли разобрать и классифицировать отзывы.
Так мы начали собирать данные не только об известных организациях с относительно хорошей репутацией, но и о спамерах, мошенниках, агрессивных коллекторах, пранкерах и даже о любителях молчать в трубку. Хотя далеко не все категории можно было смело записывать в нежелательные звонки. К примеру, звонки от курьерских служб обычно полезны.
Данные Справочника и первые отзывы пользователей легли в основу определителя номеров Яндекса, который в прошлом году запустился в веб-версии Поиска. Яндекс начал отвечать вердиктами на многие запросы, содержащие телефонные номера.
Вскоре ранняя версия определителя номеров была встроена в приложение Яндекс.Карт. Она работала только по базе Справочника, поскольку отзывов по прочим категориям ещё было недостаточно для качественной работы. Это и привело нас к следующему этапу в развитии определителя. Собирать отзывы надо на мобильном устройстве и сразу после звонков с неизвестных номеров, а не ждать их в вебе. Но как это сделать? Первые внутренние попытки собирать отзывы после любого звонка привели к проблемам. Слишком частые запросы раздражают пользователей. Более того, если любой пользователь может оставить отзыв на любой входящий звонок, то это провоцирует и упрощает накрутку. Нужно было действовать умнее.
Яндекс специализируется на машинном обучении. С его помощью Поиск строит выдачу, Браузер выявляет вредоносные сайты, а Музыка рекомендует треки. Машинное обучение позволяет нам выявлять неочевидные закономерности при анализе большого числа разнородных факторов. Поэтому мы применили его в новой версии определителя номеров, которая теперь работает в приложении Яндекс для Android. Наша технология, основанная на библиотеке CatBoost, анализирует более двух сотен факторов при принятии решения о запросе отзыва. К примеру, частота и длительность звонка. Об остальных факторах мы по понятным причинам умолчим, но это решение позволило снизить навязчивость и максимально усложнить накрутку отзывов.
Несколько слов о том, как это сейчас работает. Если пользователь приложения Яндекс включил в настройках определитель, то при звонках с неизвестных номеров отправляется запрос в наше облако, откуда возвращается вердикт.
К слову, вердикт можно посмотреть и для пропущенных звонков. Это бывает удобно, когда не знаешь, стоит ли перезвонить.
Если Яндекс точно не знает, откуда идёт звонок, то по его завершению пользователь может увидеть просьбу оставить отзыв. Вероятность появления этого запроса как раз и зависит от анализа всех факторов в облаке.
Сейчас мы собираем новые отзывы, которые неизбежно повлияют на развитие технологии определителя номеров в будущем. Если у вас есть опыт создания подобных систем, или вы видите альтернативное решение проблемы телефонного спама и прочих нежелательных звонков, то нам было бы интересно обсудить это. Спасибо.
Автор: Тимур Гаскаров