¿Qué algoritmo utiliza Readability para extraer texto de las URL?

102

Durante un tiempo, he intentado encontrar una forma de extraer de forma inteligente el texto "relevante" de una URL eliminando el texto relacionado con los anuncios y todo el resto del desorden. Después de varios meses de investigación, lo dejé como un problema que no se puede determinar con precisión. (Probé de diferentes formas pero ninguna fue confiable)

Hace una semana, me encontré con Readability , un complemento que convierte cualquier URL en texto legible. Me parece bastante acertado. Supongo que de alguna manera tienen un algoritmo que es lo suficientemente inteligente como para extraer el texto relevante.

¿Alguien sabe cómo lo hacen? ¿O cómo podría hacerlo de manera confiable?

usuario300981
fuente
3
La pregunta es ¿qué algoritmo usa SO que Readability no maneja sus páginas? :)
Piotr Dobrogost

Respuestas:

170

La legibilidad consiste principalmente en heurísticas que "de alguna manera funcionan bien" en muchos casos.

He escrito algunos artículos de investigación sobre este tema y me gustaría explicar los antecedentes de por qué es fácil encontrar una solución que funcione bien y cuándo se vuelve difícil acercarse al 100% de precisión.

Parece haber una ley lingüística subyacente en el lenguaje humano que también (pero no exclusivamente) se manifiesta en el contenido de la página web, que ya separa claramente dos tipos de texto (texto completo y no texto completo o, más o menos, " contenido principal "frente a" repetitivo ").

Para obtener el contenido principal de HTML, en muchos casos es suficiente mantener solo los elementos de texto HTML (es decir, bloques de texto que no son interrumpidos por marcas) que tienen más de aproximadamente 10 palabras. Parece que los humanos eligen entre dos tipos de texto ("corto" y "largo", medido por el número de palabras que emiten) por dos motivaciones diferentes para escribir un texto. Yo las llamaría motivaciones "de navegación" e "informativas".

Si un autor quiere que usted obtenga rápidamente lo que está escrito, él / ella usa texto de "navegación", es decir, pocas palabras (como "DETENER", "Leer esto", "Haga clic aquí"). Este es el tipo de texto más destacado en los elementos de navegación (menús, etc.)

Si un autor quiere que comprendas profundamente lo que quiere decir, usa muchas palabras. De esta forma, se elimina la ambigüedad a costa de un aumento de la redundancia. El contenido similar a un artículo generalmente se incluye en esta clase, ya que tiene más de unas pocas palabras.

Si bien esta separación parece funcionar en una gran cantidad de casos, se vuelve complicada con titulares, oraciones cortas, descargos de responsabilidad, pies de página de derechos de autor, etc.

Hay estrategias y funciones más sofisticadas que ayudan a separar el contenido principal del estándar. Por ejemplo, la densidad del enlace (número de palabras en un bloque que están vinculadas versus el número total de palabras en el bloque), las características de los bloques anteriores / siguientes, la frecuencia de un texto de bloque en particular en la Web "completa", la Estructura DOM del documento HTML, la imagen visual de la página, etc.

Puede leer mi último artículo " Detección repetitiva mediante funciones de texto superficial " para obtener información desde una perspectiva teórica. También puede ver el video de mi presentación de trabajo en VideoLectures.net.

"Legibilidad" utiliza algunas de estas características. Si observa atentamente el registro de cambios de SVN, verá que el número de estrategias varió con el tiempo, al igual que la calidad de extracción de Legibilidad. Por ejemplo, la introducción de la densidad de enlaces en diciembre de 2009 ayudó mucho a mejorar.

En mi opinión, por lo tanto, no tiene sentido decir "La legibilidad lo hace así" sin mencionar el número de versión exacto.

He publicado una biblioteca de extracción de contenido HTML de código abierto llamada boilerpipe , que proporciona varias estrategias de extracción diferentes. Dependiendo del caso de uso, uno u otro extractor funciona mejor. Puede probar estos extractores en las páginas de su elección utilizando la aplicación complementaria boilerpipe-web en Google AppEngine.

Para que los números hablen, consulte la página "Puntos de referencia " en la wiki de boilerpipe, que compara algunas estrategias de extracción, incluidas boilerpipe, Readability y Apple Safari.

Debo mencionar que estos algoritmos asumen que el contenido principal es en realidad texto completo. Hay casos en los que el "contenido principal" es otra cosa, por ejemplo, una imagen, una tabla, un video, etc. Los algoritmos no funcionarán bien en tales casos.

Salud,

cristiano

Christian Kohlschütter
fuente
3
¿Sigue activo este proyecto de tubería de caldera?
Abby
5
Creo que es mejor que pongas tu proyecto en GitHub para que crezca socialmente con los desarrolladores de código abierto.
Inanc Gumus
1
Un buen ejemplo de la explicación del Dr. Kohlschütter es en realidad esta página web, en Safari, si usó el Lector, encontrará que su respuesta se muestra como el texto principal, gracias a la densidad de enlaces. Es texto vinculado, por lo que se reconoce como texto principal, en comparación con otros bloques.
Abdelrahman Eid
1
"Migré" una copia a mi repositorio github.com/k-bx/boilerpipe en caso de que se pierda :)
Konstantine Rybnikov
16

la legibilidad es un bookmarklet de JavaScript. es decir, su código del lado del cliente que manipula el DOM. Mire el javascript y debería poder ver qué está pasando.

Flujo de trabajo y código de legibilidad:

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

Y si sigue los archivos JS y CSS que extrae el código anterior, obtendrá la imagen completa:

http://lab.arc90.com/experiments/readability/js/readability.js (esto está bastante bien comentado, lectura interesante)

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

Moin Zaman
fuente
12

Por supuesto, no existe una forma 100% confiable de hacer esto. Puedes echar un vistazo al código fuente de legibilidad aquí.

Básicamente, lo que están haciendo es tratar de identificar bloques de texto positivos y negativos . Los identificadores positivos (es decir, ID de div) serían algo como:

  • artículo
  • cuerpo
  • contenido
  • Blog
  • historia

Los identificadores negativos serían:

  • comentario
  • discutir

Y luego tienen candidatos improbables y tal vez . Lo que harían es determinar cuál es más probable que sea el contenido principal del sitio, vea la línea 678en la fuente de legibilidad. Esto se hace analizando principalmente la longitud de los párrafos, sus identificadores (ver arriba), el árbol DOM (es decir, si el párrafo es un último nodo hijo), eliminar todo lo innecesario, eliminar el formato, etc.

El código tiene 1792 líneas. Parece un problema no trivial, así que tal vez puedas inspirarte desde allí.

slhck
fuente
2
¿Sabe si su código es de código abierto y si puede usarse en productos comerciales?
user300981
2
Dice que el código fuente se publica bajo Apache License 2.0, lo que significa que puede usarlo, distribuirlo, modificar y distribuir versiones modificadas del mismo. Sin embargo, no tengo muy claros los detalles.
slhck
2
@bobsmith Apple lo usó en la última versión de Safari. Acreditaron Arc90 en las notas de la versión.
s4y
7

Interesante. He desarrollado un script PHP similar. Básicamente, escanea artículos y adjunta partes de la oración a todo el texto (Brill Tagger). Entonces, las oraciones gramaticalmente inválidas se eliminan instantáneamente. Luego, los cambios repentinos en los pronombres o el tiempo pasado indican que el artículo ha terminado o que aún no ha comenzado. Las frases repetidas se buscan y eliminan, como "Yahoo News Sports Finance" aparece diez veces en la página. También puede obtener estadísticas sobre el tono con una gran cantidad de bancos de palabras relacionados con diversas emociones. Los cambios repentinos de tono, de activo / negativo / financiero a pasivo / positivo / político indican un límite. Realmente es interminable, sin importar lo que quieras profundizar.

Los principales problemas son los enlaces, las anomalías incrustadas, los estilos de secuencias de comandos y las actualizaciones.

usuario734063
fuente
3
En realidad, esto suena como un enfoque realmente interesante: ¿tiene algún código para compartir a partir de esto?
lsh
2
En segundo lugar, ¿tiene algún código de ejemplo o información que rodee su código que podamos ver?
userabuser