Quale algoritmo utilizza Readability per estrarre il testo dagli URL?


102

Per un po 'ho cercato di trovare un modo per estrarre in modo intelligente il testo "pertinente" da un URL eliminando il testo relativo agli annunci e tutti gli altri disordine. Dopo diversi mesi di ricerca, ho rinunciato come problema che non può essere determinato con precisione. (Ho provato modi diversi ma nessuno era affidabile)

Una settimana fa, mi sono imbattuto in Readability , un plugin che converte qualsiasi URL in testo leggibile. Mi sembra abbastanza preciso. La mia ipotesi è che in qualche modo abbiano un algoritmo abbastanza intelligente da estrarre il testo pertinente.

Qualcuno sa come lo fanno? O come potrei farlo in modo affidabile?


3
La domanda è: quale algoritmo usa SO che Readability non gestisce le sue pagine? :)
Piotr Dobrogost

Risposte:


170

La leggibilità consiste principalmente in euristiche che "in qualche modo funzionano bene" in molti casi.

Ho scritto alcuni articoli di ricerca su questo argomento e vorrei spiegare il motivo per cui è facile trovare una soluzione che funzioni bene e quando diventa difficile avvicinarsi al 100% di accuratezza.

Sembra esserci una legge linguistica sottostante al linguaggio umano che si manifesta anche (ma non esclusivamente) nel contenuto di una pagina Web, che separa già abbastanza chiaramente due tipi di testo (full-text vs. non-full-text o, approssimativamente, " contenuto principale "vs." boilerplate ").

Per ottenere il contenuto principale dall'HTML, in molti casi è sufficiente mantenere solo gli elementi di testo HTML (cioè blocchi di testo che non vengono interrotti dal markup) che hanno più di 10 parole circa. Sembra che gli esseri umani scelgano tra due tipi di testo ("breve" e "lungo", misurati dal numero di parole che emettono) per due diverse motivazioni di scrittura del testo. Le chiamerei motivazioni "di navigazione" e "informative".

Se un autore vuole che tu riceva velocemente ciò che è scritto, usa un testo "di navigazione", cioè poche parole (come "STOP", "Leggi questo", "Clicca qui"). Questo è il tipo di testo più prominente negli elementi di navigazione (menu ecc.)

Se un autore vuole che tu capisca a fondo cosa intende, usa molte parole. In questo modo, l'ambiguità viene rimossa a costo di un aumento della ridondanza. Il contenuto simile a un articolo di solito rientra in questa classe poiché contiene più di poche parole.

Anche se questa separazione sembra funzionare in una miriade di casi, sta diventando complicata con titoli, frasi brevi, dichiarazioni di non responsabilità, piè di pagina di copyright ecc.

Esistono strategie e funzionalità più sofisticate che aiutano a separare il contenuto principale dal boilerplate. Ad esempio la densità del collegamento (numero di parole in un blocco che sono collegate rispetto al numero totale di parole nel blocco), le caratteristiche dei blocchi precedenti / successivi, la frequenza di un particolare blocco di testo nel Web "intero", Struttura DOM del documento HTML, l'immagine visiva della pagina ecc.

Puoi leggere il mio ultimo articolo " Boilerplate Detection using Shallow Text Features " per avere un'idea da una prospettiva teorica. Puoi anche guardare il video della mia presentazione su VideoLectures.net.

"Leggibilità" utilizza alcune di queste funzionalità. Se osservi attentamente il log delle modifiche SVN, vedrai che il numero di strategie variava nel tempo, così come la qualità dell'estrazione di Readability. Ad esempio, l'introduzione della densità dei collegamenti nel dicembre 2009 ha notevolmente contribuito a migliorare.

A mio parere, quindi, non ha senso dire "La leggibilità fa così", senza menzionare il numero esatto di versione.

Ho pubblicato una libreria di estrazione di contenuti HTML Open Source chiamata boilerpipe , che fornisce diverse strategie di estrazione. A seconda del caso d'uso, l'uno o l'altro estrattore funziona meglio. Puoi provare questi estrattori su pagine di tua scelta utilizzando l'app boilerpipe-web complementare su Google AppEngine.

Per far parlare i numeri, vedere la pagina " Benchmark " sul wiki boilerpipe che confronta alcune strategie di estrazione, tra cui boilerpipe, Readability e Apple Safari.

Dovrei menzionare che questi algoritmi presumono che il contenuto principale sia in realtà il testo completo. Ci sono casi in cui il "contenuto principale" è qualcos'altro, ad esempio un'immagine, una tabella, un video, ecc. Gli algoritmi non funzioneranno bene in questi casi.

Saluti,

cristiano


3
Questo progetto boilerpipe è ancora attivo?
Abby

5
Credo che faresti meglio a mettere il tuo progetto su GitHub in modo che cresca socialmente dagli sviluppatori open source.
Inanc Gumus

1
Un buon esempio della spiegazione del Dr. Kohlschütter è in realtà questa pagina web, in Safari, se hai usato il Reader scoprirai che la sua risposta viene visualizzata come testo principale, grazie alla densità dei link. È testo collegato, quindi riconosciuto come testo principale, rispetto ad altri blocchi.
Abdelrahman Eid

1
"Migrato" una copia nel mio repository github.com/k-bx/boilerpipe nel caso in cui si perda :)
Konstantine Rybnikov

16

la leggibilità è un bookmarklet javascript. ovvero il codice lato client che manipola il DOM. Guarda il javascript e dovresti essere in grado di vedere cosa sta succedendo.

Codice e flusso di lavoro di leggibilità:

/*
     *  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);
})();

E se segui i file JS e CSS inseriti dal codice sopra, otterrai l'intera immagine:

http://lab.arc90.com/experiments/readability/js/readability.js (questo è abbastanza ben commentato, lettura interessante)

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


12

Ovviamente non esiste un modo affidabile al 100% per farlo. Puoi dare un'occhiata al codice sorgente di leggibilità qui

Fondamentalmente, quello che stanno facendo è cercare di identificare blocchi di testo positivi e negativi . Gli identificatori positivi (ovvero gli ID div) sarebbero qualcosa del tipo:

  • articolo
  • corpo
  • soddisfare
  • blog
  • storia

Gli identificatori negativi sarebbero:

  • commento
  • discutere

E poi hanno candidati improbabili e forse . Quello che farebbero è determinare quale è più probabile che sia il contenuto principale del sito, vedere la riga 678nella fonte di leggibilità. Questo viene fatto analizzando principalmente la lunghezza dei paragrafi, i loro identificatori (vedi sopra), l'albero DOM (cioè se il paragrafo è un ultimo nodo figlio), rimuovi tutto ciò che non è necessario, rimuovi la formattazione, ecc.

Il codice ha 1792 righe. Sembra un problema non banale, quindi forse puoi trarre ispirazione da lì.


2
Ti capita di sapere se il loro codice è open source e se può essere utilizzato in prodotti commerciali?
user300981

2
Dice che il codice sorgente è rilasciato sotto la licenza Apache 2.0, il che significa che puoi usarlo, distribuirlo, modificarlo e distribuirne le versioni modificate. Tuttavia non sono molto chiaro sui dettagli.
slhck

2
@bobsmith Apple lo ha utilizzato nell'ultima versione di Safari. Hanno accreditato Arc90 nelle note di rilascio.
sabato

7

Interessante. Ho sviluppato uno script PHP simile. Fondamentalmente esegue la scansione di articoli e allega parti del discorso a tutto il testo (Brill Tagger). Quindi, le frasi grammaticalmente non valide vengono immediatamente eliminate. Quindi, improvvisi cambiamenti nei pronomi o nel passato indicano che l'articolo è finito o non è ancora iniziato. Le frasi ripetute vengono cercate ed eliminate, come "Yahoo news sports finance" appare dieci volte nella pagina. Puoi anche ottenere statistiche sul tono con una pletora di banche di parole relative a varie emozioni. Cambiamenti improvvisi di tono, da attivo / negativo / finanziario, a passivo / positivo / politico indicano un confine. È davvero infinito, tuttavia scavare in profondità.

I problemi principali sono i collegamenti, le anomalie incorporate, gli stili di script e gli aggiornamenti.


3
Sembra davvero un approccio interessante: hai del codice da condividere da questo?
lsh

2
Secondo questo, hai qualche codice di esempio o informazioni che circondano il tuo codice che possiamo guardare?
userabuser
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.