Когда мы пишем про Summly, у наших читателей всегда возникает вопрос — когда же появится аналог, позволяющий подобным образом анализировать русскоязычные тексты? Отвечаем: намётки в этом направлении есть. Вот, например, сервис 2Long2Read помечает самые важные куски текста — либо при помощи веб-формы, либо на любом другом сайте при помощи расширения для браузера Chrome.

Мы задали ребятам пару вопросов, на что получили крайне исчерпывающие ответы.

Есть ли другие русскоязычные аналоги?


Ответ зависит от того, что называть русскоязычным, и что называть аналогом.

Если речь о некотором сервисе, позволяющем автоматически подсвечивать главное прямо на странице, то такого, насколько нам известно, нет. Если просто найти на странице текст и выделить в нём главное, то это позволяет плагин tldr. Он выводит во всплывающем окне сокращённый текст, оставив только наиболее важные предложения. Можно выбрать один из пяти вариантов длины текста. Очень хорошее решение, на наш взгляд, но есть несколько спорных моментов.

[caption id="" align="aligncenter" width="1374"] Работа с веб-формой[/caption]

Во-первых, 2long2read подкрашивает главное прямо в тексте, а tldr оставляет часть предложений. Пользователь лишается возможности обратиться к контексту, если ему это всё же понадобится. Мы пробовали оба варианта отображения результатов и пришли к выводу, что контекст неправильно прятать. Надо давать людям возможность осознанно делать выбор, читать «только желтое» или «желтые островки и вокруг них, когда нужно».

Кроме того, когда мы подсвечиваем главное прямо на странице, мы оставляем структуру страницы. Т.е. в статье на «Хабре» текст статьи останется текстом, а объемный комментарий — комментарием. В плагине tldr оба этих куска контента неразличимы при просмотре результатов.

Во-вторых, 2long2read даёт возможность регулировки количества главного в процентах плавной шкалой, а tldr даёт только пять дискретных уровней. Возможность плавной настройки количества выделяемых предложений и перевыделение их на лету перемещением ползунка позволяет лучше подбирать порог «важного/не важного» для текущего текста и для собственного стиля чтения. Я часто пользуюсь нашим плагином так: сначала выделяю совсем немного — 10-15%, затем, если мне захотелось прочесть больше, поднимаю порог до 30% и перехожу к следующему слою текста.

Команда tldr не из России, и работа с русским языком у них, насколько я понимаю, не тестируется. Просто работает что-то «из коробки» вместе с английским.



tldr — наиболее близкий аналог вообще в мире. Если же смотреть на то, что сделано у нас в стране, то уже давно существует десктопное решение Text Analyst от Megaputer Intelligence (такой швейцарский нож для анализа текстов) и некоторые библиотеки (например, было что-то для аннотирования от компании RCO). Первое — инструмент только для аналитиков (приложение, кстати, легендарное в среде тех, кто работает с текстами), а второе и вовсе смогут использовать только разработчики. И то, и другое не получится использовать бесплатно. Разве что скачать старую версию Text Analyst с сильным ограничением на длину текстов. О существовании простого и удобного «one button solution» (кроме нашего и tldr) нам неизвестно.

Сколько у вас человек в команде, кто они, как давно?


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

Первые наработки делались с конца февраля теперь уже прошлого года — тогда нас было ещё четверо. Где-то в марте был макет того, что хочется получить (еще с «рандомными» алгоритмами), а к лету — прототип вместе с алгоритмом. Но интенсивная разработка того решения, которое есть сейчас, велась в октябре и ноябре. Там  уже была работа сутками напролет, одержимость команды идеей и удачное завершение этого этапа разработки — начало открытого бета-теста. Поэтому, наверное, правильно считать, что проект разработан за эти два месяца, а до этого мы в свое удовольствие игрались с алгоритмами и без каких-то амбициозных планов смотрели, что получается.

[caption id="" align="aligncenter" width="700"] Ох уж этот МФТИ[/caption]

При этом нам почти всем удалось запустить проект, продолжив учиться на Физтехе. Это, конечно, повлияло на то время, которое ребята могли уделить разработке сервиса. В какой-то момент встал вопрос: «А не уйти ли нам всем заниматься проектом»? Меня очень порадовала решимость ребят, и, в принципе, нас остановило только беспокойство близких. Представьте, как реагируют родители на новость, что их чадо бросает учебу ради какой-то невероятной идеи. Но у нас в команде все с четвертого или шестого курса, через полгода одни заканчивают бакалавриат, другие — магистратуру. Все настроены дальше заниматься проектом, поэтому впереди у нас период еще большей концентрации на задаче.

Насколько это сложный алгоритм и во что его можно будет преобразовать (для каких целей использовать)? Может, продать какому-нибудь Evernote, чтобы они его в свой Clearly вставили, или что-то такое.


На основе статей мы реализовали четыре разных алгоритма аннотирования методами машинного обучения. Один из них — supervised алгоритм (требует обучающую выборку, которую мы постепенно будем расширять), все другие — unsupervised (в русской литературе говорят «обучение без учителя»). Причем supervised-решение позволит в будущем сделать персонализацию аннотаций. Т.е. вы размечаете десять текстов и аннотации подстраиваются под вас. Если не устраивает —размечаете больше. Это решит основную проблему сервисов по аннотированию — то, что разные люди считают главным в тексте, совершенно разное.

[caption id="" align="alignnone" width="1287"] Работа с расширением[/caption]

Из этих алгоритмов мы строили смесь — еще более сильный алгоритм. Получилось так, что в смеси преобладают алгоритмы на основе той же идеи, что и в Google Page Rank (алгоритм ранжирования поисковой выдачи), только ранжируем мы предложения по значимости. Здесь возникла интересная проблема: самый качественный алгоритм на текстах средней длины работал очень долго — около секунды. А нам никак не хотелось вызывать скоростью работы раздражение у пользователей. Тут сыграло роль наличие в команде программиста-олимпиадника с богатым опытом в ACM. Классический алгоритм, работающий за квадратичное время, он модифицировал так, что время получилось линейным и все начало «летать».

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

При этом само по себе аннотирование (как ранжирование предложений по значимости) — это только верхушка айсберга. На самом деле, когда вы нажимаете кнопку плагина на страничке, происходит много всего интересного. Сначала достается ее html-код и отправляется к нам на сервер, там запускается алгоритм отделения связного текста страницы от меню и элементов управления. Это тоже делается методами машинного обучения. Когда текст выделен, нужно разбить его на предложения, чтобы понять, что вообще можно выделять.



Здесь снова используется машинное обучение. Изначально мы реализовали решение, описанное Mail.Ru в их корпоративном блоге на Хабре, но потом снова уперлись во время работы и опять-таки пришлось оптимизировать. И уже только после разбиения на предложения начинает работать алгоритм аннотирования, и, наконец, предложения с оценкой их значимости отдаются обратно, а на их основе генерится страничка с подсветкой. Все это создавалось для того, чтобы в итоге пользователю было достаточно нажатия только лишь кнопки плагина.

Для каждого промежуточного этапа существуют сервисы (как минимум, для английского языка) с платным API, т.е. каждый этап обработки вполне мог бы быть самостоятельным коммерциализируемым проектом. Возможно в какой-то момент мы разовьём эту идею и дадим пользоваться всеми этапами обработки текста другим разработчикам, но пока это не основная задача. А основная задача — заниматься технологией, создавать максимально удобные решения на ее основе, и набирать пользователей, т.к. без пользователей не получится персонализации, улучшения качества аннотирования, да и не будет ясно, насколько технология в действительности нужна.

Встроить «обкатанные» алгоритмы в какой-нибудь продукт (тот же Clearly) вполне можно. Сейчас это даже кажется наиболее естественным развитием для проекта. С технологией можно будет поступить как захочется — хоть делать новостной дайджест и другие проекты, как Yahoo на основе Summly. Но мы несколько больше, чем просто технология — мы облекли наши алгоритмы в столь простую в использовании форму, что теперь не нужно быть аналитиком или разработчиком, чтобы оценить потенциал того, что мы делаем. В итоге получился сервис, доступный для всех людей, желающих уже сейчас прикоснуться к будущему. Мы очень дорожим этим, хоть и не забываем про алгоритмы :)

Рассказывал Виктор Кантор.
{ "author_name": "Константин Панфилов", "author_type": "editor", "tags": ["\u0441\u0443\u0440\u043e\u0432\u044b\u0435_\u0440\u0443\u0441\u0441\u043a\u0438\u0435_\u043b\u0438\u043d\u0433\u0432\u0438\u0441\u0442\u044b_\u0442\u0435\u0445\u043d\u0430\u0440\u0438","\u0441\u0442\u0430\u0440\u0442\u0430\u043f\u0447\u0438\u043a","\u0440\u043e\u0441\u0441\u0438\u044f_\u0440\u043e\u0434\u0438\u043d\u0430_\u0433\u0435\u0440\u043e\u0435\u0432","\u0440\u043e\u0441\u0441\u0438\u044e\u0448\u043a\u0430","\u043c\u0444\u0442\u0438","\u0433\u043e\u0440\u0434\u043e\u0441\u0442\u044c_\u0437\u0430_\u0441\u0442\u0440\u0430\u043d\u0443","\u0432_\u0440\u043e\u0441\u0441\u0438\u0438_\u0432\u0441\u0435_\u043f\u043e_\u0441\u0432\u043e\u0435\u043c\u0443","\u0431\u0438\u0437\u043d\u0435\u0441_\u043f\u043e_\u0440\u0443\u0441\u0441\u043a\u0438","\u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","\u0430\u043d\u0430\u043b\u0438\u0437_\u0442\u0435\u043a\u0441\u0442\u0430","tl_dr","summly"], "comments": 0, "likes": 21, "favorites": 0, "is_advertisement": false, "subsite_label": "flood", "id": 2684, "is_wide": true, "is_ugc": false, "date": "Fri, 10 Jan 2014 22:37:00 +0400", "is_special": false }
Объявление на vc.ru
Открытый разговор на разные темы с крупными инвесторами России
12 ноября Москва 20 000 ₽
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovx", "p2": "glug" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Баннер в ленте на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "disable": true, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } }, { "id": 20, "label": "Кнопка в сайдбаре", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cgxmr", "p2": "gnwc" } } } ] { "page_type": "default" }