Extraire automatiquement les concepts et mots-clés d’un texte (Part I : Les méthodes dites classiques)

22 février 2022 - 11  min de lecture - par Damien Garaud
Accueil > SEO Technique > Extraire automatiquement les concepts et mots-clés

À la R&D d’Oncrawl, nous cherchons de plus en plus à valoriser le contenu sémantique de vos pages Web. En effet, à l’aide de modèles de Machine Learning pour le traitement du langage naturel (Natural Language Processing aka NLP en anglais), il est possible de comparer finement le contenu de vos pages, de réaliser des résumés automatiques, de compléter ou corriger les tags de vos articles, d’optimiser le contenu en fonction de vos données Google Search Console, etc.

Dans un précédent article, nous avions parlé de l’extraction de contenu texte depuis des pages HTML. Cette fois-ci, nous souhaitons vous parler de l’extraction automatique de mots-clés d’un texte. Ce sujet sera découpé en deux billets :

  • le premier traitera du contexte et des méthodes dites “classiques” avec plusieurs exemples concrets
  • le second à venir prochainement traitera des approches plus sémantique à base de transformers et des méthodes d’évaluation afin de benchmarker ces différentes méthodes

Contexte

Au-delà d’un titre ou d’un résumé, quoi de mieux d’avoir quelques mots-clés (aka keywords) pour identifier le contenu d’un texte, d’un papier scientifique ou d’une page Web. C’est un moyen simple et très efficace d’identifier le sujet et les concepts d’un texte bien plus long. Ça peut aussi être une bonne façon de catégoriser une série de textes : les identifier et les regrouper par mots-clés. Les sites qui proposent des articles scientifiques tels que PubMed ou arxiv.org peuvent ainsi proposer des catégories et des recommandations sur la base de ces mots-clés.

Les mots-clés, c’est aussi très utile pour indéxer de très larges documents ainsi que pour la recherche d’information (Information Retrieval), un champs d’expertise bien connu des moteurs de recherche 😉

L’absence de mots-clés est d’ailleurs un problème récurrent dans la catégorisation automatique des articles scientifiques [1] : beaucoup d’articles n’ont pas de mots-clés assignés. Il faut donc trouver des méthodes pour pouvoir extraire automatiquement les concepts et les mots-clés d’un texte. Afin d’évaluer la pertinence d’une série de mots-clés extraite de manière automatique, on trouve souvent des datasets qui comparent les mots-clés extraits d’un algorithme avec des mots-clés extraits par plusieurs humains.

Comme vous pouvez l’imaginer, il s’agit d’un problème partagé par les moteurs de recherche au moment de la catégorisation des pages web. Mieux comprendre les processus automatisés d’extraction de mots-clés permet de mieux saisir pourquoi une page web se positionne pour un tel ou un tel mot-clé. Il peut également faire apparaître des lacunes sémantiques qui l’empêchent de bien se positionner pour le mot-clé que vous avez ciblé.

Il existe évidemment plusieurs façons d’extraire les mots-clés d’un texte ou d’un paragraphe. Dans ce premier billet, nous allons décrire les approches dites “classiques”.

Contraintes

Nous avons néanmoins quelques contraintes et pré-requis dans le choix d’un algorithme :

  • La méthode doit être capable d’extraire les mots-clés d’un document unique. Certaines méthodes nécessitent d’avoir un corpus complet, c’est-à-dire plusieurs centaines voire milliers de documents. Bien que ces méthodes soient utilisables par des moteurs de recherche, elles ne vont pas nous être utiles pour un document unique.
  • Nous sommes dans un cas de Machine Learning non supervisé. Nous n’avons pas sous la main un jeu de données en français, en anglais ou autre avec des données annotées. Autrement dit, nous n’avons pas des milliers de documents avec des mots-clés déjà extraits.
  • La méthode doit être indépendante du domaine / champs lexical du document. On veut pouvoir extraire des mots-clés de tout type de document : articles de news, page web, etc. À savoir que certains datasets qui ont déjà des mots-clés extraits pour chaque document sont souvent spécifiques à un domaine : médecine, science informatique, etc.
  • Certaines méthodes reposent sur des modèles de POS-tagging, à savoir : la capacité d’un modèle de NLP à identifier les mots d’une phrase par leur type grammatical : un verbe, un nom, un déterminant. Déterminer l’importance d’un mot-clé qui est un nom plutôt qu’un déterminant est clairement pertinent. Par contre, en fonction des langues, les modèles de POS-tagging sont d’une qualité parfois très inégale.

À propos des méthodes classiques

Nous distinguons les méthodes dites “classiques” à celles plus récentes qui utilisent des techniques de NLP – Natural Language Processing – plus récentes comme le words embeddings et le contextual embeddings. Ce sujet sera traité dans un prochain billet. Mais revenons d’abord aux approches classiques, nous en distinguons deux :

  • l’approche statistique
  • l’approche par graphe

L’approche statistique va surtout se reposer sur les fréquences des mots et leur cooccurrence. On part d’hypothèses assez simples pour construire des heuristiques et ainsi extraire les mots d’importance : un mot très fréquent, une série de mots consécutifs qui apparaissent plusieurs fois, etc. Les méthodes par graphe vont quant à elles construire un graphe où chaque nœud peut correspondre à un mot, groupe de mots ou phrase. Puis chaque arc peut représenter la probabilité (ou la fréquence) d’observer ces mots ensemble.

Citons quelques méthodes :

Tous les exemples donnés utilisent le texte extrait de cette page Web : Jazz au Trésor : John Coltrane – Impressions Graz 1962.

Approche statistique

Nous allons vous présenter les deux méthodes que sont Rake et Yake. Dans un contexte SEO, vous avez peut-être entendu parler de la méthode TF-IDF. Mais comme elle nécessite un corpus de documents, nous ne la traiterons pas ici.

RAKE

RAKE est l’acronyme de Rapid Automatic Keyword Extraction. Il existe plusieurs implémentations de cette méthode en Python, dont rake-nltk. Le score de chaque mot-clé, qu’on appelle aussi keyphrase car elle comporte plusieurs mots, repose sur deux éléments : la fréquence des mots et la somme de leurs cooccurrences. La constitution de chaque keyphrase est très simple, elle consiste à :

  1. découper le texte en phrases
  2. découper chaque phrase en keyphrases

Dans la phrase suivante, nous allons prendre tous les groupes de mots séparés par des éléments de ponctuations ou des stopwords :

Juste auparavant, Coltrane était à la tête d’un quintet, avec Eric Dolphy à ses côtés et Reggie Workman à la contrebasse.

Cela pourrait donner les keyphrases suivantes :

"Juste auparavant", "Coltrane", "tête", "quintet", "Eric Dolphy", "côtés", "Reggie Workman", "contrebasse".

À noter que les stopwords sont une série de mots très fréquents comme "la", "dans", "et" ou "elle". Comme les méthodes classiques reposent souvent sur le calcul de fréquence d’occurrence des mots, il est important de bien choisir ses stopwords. La plupart du temps, on ne souhaite pas avoir des mots comme "à", "le" ou "des" dans nos propositions de keyphrases. En effet, ces stopwords ne sont pas associés à un champ lexical spécifique et sont donc bien moins pertinents que les mots "jazz" ou "saxophone" par exemple.

Une fois qu’on a isolé plusieurs keyphrases candidates, on leur donne un score en fonction de la fréquence des mots et des cooccurrences. Plus le score est haut, plus la keyphrases est censée être pertinente.

Essayons rapidement avec le texte issu de l’article à propos de John Coltrane.

# python snippet for rake
from rake_nltk import Rake

# suppose you've already the article in the 'text' variable
rake = Rake(stopwords=FRENCH_STOPWORDS, max_length=4)
rake.extract_keywords_from_text(text)
rake_keyphrases = rake.get_ranked_phrases_with_scores()[:TOP]

Voici les 5 premières keyphrases :

“radio publique nationale autrichienne”, “cimes lyriques plus célestes”, “graz a deux particularités”, “john coltrane saxophone ténor”, “seule version enregistrée”

Il existe quelques inconvénients à cette méthode. La première, c’est l’importance du choix des stopwords car ils servent à découper une phrase en keyphrases candidates. La deuxième, c’est quand les keyphrases sont trop longues, elles vont souvent avoir un score plus élevé du fait de la cooccurrence des mots présents. Pour limiter la longueur des keyphrases, nous avons paramétré la méthode avec un max_length=4.

YAKE

YAKE est cette fois-ci l’acronyme de Yet Another Keyword Extractor. Cette méthode repose sur l’article suivant YAKE! Keyword extraction from single documents using multiple local features qui date de 2020. C’est une méthode plus récente que RAKE dont les auteur·e·s ont proposé une implémentation en Python disponible sur Github.

On va, comme pour RAKE, se baser sur la fréquence des mots et leur cooccurrence. Les auteur·e·s vont aussi ajouter quelques heuristiques intéressantes :

  • on va distinguer les mots en minuscule et les mots en majuscule (soit la première lettre, soit l’ensemble du mot). On va ici supposer que les mots qui commencent par une majuscule (hors début de phrase) sont plus pertinents que les autres : nom de personnes, villes, pays, marque. C’est le même principe pour les mots tout en majuscule.
  • le score de chaque keyphrase candidate va dépendre de sa position dans le texte. Si les keyphrases candidates apparaissent au début du texte, elles auront un meilleur score que si elles apparaissent à la fin. À titre d’exemple, les articles de news mentionnent souvent les concepts importants en début d’article.
# python snippet for yake
from yake import KeywordExtractor as Yake

yake = Yake(lan="fr", stopwords=FRENCH_STOPWORDS)
yake_keyphrases = yake.extract_keywords(text)

À l’instar de RAKE, voici les 5 premiers résultats :

“Jazz au Trésor”, “John Coltrane”, “Impressions Graz”, “Graz”, “Coltrane”

Malgré quelques duplications de certains mots dans certaines keyphrases, cette méthode nous semble assez intéressante.

Approche par graphe

Ce type d’approche ne s’éloigne pas trop de l’approche statistique dans le sens où on va aussi calculer des cooccurrences de mots. Le suffix Rank associé à certains noms de méthodes comme TextRank repose sur le principe de l’algo du PageRank pour calculer la popularité de chaque page en fonction de ses liens entrants et sortants.

TextRank

Cet algorithme issu du papier TextRank: Bringing Order into Texts datant de 2004 repose sur les mêmes principes de l’algorithme du PageRank. Par contre, au lieu de construire un graphe avec des pages et des liens, nous allons construire un graphe avec des mots. Chaque mot sera lié avec d’autres mots en fonction de leur cooccurrence.

Il existe plusieurs implémentations en Python. Dans cet article, je vous présenterai pytextrank. Nous allons faire une entorse à une de nos contraintes à propos du POS-tagging. En effet, lors de la construction du graphe, nous n’allons pas inclure tous les mots en tant que nœud. Seuls les verbes et les noms seront pris en compte. À l’instar des méthodes précédentes qui utilisent des stopwords pour filtrer les candidats non pertinents, l’algo de TextRank utilise le type grammatical des mots.

Voici un exemple d’une partie du graphe qui sera construit par l’algo :

text rank graph example

Voici un exemple d’utilisation en Python. À savoir que cette implémentation utilise le mécanisme de pipeline de la bibliothèque spaCy. C’est cette bibliothèque qui est capable de faire le POS-tagging.

# python snippet for pytextrank
import spacy
import pytextrank

# load a french model
nlp = spacy.load("fr_core_news_sm")

# add pytextrank to the pipe
nlp.add_pipe("textrank")
doc = nlp(text)

textrank_keyphrases = doc._.phrases

Voici les 5 premiers résultats :

“Copenhague”, “novembre”, “Impressions Graz”, “Graz”, “John Coltrane”

En plus d’extraire les keyphrases, TextRank permet aussi d’extraire des phrases. Cela peut être très utile pour faire des résumés dits “extractifs” – cet aspect ne sera pas traité dans cet article.

Conclusions

Parmi les trois méthodes testées ici, les deux dernières nous semblent assez pertinentes par rapport au sujet du texte. Afin de mieux comparer ces approches, il faudrait évidemment évaluer ces différents modèles sur un plus grand nombre d’exemples. Il existe effectivement des métriques pour mesurer la pertinence de ces modèles d’extraction de mots-clés.

Les listes de mots clés produites par ces modèles dites classiques fournissent une excellente base pour vérifier que vos pages ciblent bien la thématique visée. De plus, elles donnent une première approximation de comment un moteur de recherche pourrait comprendre et classifier le contenu.

D’autre part, d’autres méthodes utilisant des modèles de NLP pré-entrainés comme BERT peuvent aussi être utilisées pour extraire les concepts d’un document. Contrairement à l’approche dite classique, ces méthodes permettent normalement de mieux capter la sémantique.

Les différentes méthodes d’évaluation, le contextual embeddings et les transformers vous seront présentés dans un second article à venir sur le sujet !

Petite mise en abyme amusante : voici la liste des mots-clés extraits de cet article avec l’une des trois méthodes citées :

“méthodes”, “mots-clés”, “keyphrases”, “texte”, “mots-clés extraits”, “Natural Language Processing”

Références Bibliographiques

Damien Garaud Voir tous ses articles
Précédemment data scientist chez Oncrawl, Damien aime apprendre de nouvelles techniques et outils de développement, de nouveaux langages de programmation afin d'améliorer son travail.
Sujets en lien :