Какой алгоритм использует Readability для извлечения текста из URL?

Некоторое время я пытался найти способ разумного извлечения "релевантного" текста из URL-адреса, исключив текст, связанный с рекламой и всем другим беспорядком. После нескольких месяцев исследований я отказался от этого как проблему, которая не может быть точно определена. (Я пробовал разные способы, но никто не был надежно)

Неделю назад я наткнулся на Readability - плагин, который преобразует любой URL в удобочитаемый текст. Это выглядит довольно точно для меня. Я предполагаю, что у них как-то есть алгоритм, достаточно умный, чтобы извлечь соответствующий текст.

Кто-нибудь знает, как они это делают? Или как я могу сделать это надежно?

Ответ 1

Чтение в основном состоит из эвристик, которые "как-то хорошо работают" во многих случаях.

Я написал несколько научных статей по этой теме, и я хотел бы объяснить, почему легко найти решение, которое хорошо работает, и когда ему становится трудно приблизиться к 100% -ной точности.

По-видимому, существует языковой закон, лежащий в основе человеческого языка, который также (но не исключительно) проявляется в содержимом веб-страницы, который уже довольно четко разделяет два типа текста (полнотекстовый или не полный текст или, грубо говоря, "основное содержание" против "шаблона" ).

Чтобы получить основной контент из HTML, во многих случаях достаточно хранить только текстовые элементы HTML (т.е. блоки текста, которые не прерываются разметкой), которые содержат более 10 слов. Похоже, что люди выбирают из двух типов текста ( "короткий" и "длинный", измеряемый количеством слов, которые они испускают) для двух разных мотивов написания текста. Я бы назвал их "навигационными" и "информационными" мотивами.

Если автор хочет, чтобы вы быстро получили написанное, он использует "навигационный" текст, т.е. несколько слов (например, "STOP", "Read this", "Click here" ). Это основной вид текста в навигационных элементах (меню и т.д.).

Если автор хочет, чтобы вы глубоко понимали, что он/она имеет в виду, он использует много слов. Таким образом, двусмысленность устраняется за счет увеличения избыточности. Обычно в этот класс входит контент, подобный статье, поскольку он содержит не более нескольких слов.

Хотя это разделение, по-видимому, работает во множестве случаев, оно становится сложным с заголовками, короткими предложениями, отказами от ответственности, нижними колонтитулами и т.д.

Существуют более сложные стратегии и функции, которые помогают отделить основное содержимое от шаблона. Например, плотность связи (количество слов в блоке, которые связаны в сравнении с общим количеством слов в блоке), особенности предыдущего/следующих блоков, частота конкретного текстового блока в "цельной" сети, DOM-структура документа HTML, визуальный образ страницы и т.д.

Вы можете прочитать мою последнюю статью " Обнаружение котельной плитки с использованием неглубоких текстовых функций", чтобы получить некоторое представление о теоретической перспективе. Вы также можете посмотреть видео моей презентации на VideoLectures.net.

"Чтение" использует некоторые из этих функций. Если вы внимательно наблюдаете за списком изменений SVN, вы увидите, что с течением времени количество стратегий изменилось, а также качество извлечения. Например, введение плотности связи в декабре 2009 года очень помогло улучшить.

По-моему, поэтому нет смысла говорить, что "читаемость делает это так", без упоминания точного номера версии.

Я опубликовал библиотеку извлечения содержимого HTML с открытым исходным кодом под названием boilerpipe, которая предоставляет несколько различных стратегий извлечения. В зависимости от варианта использования один или другой экстрактор работает лучше. Вы можете попробовать эти экстракторы на страницах по вашему выбору, используя приложение compion compion для веб-приложений Google AppEngine.

Чтобы номера говорили, см. страницу Benchmarks" на вики-странице котла, в которой сравниваются некоторые стратегии извлечения, в том числе котельная, читаемость и Apple Safari.

Я должен упомянуть, что эти алгоритмы предполагают, что основной контент на самом деле является полным текстом. Бывают случаи, когда "основное содержание" - это что-то другое, например. изображение, таблицу, видео и т.д. Алгоритмы не будут работать хорошо для таких случаев.

Приветствия,

Christian

Ответ 2

читабельность - это букмарклет javascript. что означает его код на стороне клиента, который управляет DOM. Посмотрите на javascript, и вы сможете увидеть, что происходит.

Рабочий процесс и код читаемости:

/*
     *  1. Prep the document by removing script tags, css, etc.
     *  2. Build readability DOM tree.
     *  3. Grab the article content from the current dom tree.
     *  4. Replace the current DOM tree with the new one.
     *  5. Read peacefully.
*/

javascript: (function () {
    readConvertLinksToFootnotes = false;
    readStyle = 'style-newspaper';
    readSize = 'size-medium';
    readMargin = 'margin-wide';
    _readability_script = document.createElement('script');
    _readability_script.type = 'text/javascript';
    _readability_script.src = 'http://lab.arc90.com/experiments/readability/js/readability.js?x=' + (Math.random());
    document.documentElement.appendChild(_readability_script);
    _readability_css = document.createElement('link');
    _readability_css.rel = 'stylesheet';
    _readability_css.href = 'http://lab.arc90.com/experiments/readability/css/readability.css';
    _readability_css.type = 'text/css';
    _readability_css.media = 'all';
    document.documentElement.appendChild(_readability_css);
    _readability_print_css = document.createElement('link');
    _readability_print_css.rel = 'stylesheet';
    _readability_print_css.href = 'http://lab.arc90.com/experiments/readability/css/readability-print.css';
    _readability_print_css.media = 'print';
    _readability_print_css.type = 'text/css';
    document.getElementsByTagName('head')[0].appendChild(_readability_print_css);
})();

И если вы будете следовать файлам JS и CSS, которые вытащил вышеприведенный код, вы получите полную картину:

http://lab.arc90.com/experiments/readability/js/readability.js (это довольно хорошо прокомментированное, интересное чтение)

http://lab.arc90.com/experiments/readability/css/readability.css

Ответ 3

Нет надежного способа сделать это на 100%, конечно. Вы можете посмотреть исходный код Readability здесь

В основном, то, что они делают, пытается идентифицировать положительные и отрицательные блоки текста. Положительные идентификаторы (т.е. Идентификаторы div) будут выглядеть примерно так:

  • статьи
  • Тело
  • Содержание
  • Блог
  • История

Отрицательные идентификаторы:

  • Комментарий
  • обсудить

И тогда у них маловероятные и, возможно, кандидаты. То, что они сделают, это определить, что наиболее вероятно будет основным содержанием сайта, см. Строку 678 в источнике читаемости. Это делается путем анализа в основном длины абзацев, их идентификаторов (см. Выше), дерева DOM (т.е. Если абзац является последним потомком node), вычеркивать все ненужное, удалять форматирование и т.д.

Код имеет 1792 строки. Это похоже на нетривиальную проблему, поэтому, возможно, вы сможете получить оттуда свои вдохновения.

Ответ 4

Интересно. Я разработал аналогичный PHP script. Он в основном сканирует статьи и прикрепляет части речи ко всему тексту (Brill Tagger). Затем грамматически недействительные предложения немедленно устраняются. Затем внезапные сдвиги в местоимениях или прошедшем времени указывают на то, что статья закончилась или еще не началась. Повторяющиеся фразы ищут и устраняют, например, "Yahoo news sports finance" появляется десять раз на странице. Вы также можете получить статистику по тону с множеством банков слов, относящихся к различным эмоциям. Внезапные изменения тона, от активных/отрицательных/финансовых, до пассивных/позитивных/политических, указывают на границу. Это бесконечно на самом деле, как бы вы ни захотели глубоко.

Основными проблемами являются ссылки, встроенные аномалии, стили сценариев и обновления.