2010-09-06 22 views
93

Por un tiempo, he estado tratando de encontrar una forma de extraer de forma inteligente el texto "relevante" de una URL eliminando el texto relacionado con anuncios y todo el desorden. Después de varios meses de investigación, lo abandoné como un problema que no se puede determinar con precisión. (He intentado de diferentes maneras, pero ninguno era confiable)¿Qué algoritmo usa la legibilidad para extraer texto de las URL?

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

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

+3

La pregunta es ¿qué algoritmo usa SO que la legibilidad no maneje sus páginas? :) –

+1

Relacionado: [¿Cómo funciona Safari's Reader y cuándo aparece?] (Http://superuser.com/q/387572/664) –

Respuesta

16

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

de flujo de trabajo y la legibilidad del código:

/* 
    * 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 el código anterior tira en que obtendrá el cuadro completo:

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

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

11

no hay manera fiable al 100% para hacer esto, por supuesto. Puede echar un vistazo a la legibilidad del código fuente here

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

  • artículo
  • cuerpo
  • contenido
  • el blog
  • historia

identificadores negativo sería:

  • comentario
  • discutir

Y luego tienen poco probable y tal vez candidatos. Lo que harían es determinar cuál es más probable que sea el contenido principal del sitio; consulte la línea 678 en 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 obtener tus inspiraciones de allí.

+1

¿Sabe por casualidad si su código es de código abierto y si puede? ser utilizado en productos comerciales? – user300981

+1

Dice que el código fuente está publicado bajo Apache License 2.0, eso significa que puede usarlo, distribuirlo, modificar y distribuir versiones modificadas de él. Aunque no tengo muy claro los detalles. – slhck

+2

@bobsmith Apple lo usó en la última versión de Safari. Le dieron crédito a Arc90 en las notas de la versión. – s4y

157

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

He escrito algunos trabajos 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 cuando sea 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 bastante claramente dos tipos de texto (texto completo versus texto no completo o , aproximadamente, "contenido principal" vs. "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 están interrumpidos por el marcado) que tienen más de 10 palabras. Parece que los humanos eligen entre dos tipos de texto ("corto" y "largo", medido por el número de palabras que emiten) dos motivaciones diferentes para escribir un texto. Los llamaría motivaciones de "navegación" e "información".

Si un autor quiere que rápidamente obtiene lo que está escrito, él/ella utiliza el texto "navegación", es decir unas palabras (como "STOP", "Lee esto", "Haga clic aquí"). Este es el tipo de texto predominante en los elementos de navegación (menús, etc.)

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

Si bien esta separación parece funcionar en una gran cantidad de casos, cada vez es más difícil con los titulares, frases cortas, renuncias de derechos de autor, pies de página, etc.

Hay estrategias más sofisticadas, y características, que ayuda separar el contenido principal de repetición. 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 previos/siguientes, la frecuencia de un texto de bloque en particular en la Web "completa", el DOM estructura del documento HTML, la imagen visual de la página, etc.

Puede leer mi último artículo "Boilerplate Detection using Shallow Text Features" para obtener una visión desde una perspectiva teórica. También puede ver el video de mi presentación en papel en VideoLectures.net.

"Legibilidad" utiliza algunas de estas características. Si observa cuidadosamente 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 la legibilidad. Por ejemplo, la introducción de la densidad de enlaces en diciembre de 2009 ayudó mucho a mejorar.

En mi opinión, 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 que elija con la aplicación complementaria boilerpipe-web en Google App Engine.

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

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

Saludos,

cristianos

+3

¿Este proyecto boilerpipe aún está activo? – Abby

+4

Creo que es mejor que pongas tu proyecto en GitHub para que crezca socialmente gracias a los desarrolladores de código abierto. –

+1

Un buen ejemplo de la explicación del Dr. Kohlschütter es en realidad esta página web, en Safari, si utilizó el lector, encontrará que su respuesta se muestra como el texto principal, gracias a la densidad del enlace. Es texto vinculado, por lo tanto, reconocido como texto principal, en comparación con otros bloques. –

5

interesante. Desarrollé un script PHP similar. Básicamente escanea artículos y adjunta partes del discurso a todo el texto (Brill Tagger). Entonces, las oraciones gramaticalmente inválidas se eliminan instantáneamente. Entonces, los cambios repentinos en los pronombres o el tiempo pasado indican que el artículo ha terminado o aún no ha comenzado. Las frases repetidas se buscan y se 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 relacionadas con diversas emociones. Los cambios repentinos en el tono, desde activo/negativo/financiero, a pasivo/positivo/político indican un límite. En realidad es interminable, sin embargo, desea profundizar.

Los principales problemas son enlaces, anomalías integradas, estilos de scripting y actualizaciones.

+2

Esto suena como un enfoque realmente interesante, ¿tienes 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

Cuestiones relacionadas