Какой алгоритм использует Readability для извлечения текста из URL? - PullRequest
102 голосов
/ 06 сентября 2010

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

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

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

Ответы [ 4 ]

166 голосов
/ 21 ноября 2010

Удобочитаемость в основном состоит из эвристик, которые во многих случаях «просто так или иначе работают».

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

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

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

Если автор хочет, чтобы вы быстро получили то, что написано, он / она использует "навигационный" текст, т.е. несколько слов (как «СТОП», «Читать это», «Нажмите здесь»).Это наиболее заметный тип текста в элементах навигации (меню и т. Д.)

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

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

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

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

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

Поэтому, на мой взгляд, не имеет смысла говорить «Читаемость делает это так», не упоминая точный номер версии.

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

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

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

Cheers,

Christian

17 голосов
/ 06 сентября 2010

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

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

/*
     *  1. Prep the document by removing script tags, css, etc.
     *  2. Build readability's 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

12 голосов
/ 06 сентября 2010

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

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

  • article
  • body
  • content
  • blog
  • story

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

  • комментарий
  • обсуждение

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

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

7 голосов
/ 03 мая 2011

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

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

...