воскресенье, 14 июля 2013 г.

Битва "Слова vs Контент" или BigData и инопланетяне

Постановка задачи

Предположим Вас похитили инопланетяне. Вам удалось бежать, у Вас есть неопровержимые доказательства - как поведать миру о случившемся. Есть Вы добрались до ФБР Вам безусловно поверят.
Предположим у Вас есть Интернет, чертежи летающей тарелки и инопланетянский учебник по физике где написано как сделать антигравитационный двигатель. Надо рассказать миру правду и подготовить нас к готовящемуся вторжению.
Возможности добежать до ФБР у Вас нет, но есть Интернет. Вы выкладываете это скажем в блог. Вопрос: как Вы думаете - много народу прочитает? Наверное не очень.

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

Слова и Контент

Сейчас Интернет во многом заполнен словами и в нем есть явный недостаток контента. Вот например https://www.free-lance.ru/freelancers/copywriter-teksty/ список людей занимающихся профессиональным написанием слов. Есть новый продукт надо написать текст про него. Есть блог компании - надо раз в 3 дня писать в него сообщения и так далее и тому подобное. Вплоть до написания текстов которые прямо предназначены для чтения поисковыми роботами.  200 слов на заданную тему с ссылками внутри ведущими на нужную страницу. Т.е. это люди профессионально производящие информационный треш который читать не надо никогда или почти никогда. И их много, посмотрите на цены и прикиньте сколько текста им надо записать чтобы заплатить за квартиру.

Конечно тут я немного сгущаю краски, жесткой границы между словами и контентом нет и деление это достаточно субъективно. Понятно, что скорее всего вот тут https://www.free-lance.ru/users/Mark_Weber/viewproj.php?prjid=3012434&f=2 слова, а вот тут http://slon.ru/world/v_chem_rossiya_i_ekvador_svobodnee_ameriki-958231.xhtml контент. Но явно есть сложные случаи когда не понятно и мнения разделяются. Вот например http://www.itar-tass.com/c188/801813.html - товарищ пишет про войну в Сирии. Вроде бы статья но если выжать воду то "Американские Ястребы разжигают пожар войны, но мы прогрессивные силы человечества (далее список прогрессивных стран) этого не допустим". Я такую лабуду еще в середине 80-х в Советских газетах читал. При этом на западе в общем ситуация не лучше - лучшие умы демократическое прессы никак не решат чем отличаются повстанцы от терорристов Аль-Каиды. Т.е. чем отличаются давно известно, одни хорошие, а другие плохие, но картину портит факт, что это часто одни и те же люди. Иногда это вызывает вот такие вот курьезы http://www.israel7.ru/News/News.aspx/158732#.Ud1g3_k9Png

В целом с точки зрения бизнеса это понятно. Надо поставлять читателю информацию быстро регулярно и надо писать что-то не буде вызывать отторжения. Есть достаточно широкие группы людей придерживающихся определенных взглядов. Достаточно регулярно публиковать статьи которые им нравятся и аудитория у меня в кармане. Ну понятно что я сильно упрощаю, издательские бизнес не простой, все сильно зависит от специфики. Скажем в политической жизни России сейчас вообще два тренда "Власть Ура!" и "Власть Отстой!". А во внутри политической жизни США все много сложнее, много взглядов и вообще журналистам в массе за слова приходится отвечать. Но судя по тому, что видно отсюда и по отзывам  знакомых американцев поляризация взглядов тоже присутствует.

Но несмотря на это, бывают порой прямо таки детективные истории. Например в далекие времена последней войны в Ираке на сайте http://iraq-war.ru/ некто с псевдонимом Зорге постил прямо таки анлитически сводки Генштаба. Причем если в понедельник Зорге писал о каком-то событии то по телевизору в горячих новостях с места события об этом рассказывали только в среду. Откуда брались такие новости. Лично я узнал о таком интересном источнике информации только через дне недели после его выхода в эфир из какого-то блога.

Задача

Постановка задачи примерно следующая - уметь находить в информационном поле интересные сообщения содержащие не тривиальный контент. Например: упал астероид. Все публикации на эту тему через какое-то время четко делятся на несколько трендов
  • Угроза цивилизации, метеоритная опасность, конец света
  • Опровержения ученых - не бойтесь все хорошо
  • Обсуждение мелких подробностей, свидетельства еще одного очевидца.
Предположим кто-то хорошо знакомый с темой пишет в блоге статью где простым языком описывает какие типы астероидов бывают, рассказывает про облако Оорта, пояс Койпера. В общем дает общую картину происходящего не акцентируясь  на собственно падении астероидов на одну из планет системы.

Скорее всего если у автора статьи нет 1000 фоловеров пост пусть и интересный останется непрочитанным людьми которым он был бы интересен. Давайте попытаемся это пост найти.

Как будем искать?

Первое что приходит в голову это персональная газета - Flipboard или что-то аналогичное. Как работает персональная газета - она спрашивает у Вас какие статьи вам нравятся и потом подбирает вам из доступных новостных источников статьи которые обычно интересны людям у которых вкусы схожи с Вашими.

К сожалению это не решит проблемы поиска уникальных интересных постов, а только спрячет от Вас тренды которые вам не интересны. Упрощенно говоря, если при падении метеорита вам интересны статьи про конец цивилизации то только их Вы и будете видеть. Т.е. персональная газета позволяет Вас сузить медийное поле до подмножетсва которое отвечает Вашим вкусам и убеждениями. В каком-то смысле это даже плохо т.к. при таком подходе Вы имеете даже худший обзор на происходящее вокруг. Но Вы по прежнему видите только уже раскрученные кем-то сюжеты.

Проблема имеет социальное решение - есть много отдельных людей и групп по интересам которые раскапывают и продвигают интересную информацию. Есть так сказать профессиональные раскапыватели сюжетов. Проблема тут ровно одна, шанс что нужный вам пост раскопают и продвинут вверх настолько что Вы его увидите не так уж и велик.

Хочется иметь какое-то автоматизированное решение позволяющее искать (раскапывать) интересные статьи. Давайте рассмотрим как оно может выглядеть. Сразу скажу готового решения у меня нет, есть идеи и небольшой релевантный опыт proof of concept проектов внутри компании.

Первое что надо сделать - надо иметь собственно сообщения, загруженные в базу данных в очищенном виде. Только текст. Для этого надо ежедневно кравлером выцеживать 100000 сообщений, как минимум из блогов (тут бы еще хорошо добавить и из соц сетей, но блогов для начала достаточно). В общем понятно - чтобы что-то проанализировать надо чтобы это что-то у тебя было. Есть конечно вариант с поиском статей через Гугл, но тут есть два момента

  • Гугл хорошо ищет то на что есть много ссылок и задвигает остальное в самый конец поисковой выдачи
  • Честно говоря я не знаю искать "то, не знаю что" при помощи посиковика. Есть идеи - пишите.
В принципе кравлить блоги достаточно простая задача и она имеет достаточно дешевое решение. Давайте считать что статьи у нас есть.

ОК, у нас есть 100000 статей из блогов, что делаем. Сначала идентифицирем сюжеты. Например "Кризис на Кипре". Все статьи на эту тему имеют сильно пересекающееся множество ключевых слов. Для простоты считаем что 100 статей в которых пишут о чем-то примерно одними и теми же словами, а часто даже повторяющимися предложениями не имеют ценности. Их можно упаковать в одну сущность и показать пользователю - если он пометит их как "не интересно", дальше похожие статьи ему не показываем. Тут есть некая опасность отбросить например сразу все финансовые отчеты т.к. это очень формальный жанр и словарный запас там весьма стабилен, т.е. условного говоря финансовые отчеты это ровно один сюжет, но считаем, что так и надо. Если Вам надо раскапывать финансовые отчеты, то для этого нужны другие инструменты и они уже созданы, хотя и стоят много денег. К слову говоря финансовые отчеты не публикуют в блогах :-)

Таким образом мы можем вычесть из новостной сферы большое количество статей в которых пишут об одном и том же, похожим образом. Что тут еще можно добавить

  • Как показывает опыт реального POC - новостных сюжетов за неделю в мире не так уж и много. Может быть что-то в р-не 100. Ну точно не 1000. 
  • В принципе определять соответствие статьи сюжету можно и более продвинутыми способами, но я подозреваю, что простого матчинга на основе множества слов для начала может быть вполне достаточно.

Что дальше? Дальше сухой остаток мы ранжируем на базе правил определяющих интересность статьи и показываем пользователю. Какие признаки могут сказать нам что статья интересна (в данном случае интересна == не является словами)
  • Текст достаточно длинный. В общем очевидно, что как правило ценность текста пропорциональна его длине. Разумеется есть исключения, но в общем положительная корреляция кажется что есть. Вообще говоря я бы сразу отбрасывал тексты короче 200 символов скажем. Таким образом мы конечно потеряем скажем посты вида "Все идут на площадь Тахир". Но в принципе и ладно, мы в этот раз охотимся не на них. 
  • Количество лайков, комментариев и т.п. Тоже в общем-то банальное соображение - если к посту написано 1000 комментариев то возможно в нем что-то есть. 
  • Анализ при помощи reference data. Если нас интересуют не просто статьи а например статьи относящиеся к определенной индустрии, то скоринг на основе reference data позволит "поднять вверх" тематические статьи. В идеале хорошо иметь reference data для нескольких индустрий, сегментировать статьи и те из них которые хорошо матчатся на reference data поднимать вверх. 
  • Количество ссылок с поисковика. Ну тут простой принцип используемый в научной среде - если статью цитируют то она скорее хорошая чем плохая. (тут по идее для борьбы с черным SEO надо понимать откуда цитируют и статьям с черными ссылками ставить негативный рейтинг).
  • Лексический анализ словарного запаса. Словарный запас с помощью которого обычно пишутся статьи достаточно не велик и достаточно стандартен. Если для конкретной статьи используемое множество слов значительно шире чем обычно или использовано множество слов существенно отличающееся от средне статистического то статья может быть интересной. 
  • Еще достаточно продвинутый способ - можно с помощью лексического анализа выделать именованные сущность такие как "Пояс Койпера" или "Опиумная война" и искать их упоминания в wikipedia. Статья в которой таких упоминаний больше среднего, скорее всего выдает автора грамотно оперирующего фактами и пишущего что-то содержательное. 
Далее следует обучение. Каждому из правил присваиваем какой-то вес, ранжируем в соответствии с весом оставшиеся после очистки статьи и показываем их группе "учителей". Они расставляют дополнительные веса - "автор пишет интересно", "автор шарит интересные посты".

Возвращаясь к сюжетам - если пост попадает в множество "сюжетных постов", но появился заметно раньше всех других постов, наверное автор представляет интерес.

В результате мы получаем какое-то множество постов и проводим на них Bullshit learning - уточняем коэффициенты и присваиваем высокие веса авторам пишущим содержательные статьи. Все это после обработки хорошо векторизуется, можно прикрутить нейронную сеть и по обучать ее.

Послесловие 

Интересно было бы с такой системой поработать? Интересно есть такая штука у АНБ? Есть идеи кто такое может заказать или захотеть написать open source?