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


102

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

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

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


3
Вопрос в том, какой алгоритм использует SO, чтобы Readability не обрабатывала его страницы? :)
Петр Доброгост

Ответы:


170

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Привет,

Христианин


3
Этот проект котельной все еще активен?
Эбби

5
Я считаю, что вам лучше разместить свой проект на GitHub, чтобы разработчики с открытым исходным кодом развили его в обществе.
Inanc Gumus,

1
Хорошим примером объяснения доктора Кольшюттера на самом деле является эта веб-страница в Safari, если вы использовали Reader, вы обнаружите, что его ответ отображается как основной текст благодаря плотности ссылок. Это связанный текст, поэтому он распознается как основной текст по сравнению с другими блоками.
Абдельрахман Ид

1
«Перенес» копию в свое репо github.com/k-bx/boilerpipe на всякий случай, если она потеряется :)
Константин Рыбников

16

читаемость - это букмарклет 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

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

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

  • статья
  • тело
  • содержание
  • блог
  • история

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

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

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

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


2
Вы случайно не знаете, является ли их код открытым и можно ли его использовать в коммерческих продуктах?
user300981 06

2
В нем говорится, что исходный код выпущен под лицензией Apache License 2.0, что означает, что вы можете использовать его, распространять, изменять и распространять модифицированные версии. Хотя я не очень разбираюсь в деталях.
slhck 06

2
@bobsmith Apple использовала его в последней версии Safari. Они указали Arc90 в примечаниях к выпуску.
s4y

7

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

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


3
На самом деле это звучит как действительно интересный подход - есть ли у вас какой-нибудь код, которым можно поделиться?
lsh 09

2
Во-вторых, есть ли у вас какой-нибудь пример кода или информация, связанная с вашим кодом, которую мы можем изучить?
userabuser
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.