Welchen Algorithmus verwendet Readability zum Extrahieren von Text aus URLs?


102

Seit einiger Zeit habe ich versucht, den "relevanten" Text auf intelligente Weise aus einer URL zu extrahieren, indem der Text in Bezug auf Anzeigen und alle anderen Unordnung beseitigt wurde. Nach einigen Monaten der Recherche gab ich ihn als Problem auf das kann nicht genau bestimmt werden. (Ich habe verschiedene Wege ausprobiert, aber keiner war zuverlässig)

Vor einer Woche bin ich auf Readability gestoßen - ein Plugin, das jede URL in lesbaren Text konvertiert. Es sieht für mich ziemlich genau aus. Ich vermute, dass sie irgendwie einen Algorithmus haben, der klug genug ist, um den relevanten Text zu extrahieren.

Weiß jemand, wie sie es machen? Oder wie könnte ich das zuverlässig machen?


3
Die Frage ist, welchen Algorithmus SO verwendet, damit die Lesbarkeit seine Seiten nicht verarbeitet. :)
Piotr Dobrogost

Antworten:


170

Die Lesbarkeit besteht hauptsächlich aus Heuristiken, die in vielen Fällen "irgendwie gut funktionieren".

Ich habe einige Forschungsarbeiten zu diesem Thema verfasst und möchte den Hintergrund erläutern, warum es einfach ist, eine Lösung zu finden, die gut funktioniert und wenn es schwierig wird, eine 100% ige Genauigkeit zu erreichen.

Es scheint ein Sprachgesetz zu geben, das der menschlichen Sprache zugrunde liegt und das sich auch (aber nicht ausschließlich) im Inhalt von Webseiten manifestiert, das bereits zwei Arten von Text klar voneinander trennt (Volltext vs. Nicht-Volltext oder grob gesagt ". Hauptinhalt "vs." Boilerplate ").

Um den Hauptinhalt aus HTML zu erhalten, ist es in vielen Fällen ausreichend, nur die HTML-Textelemente (dh Textblöcke, die nicht durch Markups unterbrochen werden) mit mehr als 10 Wörtern beizubehalten. Es scheint, dass Menschen aus zwei Arten von Text wählen ("kurz" und "lang", gemessen an der Anzahl der Wörter, die sie emittieren), um zwei verschiedene Motivationen für das Schreiben von Text zu erhalten. Ich würde sie "Navigations" - und "Informations" -Motivationen nennen.

Wenn ein Autor möchte, dass Sie schnell erfahren, was geschrieben steht, verwendet er "Navigationstext", dh einige Wörter (wie "STOP", "Read this", "Click here"). Dies ist die am häufigsten verwendete Textart in Navigationselementen (Menüs usw.).

Wenn ein Autor möchte, dass Sie tief verstehen, was er / sie meint, verwendet er / sie viele Wörter. Auf diese Weise wird die Mehrdeutigkeit auf Kosten einer Erhöhung der Redundanz beseitigt. Artikelähnlicher Inhalt fällt normalerweise in diese Klasse, da er mehr als nur wenige Wörter enthält.

Während diese Trennung in einer Vielzahl von Fällen zu funktionieren scheint, wird es mit Schlagzeilen, kurzen Sätzen, Haftungsausschlüssen, Copyright-Fußzeilen usw. schwierig.

Es gibt ausgefeiltere Strategien und Funktionen, mit denen der Hauptinhalt vom Boilerplate getrennt werden kann. Zum Beispiel die Verbindungsdichte (Anzahl der Wörter in einem Block, die verknüpft sind, im Vergleich zur Gesamtzahl der Wörter im Block), die Merkmale der vorherigen / nächsten Blöcke, die Häufigkeit eines bestimmten Blocktextes im "gesamten" Web, die DOM-Struktur des HTML-Dokuments, das visuelle Bild der Seite usw.

Sie können meinen neuesten Artikel " Boilerplate Detection using Shallow Text Features " lesen , um einen Einblick aus einer theoretischen Perspektive zu erhalten. Sie können sich auch das Video meiner Papierpräsentation auf VideoLectures.net ansehen.

"Lesbarkeit" verwendet einige dieser Funktionen. Wenn Sie sich das SVN-Änderungsprotokoll genau ansehen, werden Sie feststellen, dass sich die Anzahl der Strategien im Laufe der Zeit geändert hat, ebenso wie die Extraktionsqualität der Lesbarkeit. Beispielsweise hat die Einführung der Verbindungsdichte im Dezember 2009 sehr zur Verbesserung beigetragen.

Meiner Meinung nach macht es daher keinen Sinn, "Lesbarkeit macht es so" zu sagen, ohne die genaue Versionsnummer zu erwähnen.

Ich habe eine Open Source-Bibliothek zur Extraktion von HTML-Inhalten namens boilerpipe veröffentlicht , die verschiedene Extraktionsstrategien bietet. Je nach Anwendungsfall funktioniert der eine oder andere Extraktor besser. Sie können diese Extraktoren auf Seiten Ihrer Wahl mit der begleitenden Boilerpipe-Web-App in Google AppEngine testen.

Informationen zum Sprechen von Zahlen finden Sie auf der Seite " Benchmarks " im Boilerpipe-Wiki, auf der einige Extraktionsstrategien verglichen werden, darunter Boilerpipe, Lesbarkeit und Apple Safari.

Ich sollte erwähnen, dass diese Algorithmen davon ausgehen, dass der Hauptinhalt tatsächlich Volltext ist. Es gibt Fälle, in denen der "Hauptinhalt" etwas anderes ist, z. B. ein Bild, eine Tabelle, ein Video usw. Die Algorithmen funktionieren in solchen Fällen nicht gut.

Prost,

Christian


3
Ist dieses Kesselrohrprojekt noch aktiv?
Abby

5
Ich glaube, Sie sollten Ihr Projekt besser auf GitHub stellen, damit es von Open Source-Entwicklern sozial wächst.
Inanc Gumus

1
Ein gutes Beispiel für die Erklärung von Dr. Kohlschütter ist diese Webseite. Wenn Sie in Safari den Reader verwendet haben, werden Sie feststellen, dass seine Antwort dank der Linkdichte als Haupttext angezeigt wird. Es handelt sich um verknüpften Text, der im Vergleich zu anderen Blöcken als Haupttext erkannt wird.
Abdelrahman Eid

1
"Migrierte" eine Kopie in mein Repo github.com/k-bx/boilerpipe für den Fall, dass es verloren geht :)
Konstantine Rybnikov

16

Die Lesbarkeit ist ein Javascript-Lesezeichen. Dies bedeutet, dass der clientseitige Code das DOM manipuliert. Schauen Sie sich das Javascript an und Sie sollten sehen können, was los ist.

Workflow und Code der Lesbarkeit:

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

Und wenn Sie den JS- und CSS-Dateien folgen, die der obige Code enthält, erhalten Sie das gesamte Bild:

http://lab.arc90.com/experiments/readability/js/readability.js (dies ist ziemlich gut kommentiert, interessante Lektüre)

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


12

Natürlich gibt es dafür keine 100% zuverlässige Möglichkeit. Den Quellcode der Lesbarkeit können Sie hier einsehen

Im Grunde versuchen sie, positive und negative Textblöcke zu identifizieren . Positive Bezeichner (dh Div-IDs) wären etwa:

  • Artikel
  • Körper
  • Inhalt
  • Blog
  • Geschichte

Negative Bezeichner wären:

  • Kommentar
  • diskutieren

Und dann haben sie unwahrscheinliche und vielleicht Kandidaten. Was sie tun würden, ist zu bestimmen, was am wahrscheinlichsten der Hauptinhalt der Site ist, siehe Zeile 678in der Lesbarkeitsquelle. Dazu werden hauptsächlich die Länge der Absätze, ihre Bezeichner (siehe oben), der DOM-Baum (dh wenn der Absatz ein letzter untergeordneter Knoten ist) analysiert, alles Unnötige entfernt, die Formatierung entfernt usw.

Der Code hat 1792 Zeilen. Es scheint ein nicht triviales Problem zu sein, also können Sie sich vielleicht von dort inspirieren lassen.


2
Wissen Sie zufällig, ob der Code Open Source ist und ob er in kommerziellen Produkten verwendet werden kann?
user300981

2
Der Quellcode wird unter Apache License 2.0 veröffentlicht. Dies bedeutet, dass Sie ihn verwenden, verteilen, ändern und modifizierte Versionen davon verteilen können. Ich bin mir jedoch nicht ganz sicher über die Details.
Slhck

2
@bobsmith Apple hat es in der neuesten Version von Safari verwendet. Sie haben Arc90 in den Versionshinweisen gutgeschrieben.
s4y

7

Interessant. Ich habe ein ähnliches PHP-Skript entwickelt. Grundsätzlich werden Artikel gescannt und Wortteile an den gesamten Text angehängt (Brill Tagger). Dann werden grammatikalisch ungültige Sätze sofort beseitigt. Dann zeigen plötzliche Verschiebungen der Pronomen oder der Vergangenheitsform an, dass der Artikel beendet ist oder noch nicht begonnen hat. Wiederholte Phrasen werden gesucht und entfernt, z. B. "Yahoo News Sports Finance" wird zehnmal auf der Seite angezeigt. Sie können auch Statistiken über den Ton mit einer Vielzahl von Wortbanken erhalten, die sich auf verschiedene Emotionen beziehen. Plötzliche Tonänderungen von aktiv / negativ / finanziell zu passiv / positiv / politisch deuten auf eine Grenze hin. Es ist wirklich endlos, egal wie tief Sie graben möchten.

Die Hauptprobleme sind Links, eingebettete Anomalien, Skriptstile und Aktualisierungen.


3
Das klingt nach einem wirklich interessanten Ansatz - haben Sie Code, den Sie daraus teilen können?
lsh

2
Ich zweitens, haben Sie einen Beispielcode oder Informationen zu Ihrem Code, die wir uns ansehen können?
Userabuser
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.