Долгое время не решался писать на Хабр. Как минимум, из-за технической неустойчивости проекта. Теперь, когда работа налажена (искренне надеюсь на это), мы получили небольшое признание в виде гранта от Юрия Мильнера и Павла Дурова, я готов отправить проект в хабромясорубку.
Меня зовут Никита Лихачев, я хочу рассказать вам о сайте The Twi Journal. Это газета, которая строится на основе автоматического анализа русскоязычного Твиттера.
Аккуратно: большие картинки | На «Я пиарюсь» кармы не хватило
Идея проекта
Сконструировать робота, способного анализировать эфир русскоязычных сегментов сетей Twitter, Instagram и Foursquare. Затем выводить этот контент в удобном виде на одном сайте и диверсифицировать его размещение — рассылать в другие социальные сети. Кому-то интересно, что происходит в Twitter, но он неохотно покидает Вконтакте или Facebook. А у кого-то просто мало времени за всем следить — он хочет за десять минут оценить повестку дня.
Объективность выборки
Проект ни в коем случае не претендует на абсолютную объективность. Потому что мы взяли на себя смелость исключить из индексируемой базы аккаунты, размещающие шутки-бояны и прочий контент, не несущий в себе никакой полезной информации. Мы также игнорируем масфоловеров (те, кто подписываются на всех подряд) и людей, накручивающих себе рейтинг при помощи ботов. Первую базу собирали руками, занося топовых блогеров в белый список:
Если блогер Навальный занесен в белый список и он соответствует проверке «не масфоловер», то люди, которых он читает, автоматически заносятся в нашу базу.
Сейчас база продолжается пополняться руками и уже автоматически — за счет того, что робот находит новых пользователей в ретвитах по существующей базе. До сих пор нас не упрекали в неполноценности информационной картины, потому что важная тема не может пройти мимо хотя бы одного пользователя из нашей базы.
Процесс обработки данных
Информация
Робот, которого мы называем Адам, собирает все индексируемые твиты и делит их по нескольким типам: обычные твиты; твиты со ссылкой на сторонние ресурсы, СМИ; со ссылкой на известные фотохостинги; со ссылкой на видеохостинги.
Таким образом, на главной странице выводятся популярные твиты и распарсенные ссылки на статьи в СМИ с количеством упоминаний, а в отдельных разделах фотографии и видеоролики:
Постоянно стараемся придумывать алгоритмы, помогающие за короткое время получать максимальное количество свежей информации. На видеоролики, например, поставили ограничение по дате загрузке, чтобы в приоритете выводить самые свежие. Робот также мониторит в Твиттере отзывы по видео и выводит их как комментарии:
Рейтинг пользователей
На основе нашей базы мы стремимся построить хотя бы приблизительно объективный рейтинг русских твиттерян, разделяя их на пользователей, корпоративные аккаунты и СМИ. Рейтинг строится через сведение нескольких показателей в одной формуле: среднее количество упоминаний пользователя, ретвитов его записей, количество его фолловеров в соотнешнии к количеству /lists, в которые его добавили.
Все твиттер-рейтинги можно разделить на две части — те, которые требуют авторизоваться для участия и те, которые не требуют. Первые считаются более объективными, так как в их распоряжении оказывается информация об упоминаниях и ретвитах пользователя. Но есть у них и существенный недостаток: большинство популярных блогеров никогда в них не авторизуются из-за недоверия или ненадобности. Второй тип лишён этого недостатка, зато редко бывает объективным, так как почти всегда строится только на количестве фолловеров, твитов и, может быть, возрасте аккаунта. Мы постарались объединить в себе лучшее из обоих типов рейтинга.
Рейтинг мест Foursquare
Cтроится в режиме реального времени: показываем места, которые популярны в городе именно сейчас. Расчитывается следующим образом: раз в 25 минут запускается робот, который по заранее очерченным границам города (в Москве пока проверяется только центр и пара километров вокруг него) создаёт матрицу точек. По каждой точке в радиусе двух километров проверяется наличие популярных мест с помощью Foursquare API.
Немного о технике
Сейчас располагаемся на одном сервере. Проект целиком (включая демонов) написан на PHP. Мы используем базы данных MySQL и MongoDB (для критичных к скорости записи моментов) — производительности InnoDB на вставке нам хватает с лихвой, а большинство выборок из БД мы кэшируем с помощью memcached. Вообще, memcached для нас — идеальный выбор, так как приходится оперировать большим количеством данных, которые можно кэшировать без потери оперативности. Это позволило сократить время генерации главной страницы до 40мс (боюсь прогнозировать поведение сайта при вероятном хабраэффекте).
С недавнего времени мы стали использовать Gearman для распараллеливания таких задач, как обработка твитов, расчёт рейтинга и для фоновых задач, таких, как сохранение картинок на Amazon S3.
Робот Адам проверяет обновления в ленте каждые 15-180 минут, в зависимости от времени суток. Так как материалы набирают популярность не сразу, а постепенно, нам важно сопровождать их какое-то время после публикации. Именно в этот момент мы разбираем твит на составляющие: текст, ссылки, картинки и видео. Все ссылки раскрываются, если они сокращены, а их контент модифицируется подобно функции Reader в Safari (на манер Readability).
При обработке картинок поддерживаем фотохостинги twitpic, yfrog, pic.twitter.com, flickr, lockerz и instagr.am. Для каждого из них мы написали несложный обработчик API, который находит превью для картинок, автора и пояснительный текст. Для некоторых фотохостингов пришлось использовать недокументированные возможности. К счастью, программисты довольно часто мыслят одинаково, особенно в части наименования методов и параметров к ним.
Планы на развитие
Сейчас ставим различные эксперименты. Например, планируем запустить The Twi Football. В рамках этого проекта хотим попробовать online-трансляции матчей на основе анализа русскоязычного Твиттера. Проект окажется неким плацдармом для тестирования технологий, которые мы будем использовать в основном проекте: мнения болельщиков сервер получает напрямую из твиттера с использованием Streaming API (новые твиты по хэштегам команд у нас будут появляться быстрее, чем на «родной» странице поиска по Твиттеру).
В свободное время балуемся с нашей символикой:
А если серьезно, то хотим попробовать масштабировать проект на другие страны. Начнем, безусловно, с США (прикупили домен twijournal.com). Если пойдет там, то будем заходить и в другие страны. Времени осталось мало, потому что деньги, которые нам дали Дуров и Мильнер, довольно быстро заканчиваются, хотя особо и не шикуем.
В самых смелых снах нам снится, что мы сможем построить аналогичные СМИ на основе других социальных сетей, а затем объединить все в один большой контент-агрегатор. Но пока это просто сны.
P. S. Вдруг желающий работать с нами разработчик или журналист из другой страны читает этот пост? На всякий случай оставлю здесь нашу электронную почту: editors@tjournal.ru
Автор: Niketas