Який алгоритм читабельності використовує для вилучення тексту з URL-адрес?


102

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

Тиждень тому, я натрапив на читаність - плагін , який перетворює будь-який URL в читається текст. Мені це виглядає досить точно. Я здогадуюсь, що вони якось мають алгоритм, який досить розумний, щоб витягти відповідний текст.

Хтось знає, як вони це роблять? Або як я міг це зробити надійно?


3
Питання в тому, який алгоритм SO використовує, щоб читабельність не обробляла його сторінки? :)
Пьотр Доброгост

Відповіді:


170

Читання в основному складається з евристики, яка "просто якось добре працює" у багатьох випадках.

Я написав кілька науково-дослідних робіт на цю тему, і я хотів би пояснити, чому легко знайти рішення, яке добре працює і коли важко наблизитися до 100% точності.

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

Для отримання основного вмісту з HTML, у багатьох випадках достатньо зберегти лише текстові елементи HTML (тобто блоки тексту, які не перериваються розміткою), які містять більше ніж 10 слів. Схоже, люди обирають два типи тексту ("короткий" і "довгий", вимірюється кількістю слів, які вони випускають) для двох різних мотивацій написання тексту. Я б назвав їх "навігаційними" та "інформаційними" мотиваціями.

Якщо автор хоче, щоб ви швидко отримали те, що написано, він / вона використовує "навігаційний" текст, тобто кілька слів (наприклад, "СТОП", "Прочитайте це", "Клацніть тут"). Це найвизначніший тип тексту в навігаційних елементах (меню тощо)

Якщо автор хоче, щоб ви глибоко зрозуміли, що він / вона означає, він / вона використовує багато слів. Таким чином, неоднозначність знімається ціною збільшення надмірності. Статті, подібні до вмісту, зазвичай належать до цього класу, оскільки він містить більше ніж кілька слів.

Хоча цей поділ, здається, працює у безлічі випадків, він стає непростим із заголовками, короткими реченнями, відмовами від права, авторськими колонтитулами тощо.

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

Ви можете прочитати мою останню статтю " Виявлення котлових плит за допомогою функцій дрібного тексту ", щоб отримати деяке розуміння з теоретичної точки зору. Ви також можете подивитися відео з моєї презентації на VideoLectures.net.

"Читання" використовує деякі з цих функцій. Якщо ви уважно перегляньте журнал змін SVN, то побачите, що кількість стратегій змінювалася з часом, а також якість видобутку читабельності. Наприклад, впровадження щільності зв’язків у грудні 2009 р. Дуже сприяло покращенню.

На мій погляд, тому не має сенсу говорити "Читання робить це так", не зазначаючи точний номер версії.

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

Щоб дозволити цифрам говорити, перегляньте сторінку «Орієнтовні показники » на вікі-трубопроводі бойлера, де порівнюються деякі стратегії видобутку, зокрема котловарка, читабельність та Apple Safari.

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

Ура,

Християнин


3
Цей проект котлоагрегату все ще активний?
Еббі

5
Я вважаю, що вам краще поставити свій проект на GitHub, щоб він розвивався в соціальному масштабі розробниками з відкритим кодом.
Інанк Гамус

1
Хорошим прикладом пояснення доктора Кольшюттера є насправді ця веб-сторінка, в Сафарі, якщо ви скористалися 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/experiment/readability/js/readability.js (це досить добре коментується, цікаве читання)

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


12

Звичайно, немає 100% надійного способу зробити це. Ви можете ознайомитися з вихідним кодом читабельності тут

По суті, те, що вони роблять, - це намагання визначити позитивні та негативні текстові блоки. Позитивні ідентифікатори (тобто ідентифікатори div) будуть приблизно такими:

  • стаття
  • тіло
  • зміст
  • блог
  • історія

Негативними ідентифікаторами будуть:

  • коментар
  • обговорити

І тоді у них є малоймовірні та, можливо, кандидати. Що вони б робили - це визначити, який, швидше за все, є основним вмістом сайту, див. Рядок 678у джерелі читабельності. Це робиться шляхом аналізу в основному довжини абзаців, їх ідентифікаторів (див. Вище), дерева DOM (тобто, якщо абзац є останнім дочірнім вузлом), викреслити все непотрібне, видалити форматування тощо.

Код налічує 1792 рядки. Це здається нетривіальною проблемою, тому, можливо, ви зможете отримати свої натхнення звідти.


2
Чи знаєте ви, чи є їх код з відкритим кодом і чи його можна використовувати в комерційних продуктах?
user300981

2
У ньому йдеться про те, що вихідний код випускається під ліцензією Apache License 2.0, це означає, що ви можете використовувати його, поширювати його, змінювати та поширювати модифіковані його версії. Я не надто чіткий у деталях.
slhck

2
@bobsmith Apple використовувала його в останній версії Safari. Вони приписують Arc90 в нотах про випуск.
s4y

7

Цікаво. Я розробив подібний сценарій PHP. В основному він сканує статті та додає частини мови до всього тексту (Brill Tagger). Потім граматично недійсні речення миттєво усуваються. Потім раптові зміни в займенниках або минулому часі свідчать про те, що стаття закінчена або ще не почалася. Неодноразові фрази шукаються та усуваються, як-от "десять разів на сторінці з'являється Yahoo News Finance Finance". Ви також можете отримати статистику щодо тону з великою кількістю слів, що стосуються різних емоцій. Раптова зміна тонусу: від активного / негативного / фінансового, до пасивного / позитивного / політичного вказує на межу. Насправді це нескінченно, як би копати хочете глибоко.

Основні проблеми - це посилання, вбудовані аномалії, сценарії стилів та оновлення.


3
Насправді це звучить як дійсно цікавий підхід - чи є у вас якийсь код, з якого ви можете поділитися цим?
lsh

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