SEO Superhero : Générer vos méta descriptions


Pour bien commencer l’année, je vous partage avec Thibault Willerval une méthode pour automatiser l’écriture de méta descriptions.

Cette méthode avait été mentionnée par Paul Shapiro ( https://searchengineland.com/reducing-the-time-it-takes-to-write-meta-descriptions-for-large-websites-299887 ) et nous avons réussi à l’industrialiser en utilisant une plateforme de DataScience.

Avec la formation DataSEOLabs niveau 2 qui approche à grand pas, je vais donner de nombreux exemples concrets cette année dans un cycle intitulé SEO Superhero.

Solutions classiques

Encore aujourd’hui, quand vous avez un site e-Commerce avec beaucoup de pages de produits, il est très fastidieux d’écrire à la main toutes les méta descriptions.

La solution la plus utilisée consiste à créer un modèle, de faire tourner le nom du produit et ajouter la description abrégée

Par exemple : Achetez {nom du produit} chez {votre marque} aujourd’hui. {Description abrégée du produit}

Bien sûr, cela dépend de la structure de la base de données, des restrictions du système de gestion de contenu (CMS) et de vos développeurs, mais ça reste une bonne solution quand c’est possible.

En effet, c’est beaucoup mieux que de laisser faire Google car il va insérer automatiquement des phrases qu’il juge représentatives et parfois la phrase mise en avant n’est pas du tout valorisante pour le produit.

Donc si vous ne pouvez pas engager une armée de rédacteurs et si vous ne pouvez pas ou ne voulez pas mettre des balises descriptions peu valorisantes, alors je pense que vous devriez envisager une autre solution : le résumé de texte.

Résumé de texte

Dans le passé, j’ai testé plusieurs solutions pour résumer des textes complexes mais j’ai vite compris que les résultats n’étaient pas exploitables car les modèles ne reformulaient pas le texte.

Par contre, l’algorithme de résumé de texte permettait d’indiquer une URL et d’en extraire un extrait utilisable qui se traduisait très bien en une méta description ou un message publicitaire pour AdWords.

Il existe 3 grandes méthodes : Extraction, Abstraction et compression

La première méthode (extractive) se limite à extraire des phrases complètes censées être les plus pertinentes et à les concaténer de façon à produire un extrait. Cette méthode s’appuie sur différents algorithmes de Machine Learning que je vais détailler ensuite.

La seconde méthode (abstractive) va rédiger un résumé en générant des phrases pas forcément contenues dans l’original. En effet, des algorithmes de Deep Learning avec de nombreuses heures d’entrainement sont capables de reformuler un texte.

La troisième méthode, sûrement la moins connue, consiste à générer un résumé par compression de phrases, c’est à dire que les phrases extraites sont compressées pour éliminer les informations superflues.

Concentrons-nous sur les méthodes extractives

Luhn

Cette méthode compte la fréquence du mot dans le texte et contrôle la position relative du mot dans la phrase.

Avantage : Peut mettre en avant les sujets principaux

Inconvénient : Trop de poids sur le début du document

LSA

Une matrice des phrases est créée avec une matrice TF-IDF. On observe l’importance des mots selon les sujets

Avantage : Détecte les mots les plus récurrents

Inconvénients : Très sensible aux stops words et les performances différentes selon les langues.

TextRank

Cette méthode est inspirée du Google Page Rank. Un score de similarité est calculé pour chaque mot et phrases.

Avantage : Très bonne performance

Inconvénients : La donnée doit être préparée, Fonctionne que pour 1 type de document.

LexRank

Cette méthode est aussi inspirée du Google Page Rank.
Une notion de graphe est utilisée pour détecter les phrases importantes.

Avantage : Très bonne performance, résume un groupe de documents différents

Inconvénient : Les documents ne doivent pas mentionner des notions contradictoires

Comment évaluer la qualité d’un résumé ?

La principale métrique à connaitre s’appelle ROUGE (Recall-Oriented Understudy for Gisting Evaluation).

Elle mesure le nombre de points communs entre les N-gramme produits dans les résumés écrits par des humains et ceux automatiquement créés par une machine. Un haut niveau en ROUGE implique un niveau de corrélation élevé avec les résumés humains.

Commençons par un exemple avec ROUGE-1, nous allons compter les unigrammes en commun sur un résumé de texte qui essaye d’avoir la description la plus précise d’un Beagle à partir de la page Wikipédia.

ROUGE-1

Le calcul est le suivant pour les unigrammes et nous pouvons faire la même chose avec les bigrammes ou les trigrammes. Nous allons compter le nombre de mot en commun et diviser par le total des mots.

En savoir plus sur l’évaluation avec ROUGE : https://github.com/kavgan/ROUGE-2

Petit défi : quel est le résultat pour ROUGE-2 et ROUGE-3 ? (solution à la fin de l’article )

Par contre, ces scores sont assez limités car ils comptent simplement tous les n-grammes en commun ( les articles, les adjectifs, … ). C’est pour cela que la métrique la plus utilisée est souvent ROUGE-L

ROUGE-L identifie la séquence la plus longue des N-grammes en commun. Source : https://en.wikipedia.org/wiki/Longest_common_subsequence_problem

Les méthodes abstractives ont des scores (ROUGE-L) bien supérieurs aux méthodes extractives mais elles sont bien plus complexes à mettre en place et cela fera l’objet d’un autre article. Nous allons donc nous concentrer sur les résumés de texte à partir des méthodes extractives ( LexRank, TextRank,…)

Scripts & Tools

Voici quelques scripts et outils pour vous aider à générer un résumé de texte pour vos méta-descriptions. Nous avons utilisé notamment la plateforme Dataiku et les langages R et Python

Workflow pour générer des méta-descriptions avec les méthodes extractives

Etape 1 : Plugin ScreamingFrog

La première étape consiste à installer et utiliser le plugin ScreamingFrog pour Dataiku qui va permettre de récupérer toutes les URLs de votre site.

Step 1

https://github.com/voltek62/Dataiku-SEO-Plugins/tree/master/SCREAMINGFROG

Ce plugin est simple à utiliser et la procédure d’installation est détaillée sur le Github.

Etape 2 : Choix des URLs et récupération du contenu

La seconde étape consiste à identifier toutes les URLs avec des méta-descriptions vides ou en doublon et ensuite aller chercher le contenu texte de chacunes des URLs.

Premièrement, il suffit de cliquer sur la colonne Méta Description 1 du dataset « csv_crawl_out_prepared »et de lancer une analyse pour identifier toutes les balises en double ou vide.

Choix des URLs

Deuxièmement, il faut lancer le programme en R qui va récupérer toutes les URLs préalablement sélectionnées et récupérer le contenu principal de la page avec un programme en R. Nous profitons de cette étape pour retirer les phrases souvent dupliquées comme par exemple « Ce produit n’est plus en stock ». Nous obtenons donc un dataset avec une colonne main_text qui contient le texte principal extrait avec une requête XPATH.

library(dataiku)
library(httr)
library(dplyr)
library(XML)
library(stringr)

# Recipe inputs
csv_crawl_out_prepared <- dkuReadDataset("csv_crawl_out_prepared")
csv_crawl_out_prepared$main_text <- ""

for (i in 1:nrow(csv_crawl_out_prepared)) {

  url <- as.character(csv_crawl_out_prepared[i,]$Address)
  # "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"
  request <- GET(url)
    
  Sys.sleep(1)
  doc <- htmlParse(request, encoding = "UTF-8")
    
  main_text <- xpathSApply(doc, "//text()[not(ancestor::script)][not(ancestor::style)][not(ancestor::noscript)][not(ancestor::form)][string-length(.) > 100]", xmlValue)
  main_text <- unique(main_text)
  main_text <- paste(main_text, collapse = ".")
    
  # remove useless sentences
  #main_text <- gsub("lorem ipsum.","",main_text)  

  main_text <- str_squish(main_text)
    
  #UTF-8  
  csv_crawl_out_prepared[i,]$main_text <- main_text

}

# Recipe outputs
dkuWriteDataset(csv_crawl_out_prepared,"csv_crawl_out_extracted")

Etape 3 : Résumé de texte automatique

Pour le langage Python, il existe une excellente librairie appelée Sumy qui a implémenté les principales méthodes extractives et il existe aussi un plugin pour Dataiku qui implémente cette librairie.

Extractive summarization

Nous nous sommes donc basés sur ce plugin en y ajoutant des améliorations : https://github.com/voltek62/Dataiku-SEO-Plugins/tree/master/text-summarization

  • Tester toutes les méthodes disponibles pour chaque ligne
  • Choisir sa langue
  • Fixer le souci d’encoding avec UTF-8

Le résultat a été impressionnant car en quelques minutes, nous pouvons choisir la méthode la plus efficace pour notre site.

Résultats

Conclusion

Si vous souhaitez tester ce projet, il a été zippé à cette adresse et je vous laisse importer le fichier zippé dans Dataiku pour lancer ces trois grandes étapes : https://github.com/voltek62/dataiku-text-summarization

Pour les trois premières personnes qui laissent un commentaire sur le blog, je suis prêt à lancer un test sur leurs 1000 premières URLs. Ainsi, ça vous donnera une idée de l’utilisation de ces méthodes sur votre site.

Bien sûr, il existe des méthodes encore plus élaborées que je vais détailler dans les prochaines articles. Si vous êtes impatients, je vous invite à découvrir cette librairie Python qui donne les méthodes les plus avancées en génération de texte avec des exemples prêts à l’emploi :
https://texar.io/

Si vous avez envie de progresser et savoir utiliser le R, le Python et Dataiku, vous pouvez suivre notre formation DataSEOLabs

Je vous invite surtout à venir nous voir au SEOCamp à Lille pour en savoir plus sur ces méthodes.

Crédit Photo : Flickr

*Solutions
ROUGE-2 ( recall ) = 0.28889
ROUGE-3 ( recall ) = 0.13655


2 Comments

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *