Pendant un certain temps, j'ai essayé de trouver un moyen d'extraire intelligemment le texte "pertinent" d'une URL en éliminant le texte lié aux publicités et tout le reste de l'encombrement. Après plusieurs mois de recherche, je l'ai abandonné comme un problème qui ne peut être déterminé avec précision. (J'ai essayé différentes manières mais aucune n'était fiable)
Il y a une semaine, je suis tombé sur Lisibilité - un plugin qui convertit n'importe quelle URL en texte lisible. Cela me semble assez précis. Je suppose qu'ils ont en quelque sorte un algorithme suffisamment intelligent pour extraire le texte pertinent.
Quelqu'un sait-il comment procéder? Ou comment pourrais-je le faire de manière fiable?
La lisibilité consiste principalement en des heuristiques qui "fonctionnent bien d'une manière ou d'une autre" dans de nombreux cas.
J'ai écrit des 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 d'obtenir une précision proche 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 vs texte non intégral ou, en gros, " contenu principal "vs" passe-partout ").
Pour obtenir le contenu principal du 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 le balisage) qui ont plus d'environ 10 mots. Il semble que les humains choisissent entre deux types de texte ("court" et "long", mesurés par le nombre de mots qu'ils émettent) pour deux motivations différentes d'écriture de texte. Je les appellerais des motivations "de navigation" et "d'information".
Si un auteur veut que vous obteniez rapidement ce qui est écrit, il/elle utilise du texte "de navigation", c'est-à-dire quelques mots (comme "STOP", "Lire ce "," Cliquez ici "). Il s'agit du 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/elle veut dire, il/elle utilise de nombreux mots. De cette façon, l'ambiguïté est supprimée au prix d'une augmentation de la redondance. Le contenu semblable à un article tombe généralement dans cette classe car il ne contient que quelques mots.
Bien que cette séparation semble fonctionner dans une pléthore de cas, elle devient délicate avec les titres, les phrases courtes, les exclusions de responsabilité, les pieds de page du droit d'auteur, etc.
Il existe des stratégies et des fonctionnalités plus sophistiquées qui permettent de séparer le contenu principal du passe-partout. Par exemple, la densité des liens (nombre de mots dans un bloc qui sont liés par rapport au nombre total de mots dans le bloc), les caractéristiques des blocs précédents/suivants, la fréquence d'un texte de bloc particulier dans le Web "entier", le Structure DOM du document HTML, l'image visuelle de la page etc.
Vous pouvez lire mon dernier article " Détection de plaque chauffante en utilisant des fonctionnalités de texte peu profond " pour obtenir un aperçu d'un point de vue théorique. Vous pouvez également regarder la vidéo de ma présentation papier sur VideoLectures.net.
La "lisibilité" utilise certaines de ces fonctionnalités. Si vous regardez attentivement le journal des modifications SVN, vous verrez que le nombre de stratégies a varié au fil du temps, tout comme la qualité d'extraction de la lisibilité. Par exemple, l'introduction de la densité de liaisons en décembre 2009 a beaucoup contribué à l'amélioration.
À mon avis, cela n'a donc aucun sens de dire "La lisibilité fait comme ça", sans mentionner le numéro de version exact.
J'ai publié une bibliothèque d'extraction de contenu HTML Open Source appelée kettlepipe , qui fournit plusieurs stratégies d'extraction différentes. Selon le cas d'utilisation, l'un ou l'autre extracteur fonctionne mieux. Vous pouvez essayer ces extracteurs sur les pages de votre choix à l'aide de l'application compagnon kettlepipe-web sur Google AppEngine.
Pour laisser parler les chiffres, consultez la page " Benchmarks " sur le wiki de kettlepipe qui compare certaines stratégies d'extraction, y compris les pipes de chaudière, la lisibilité et Apple Safari.
Je dois mentionner que ces algorithmes supposent que le contenu principal est en fait du texte intégral. Il y a des cas où le "contenu principal" est autre chose, par exemple une image, un tableau, une vidéo, etc. Les algorithmes ne fonctionneront pas bien dans de tels cas.
À votre santé,
Christian
la lisibilité est un bookmarklet javascript. ce qui signifie son code côté client qui manipule le DOM. Regardez le javascript et vous devriez pouvoir voir ce qui se passe.
Flux de travail et code de lisibilité:
/*
* 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 extraits par le code ci-dessus, vous aurez l'image complète:
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
Il n'y a bien sûr pas de moyen fiable à 100%. Vous pouvez jeter un œil au code source de lisibilité ici
Fondamentalement, ils essaient d'identifier positif et négatif blocs de texte. Les identifiants positifs (c'est-à-dire les identifiants div) seraient quelque chose comme:
Les identifiants négatifs seraient:
Et puis ils ont des candidats peu probables et peut-être . Ce qu'ils feraient serait de déterminer ce qui est le plus susceptible d'être le contenu principal du site, voir la ligne 678
dans la source de lisibilité. Cela se fait en analysant 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), supprimez tout ce qui n'est pas nécessaire, supprimez le formatage, etc.
Le code a 1792 lignes. Cela ne semble pas être un problème anodin, alors vous pouvez peut-être vous inspirer de là.
Intéressant. J'ai développé un script PHP PHP. Il analyse essentiellement les articles et attache des parties du discours à tout le texte (Brill Tagger). Ensuite, les phrases grammaticales invalides sont instantanément éliminées. Ensuite, les changements soudains de pronoms ou le passé indique que l'article est terminé ou n'a pas encore commencé. Les expressions répétées sont recherchées et éliminées, comme "Yahoo news sports finance" apparaît dix fois dans la page. Vous pouvez également obtenir des statistiques sur le ton avec une pléthore de mots banques liées à diverses émotions. Des changements soudains de ton, de actif/négatif/financier, à passif/positif/politique indiquent une limite. C'est vraiment sans fin, mais creusez vous voulez approfondir.
Les principaux problèmes sont les liens, les anomalies intégrées, les styles de script et les mises à jour.