Search
Write a publication
Pull to refresh
0
0
Филенков Максим @MaxF

Пользователь

Send message

Яндекс.Недвижимость

Reading time3 min
Views30K

Наверняка каждый, кто хотел снять или купить квартиру и искал предложения в интернете, сталкивался с огромным количеством некачественных объявлений. Самая частая проблема: «Квартира уже ушла, но могу предложить вам практически такую же». При этом квартиры, описанной в объявлении, могло вообще не существовать, а «практически такая же» — хуже, дальше и дороже. Очевидно, что людям важно, чтобы нужным им параметрам соответствовали не только объявления, но и сама недвижимость.

Сегодня мы запустили сервис для поиска жилья — Яндекс.Недвижимость.

Специально для него мы придумали алгоритмы, которые определяют качество объявлений — то есть, можно ли им доверять. Объявления, которые могут вводить пользователей в заблуждение, с сервиса убираются.

Алгоритмы Яндекс.Недвижимости учитывают множество факторов. В том числе:

Актуальность объявления
По статистике, квартира продается и сдаётся через вполне определённый срок после подачи объявления. Алгоритм Яндекс.Недвижимости умеет вычислять эти сроки, в том числе, учитывая обновления объявления. Устаревающие предложения убираются из результатов поиска.

Соответствие цены расположению
Цена квартиры зависит от её местоположения в городе — какие-то районы дороже, какие-то дешевле. Мы группируем предложения по местоположению, исходя из географии городов. При этом учитывается, например, в каком административном округе находится квартира, в центре или на окраине, насколько близко она к метро. Для каждой такой группы вычисляется средний разброс цен за квартиры разной площади — отдельно для продажи, отдельно для аренды. Если цена в объявлении меньше минимальной границы этого промежутка, скорее всего, данные в нём не соответствуют действительности. Например, очень дешевая однокомнатная квартира может на самом деле оказаться комнатой в коммуналке. Также отсеиваются объявления с опечатками, например, со стоимостью аренды в несколько миллиардов рублей.

Группировка дубликатов
Чтобы повысить вероятность звонка от потенциального клиента, агенты по недвижимости часто размещают на сайте не одно, а несколько объявлений. Например, указывают разные станции метро или немного разные цены. Предлагать одну и ту же жилплощадь могут и несколько агентов сразу. Найти одинаковые объявления легко по их параметрам — адрес дома, этаж и площадь квартиры. Такие объявления мы объединяем в одно.

В результате Яндекс.Недвижимость отсеивает до 30% объявлений. Зато мы можем быть уверены, что большинству оставшихся предложений можно верить.

Фильтрацией некачественных предложений работа над объявлениями не ограничивается. Например, мы используем на Яндекс.Недвижимости данные сервиса Яндекс.Карты. В объявления, в которых не хватает географических данных, мы их добавляем. Например, район города, станцию метро (если она есть), ж/д станцию (если недвижимость загородом), шоссе (для поиска по Московской области). Кроме того, Яндекс.Карты помогают корректировать информацию о том, сколько нужно добираться до ближайшего метро. Например, в объявлении указано, что до метро идти пять минут, а судя по данным с Яндекс.Карт — все двадцать. В объявлении на Яндекс.Недвижимости будет указано честное время. Если же пользователь указал, что идти дольше, чем посчитала машина, то мы верим данным пользователя.

Когда пользователь выбирает нужные ему параметры на Яндекс.Недвижимости, сервис показывает все объявления, которые им соответствуют, и ранжирует их. Ранжирование основывается на многих факторах. Например, в списке предложений аренды выше окажутся более свежие объявления с полными описаниями и небольшой ценой (но не самой маленькой — люди чаще ищут квартиры средней стоимости). Также учитывается, например, этаж, на котором квартира расположена (обычно все хотят не на первом и не последнем этаже) и расстояние до метро (лучше поближе). Формула ранжирования результатов поиска Яндекс.Недвижимости создаётся с помощью машинного обучения.

О Яндекс.Недвижимости мы можем разговаривать часами. Но, как говорится, лучше один раз увидеть. Поэтому — добро пожаловать на realty.yandex.ru.

С уважением,
Команда Яндекс.Недвижимости

.

Watir: простой парсинг сложных сайтов

Reading time4 min
Views51K
imageКаждый, кто пишет парсеры, знает, что можно распарсить сто сайтов, а на сто-первом застрять на несколько дней. Структура очередного отмороженного сайта может быть сколь угодно сложной, и, когда дело касается сжатых javascript-ов и ajax-запросов, расшифровать их и извлечь информацию с помощью обычного curl-а и регекспов становится дороже самой информации.

Грубо говоря, проблема в том, что в браузере работает javascript, а на сервере его нет. Нужно либо писать интерпретатор js на одном из серверных языков (jParser и jTokenizer), либо ставить на сервер браузер, посылать в него запросы и вытаскивать итоговое dom-дерево.

В древности в таких случаях мы строили свой велосипед: на отдельной машине запускали браузер, в нем js, который постоянно стучался на сервер и получал от него задания (джобы), сам сайт грузился в iframe, а скрипт извне отправлял dom-дерево ифрейма обратно на сервер.

Сейчас появились более продвинутые средства — xulrunner (crowbar) и watir. Первый — безголовый firefox. У crowbar есть даже ff-плагин для визуального выделения нужных данных, который генерит специальный парсер-js-код, однако там не поддерживаются cookies, а допиливать неохота. Watir позиционируется разработчиками как средство отладки, но мы будем его использовать по прямому назначению и в качестве примера вытащим какие-нибудь данные с сайта travelocity.com.

Читать дальше →

Nano — миниатюрный JavaScript фреймворк

Reading time3 min
Views6.3K
Привет, читатель. Есть много прекрасных и мощных JavaScript-фреймворков. JQuery, MooTools, ExtJS, и множество других. Они кроссбраузерны и громадны. И пользоваться ими — одно удовольствие.

Но иногда, бывает, хочется написать какой-нибудь небольшой скриптик на 5 килобайт и как-то совесть мучает подключать JQuery, который весит в сжатом виде 75 килобайт. И каждый раз начинаешь писать свой мини-фреймворк:
var dom = {
	id  : function (id)  { return document.getElementById(id); },
	tag : function (tag) { return document.getElementsByTagName(tag); },
};


Вроде бы, больше для начала и не надо. А потом вспоминаешь про createElement, легкий способ присвоить CSS, наследование, расширение прототип. И в общем каждый раз пишешь свой велосипед.
В этот раз я решил написать миниатюрный фреймворк, который можно было бы без зазрений совести подключать даже к самым маленьким проектам. В сжатом виде он весит всего 4 килобайта (в 20 раз меньше JQuery).
И в нём есть еще одно преимущество по сравнению со всеми современными фреймворками — полный отказ от устаревших браузеров, за счёт чего в эти 4 килобайта вместилася половина JQuery.

Итак, приветствуйте, JavaScript-фреймворк Nano

Читайте актуальную вторую часть!



Читать дальше →

OpenID, OAuth и другие плюшки

Reading time10 min
Views24K

Зачем нужен OpenID



Вот бывает так, заходишь на сайт любимый, а там ссылка на другой сайт, а там статья ну очень интересная и главное – полезная – и хочется добавить комментарий, типа «Молодцы!» и чтобы добавить комментарий, нужно зарегистрироваться, а чтобы зарегистрироваться нужно ввести «Имя», «Фамилия», «Логин», «Email», «Email еще раз», «Пароль», «Снова Пароль», «Прочитал правила и согласен со всем что тут будет происходить» и «Капчу». И жмакаешь «Зарегистрироваться», а тут бац – «Логин» — занят, и поля «Пароль», «Снова Пароль», «Капча» — стерты. Ну вот так. Вводишь другой свой логин (который второй, и не главный и не любимый) и снова пароль, снова снова пароль (постите) и капчу, и бац – всё ок, только забыл снова поставить галку «Прочитал правила...». Ну ладно, прошел еще раз круги ада, на мыло вышло письмо, активировал аккаунт, так, а где там была статья, да и ну их, не молодцы они, ну т.е. молодцы ну и хрен с этим, знают и так.
Проведите эксперимент, в вашей любимой почте сделайте поиск по слову «activate» — вот примерно столько вы регистрировались на сайтах.
А с другой стороны думаешь, а давайте упростим, и делаешь простое добавление комментария: «Имя», «Email», «Сообщение» — причем «Email» можно не вводить. Через 3 месяца заходишь, а там – СПАМ! Ладно, почистил – и ноль эффекта, спам продолжает, добавил капчу – ну вроде ок, но потом снова как-то они ее обходят. И внимание(!) – вводим регистрацию… Ой!
Но есть (УРА!) – OpenID.
Читать дальше →

Ускоряем раздачу фоток

Reading time8 min
Views14K

С проблемой медленной отдачи статического контента рано или поздно сталкивается каждый сисадмин.

Проявляется это приблизительно так: иногда 3Kb картинка грузится так, как будто бы она весит 3Mb, на ровном месте начинают «залипать» (отдаваться очень медленно) css-ы и JavaScript-ы. Вы нажимаете ctrl + reload — и уже, вроде, проблемы нет, потом спустя всего несколько минут все повторяется опять.

Не всегда истинная причина «тормозов» очевидна и мы косо поглядываем то на nginx, то на хостера, то на «забитый» канал, то на «тормозной» или «глючный» браузер :)

На самом деле проблема в несовершенстве современного винчестера, который до сих пор не расстался с механическими подсистемами вращения шпинделя и позиционирования головок.

В этой статье я предложу Вам свое решение этой проблемы, основанное на практическом опыте использования SSD дисков совместно с web-сервером nginx.
Читать дальше →

Evercookie — самые устойчивые куки

Reading time1 min
Views75K
Samy Mamkar разработал систему, которая позволяет хранить куки в 8 местах, автоматически восстанавливая друг друга, и даже добиться того, чтобы куки, поставленное в одном браузере, действовало и в другом.

Удалить это куки практически невозможно! (Все возможно, конечно, но слишком много мороки)

Куки хранятся в:
  • HTTP Cookies;
  • Local Shared Objects (Flash);
  • Сохранение куки в значениях RGB автосгенерированных и форсированно кэшированных PNG с использованием HTML5 canvas;
  • Сохранение куки в Web History;
  • HTML5 Session Storage;
  • HTML5 Local Storage;
  • HTML5 Global Storage;
  • HTML5 Database Storage через SQLite.

При удалении из одного из этих мест кука автоматически восстанавливается из оставшихся. Работает даже если пользователь сменит браузер (через Local Shared Objects из Flash).

Описание (на английском) и демо: http://samy.pl/evercookie/.
Попробуйте удалить куки, почистить систему и зайти назад.



Как пользоваться?
Читать дальше →

Впечатляющие анимационные эффекты

Reading time2 min
Views115K
С появлением jQuery, у веб-программистов появилась возможность создавать впечатляющие визуальные эффекты, не прибегая к использованию технологии flash. В данной статье представлено несколько ярких примеров того, каких потрясающих результатов можно достичь, используя стандартные средства браузера и свое воображение.
Читать дальше →

Шаблонизация на стороне клиента — уже реальность

Reading time2 min
Views27K

Предыстория


Я занимаюсь разработкой IFrame приложений для социальной сети ВКонтакте. Самый удобный способ навигации по приложению — это динамическая подгрузка данных, без перезагрузки всей страницы. Раньше я генерил html код который нужно отобразить на сервере, пока не встретил EJS — JavaScript Templates…

EJS — Embedded JavaScript


EJS оказался одним из самых удобных и подходящих мне шаблонизаторов. Он работает, как с одиночными переменными, так и с массивами (читай объектами), присутствует логика (if...else...).
Читать дальше →

MapReduce или подсчеты за пределами возможностей памяти и процессора (попробую без зауми)

Reading time8 min
Views92K
Давно хотел рассказать про MapReduce, а то как ни взгляшешь на подобное — такая заумь, что просто ужас берет, а на самом деле очень простой и полезный подход для многих целей. И реализовать самому — не так уж и сложно.

Сразу скажу — топик — для тех, кто не разобрался что такое MapReduce. Для тех, кто разобрался — полезного тут ничего не будет.

Начнем с того как собственно родилась лично у меня идея MapReduce (хотя я и не знал, что он так называется, и, разумеется, пришла она мне куда позже чем Гугловсцам).

Сначала опишу как она рождалась (подход был неправильный), а потом как надо правильно делать.

Как посчитать все слова в Википедии (неправильный подход)


А родилась она, как и, наверное, везде — для подсчета частоты слов, когда обычной памяти не хватает (подсчет частоты всех слов в Википедии). Вместо слова «частота» тут скорее должно быть «количество вхождений», но для простоты оставлю «частота».

В самом простом случае мы можем завести хеш (dict, map, hash, ассоциативный массив, array() в PHP) и считать в нем слова.

$dict['word1'] += 1

Но что делать когда память под хеш кончится, а мы посчитали только одну сотую всех слов?

Читать дальше →

СУБД на PHP — реально! Представляем MooSQL!

Reading time3 min
Views9K
MooSQL Я думаю, многие в своей жизни сталкивались с ситуацией, когда у вас под рукой нет MySQL (по разным причинам, например хостер не позволяет), а все-таки иметь что-то подобное, или даже сам MySQL хочется. Теперь у вас есть надежда :)! Я и nblxa хотим представить проект под названием MooSQL, цель которого — предоставить MySQL-совместимую СУБД на чистом PHP на случай, если в доме закончился обычный MySQL.
Читать дальше →

Information

Rating
Does not participate
Location
Россия
Date of birth
Registered
Activity