102 votes

Quel algorithme Readability utilise-t-il pour extraire le texte des URL ?

Depuis un certain temps, j'essaie de trouver un moyen d'extraire intelligemment le texte "pertinent" d'une URL en éliminant le texte lié aux annonces et tous les autres encombrements.Après plusieurs mois de recherche, j'ai abandonné comme un problème qui ne peut pas être déterminé avec précision. (J'ai essayé différentes méthodes, mais aucune n'était fiable).

Il y a une semaine, je suis tombée sur Lisibilité - un plugin qui convertit n'importe quelle URL en texte lisible. Il me semble assez précis. Je pense qu'ils ont en quelque sorte un algorithme assez intelligent pour extraire le texte pertinent.

Quelqu'un sait-il comment ils font ? Ou comment je pourrais le faire de manière fiable ?

167voto

Dr. Kohlschütter Points 1751

La lisibilité consiste principalement en une heuristique qui "fonctionne bien" dans de nombreux cas.

J'ai écrit quelques articles de recherche sur ce sujet et je voudrais expliquer pourquoi il est facile de trouver une solution qui fonctionne bien et quand il devient difficile de s'approcher d'une précision de 100%.

Il semble y avoir une loi linguistique sous-jacente dans le langage humain qui se manifeste également (mais pas exclusivement) dans le contenu des pages Web, qui sépare déjà assez clairement deux types de texte (texte intégral ou non intégral ou, en gros, "contenu principal" ou "passe-partout").

Pour obtenir le contenu principal d'un document HTML, il suffit dans de nombreux cas de ne conserver que les éléments de texte HTML (c'est-à-dire les blocs de texte qui ne sont pas interrompus par des balises) qui comportent plus de 10 mots environ. Il semble que les humains choisissent parmi deux types de texte ("court" et "long", mesurés par le nombre de mots qu'ils émettent) pour deux motivations différentes de l'écriture de texte. Je les appellerais les motivations "navigationnelles" et "informationnelles".

Si un auteur veut que tu rapidement obtenir ce qui est écrit, il/elle utilise du texte "de navigation", c'est-à-dire quelques mots (comme "STOP", "Lisez ceci", "Cliquez ici"). C'est le type de texte le plus répandu dans les éléments de navigation (menus, etc.).

Si un auteur veut que vous compreniez profondément ce qu'il veut dire, il utilise de nombreux mots. De cette façon, l'ambiguïté est supprimée au prix d'une augmentation de la redondance. Le contenu de type article entre généralement dans cette catégorie, car il comporte plus que quelques mots.

Si cette séparation semble fonctionner dans une pléthore de cas, elle devient délicate avec les titres, les phrases courtes, les clauses de non-responsabilité, les pieds de page de copyright, etc.

Il existe des stratégies et des fonctionnalités plus sophistiquées qui permettent de séparer le contenu principal du contenu standard. Par exemple, la densité des liens (nombre de mots d'un bloc qui sont liés par rapport au nombre total de mots du bloc), les caractéristiques des blocs précédents/suivants, la fréquence d'un bloc de texte particulier dans l'ensemble du Web, la structure DOM du document HTML, l'image visuelle de la page, etc.

Vous pouvez lire mon dernier article " Détection des modèles de présentation en utilisant des caractéristiques de texte peu profondes "pour avoir un aperçu d'un point de vue théorique. Vous pouvez également regarder la vidéo de ma présentation sur VideoLectures.net.

"Readability" utilise certaines de ces fonctionnalités. Si vous observez attentivement le journal des modifications SVN, vous verrez que le nombre de stratégies a varié dans le temps, tout comme la qualité d'extraction de Readability. Par exemple, l'introduction de la densité des liens en décembre 2009 a beaucoup aidé à l'amélioration.

À mon avis, cela n'a donc aucun sens de dire "Readability le fait comme ça", sans mentionner le numéro de version exact.

J'ai publié une bibliothèque Open Source d'extraction de contenu HTML appelée tuyau de chaudière qui propose plusieurs stratégies d'extraction différentes. En fonction du cas d'utilisation, l'un ou l'autre extracteur fonctionne mieux. Vous pouvez essayer ces extracteurs sur les pages de votre choix en utilisant l'application compagnon boilerpipe-web sur Google AppEngine.

Pour laisser parler les chiffres, voir le " Repères Page " sur le wiki boilerpipe qui compare certaines stratégies d'extraction, dont boilerpipe, Readability et Apple Safari.

Je dois préciser que ces algorithmes supposent que le contenu principal est en fait un texte intégral. Il existe des cas où le "contenu principal" est autre chose, par exemple une image, un tableau, une vidéo, etc. Les algorithmes ne fonctionnent pas bien dans de tels cas.

A la vôtre,

Christian

16voto

Moin Zaman Points 15424

Readability est un bookmarklet javascript, c'est-à-dire un code côté client qui manipule le DOM. Regardez le javascript et vous devriez être capable de voir ce qui se passe.

Le flux de travail et le code de Readability :

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

Et si vous suivez les fichiers JS et CSS dans lesquels le code ci-dessus est inséré, vous aurez une vue d'ensemble :

http://lab.arc90.com/experiments/readability/js/readability.js (ceci est assez bien commenté, lecture intéressante)

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

12voto

slhck Points 8460

Il n'existe pas de méthode fiable à 100 %, bien sûr. Vous pouvez consulter le code source de Readability. aquí

En gros, ce qu'ils font c'est essayer d'identifier positif y négatif des blocs de texte. Les identificateurs positifs (c'est-à-dire les ID des divisions) seraient du type :

  • article
  • corps
  • contenu
  • blog
  • histoire

Les identifiants négatifs seraient :

  • commentaire
  • discuter de

Et puis ils ont improbable y peut-être candidats. Ce qu'ils feraient, c'est déterminer ce qui est le plus susceptible d'être le contenu principal du site, voir la ligne 678 dans la source de lisibilité. Pour ce faire, on analyse principalement la longueur des paragraphes, leurs identifiants (voir ci-dessus), l'arborescence DOM (c'est-à-dire si le paragraphe est un dernier nœud enfant), on enlève tout ce qui est inutile, on supprime le formatage, etc.

Le code comporte 1792 lignes. Il semble qu'il s'agisse d'un problème non trivial, alors peut-être pouvez-vous vous en inspirer.

7voto

user734063 Points 125

Intéressant . J'ai développé un script PHP similaire. En gros, il scanne les articles et attache des parties du discours à tout le texte (Brill Tagger). Ensuite, les phrases grammaticalement non valides sont instantanément éliminées. Ensuite, les changements soudains de pronoms ou de temps du passé indiquent que l'article est terminé, ou n'a pas encore commencé. Les phrases répétées sont recherchées et éliminées, par exemple "Yahoo news sports finance" apparaît dix fois dans la page. Vous pouvez également obtenir des statistiques sur le ton grâce à une pléthore de banques de mots relatifs à diverses émotions. Les changements soudains de ton, d'actif/négatif/financier, à passif/positif/politique indiquent une limite. Les possibilités sont infinies, quelle que soit la profondeur que vous souhaitez atteindre.

Les principaux problèmes sont les liens, les anomalies incorporées, les styles de script et les mises à jour.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X