KeyBERT est une technique d'extraction de mots-clés minimale et facile à utiliser qui exploite les intégrations BERT pour créer des mots-clés et des phrases clés les plus similaires à un document.
L’article média correspondant peut être trouvé ici.
Retour à la TdC
Bien qu'il existe déjà de nombreuses méthodes disponibles pour la génération de mots-clés (par exemple, Rake, YAKE !, TF-IDF, etc.), je voulais créer une méthode très basique mais puissante pour extraire des mots-clés et des phrases clés. C'est là qu'intervient KeyBERT ! Qui utilise les intégrations BERT et la simple similarité cosinus pour trouver les sous-phrases d'un document qui ressemblent le plus au document lui-même.
Tout d'abord, les intégrations de documents sont extraites avec BERT pour obtenir une représentation au niveau du document. Ensuite, les incorporations de mots sont extraites pour les mots/expressions N-grammes. Enfin, nous utilisons la similarité cosinus pour trouver les mots/expressions les plus similaires au document. Les mots les plus similaires pourraient alors être identifiés comme étant ceux qui décrivent le mieux l’ensemble du document.
KeyBERT n'est en aucun cas unique et est créé comme une méthode rapide et facile pour créer des mots-clés et des phrases clés. Bien qu'il existe de nombreux articles et solutions intéressants qui utilisent les intégrations BERT (par exemple, 1, 2, 3, ), je n'ai pas pu trouver de solution basée sur BERT qui n'aurait pas besoin d'être formée à partir de zéro et pourrait être utilisée par les débutants. ( corrigez-moi si je me trompe ! ). Ainsi, l'objectif était un pip install keybert
et au plus 3 lignes de code utilisées.
Retour à la TdC
L'installation peut être effectuée à l'aide de pypi :
pip install keybert
Vous souhaiterez peut-être en installer davantage en fonction des transformateurs et des backends de langage que vous utiliserez. Les installations possibles sont :
pip install keybert[flair]
pip install keybert[gensim]
pip install keybert[spacy]
pip install keybert[use]
L'exemple le plus minimal peut être vu ci-dessous pour l'extraction de mots-clés :
from keybert import KeyBERT
doc = """
Supervised learning is the machine learning task of learning a function that
maps an input to an output based on example input-output pairs. It infers a
function from labeled training data consisting of a set of training examples.
In supervised learning, each example is a pair consisting of an input object
(typically a vector) and a desired output value (also called the supervisory signal).
A supervised learning algorithm analyzes the training data and produces an inferred function,
which can be used for mapping new examples. An optimal scenario will allow for the
algorithm to correctly determine the class labels for unseen instances. This requires
the learning algorithm to generalize from the training data to unseen situations in a
'reasonable' way (see inductive bias).
"""
kw_model = KeyBERT ()
keywords = kw_model . extract_keywords ( doc )
Vous pouvez définir keyphrase_ngram_range
pour définir la longueur des mots-clés/phrases clés résultants :
>> > kw_model . extract_keywords ( doc , keyphrase_ngram_range = ( 1 , 1 ), stop_words = None )
[( 'learning' , 0.4604 ),
( 'algorithm' , 0.4556 ),
( 'training' , 0.4487 ),
( 'class' , 0.4086 ),
( 'mapping' , 0.3700 )]
Pour extraire des phrases clés, définissez simplement keyphrase_ngram_range
sur (1, 2) ou plus en fonction du nombre de mots que vous souhaitez dans les phrases clés résultantes :
>> > kw_model . extract_keywords ( doc , keyphrase_ngram_range = ( 1 , 2 ), stop_words = None )
[( 'learning algorithm' , 0.6978 ),
( 'machine learning' , 0.6305 ),
( 'supervised learning' , 0.5985 ),
( 'algorithm analyzes' , 0.5860 ),
( 'learning function' , 0.5850 )]
Nous pouvons mettre en évidence les mots-clés dans le document en définissant simplement highlight
:
keywords = kw_model . extract_keywords ( doc , highlight = True )
REMARQUE : Pour un aperçu complet de tous les modèles de transformateurs possibles, voir phrase-transformer. Je conseillerais soit "all-MiniLM-L6-v2"
pour les documents anglais, soit "paraphrase-multilingual-MiniLM-L12-v2"
pour les documents multilingues ou toute autre langue.
Pour diversifier les résultats, nous prenons les 2 x top_n mots/expressions les plus similaires au document. Ensuite, nous prenons toutes les combinaisons top_n des 2 x top_n mots et extrayons la combinaison qui est la moins similaire les unes aux autres par similarité cosinus.
>> > kw_model . extract_keywords ( doc , keyphrase_ngram_range = ( 3 , 3 ), stop_words = 'english' ,
use_maxsum = True , nr_candidates = 20 , top_n = 5 )
[( 'set training examples' , 0.7504 ),
( 'generalize training data' , 0.7727 ),
( 'requires learning algorithm' , 0.5050 ),
( 'supervised learning algorithm' , 0.3779 ),
( 'learning machine learning' , 0.2891 )]
Pour diversifier les résultats, nous pouvons utiliser la pertinence de marge maximale (MMR) pour créer des mots-clés/phrases clés qui sont également basés sur la similarité cosinus. Des résultats d' une grande diversité :
>> > kw_model . extract_keywords ( doc , keyphrase_ngram_range = ( 3 , 3 ), stop_words = 'english' ,
use_mmr = True , diversity = 0.7 )
[( 'algorithm generalize training' , 0.7727 ),
( 'labels unseen instances' , 0.1649 ),
( 'new examples optimal' , 0.4185 ),
( 'determine class labels' , 0.4774 ),
( 'supervised learning algorithm' , 0.7502 )]
Les résultats avec une faible diversité :
>> > kw_model . extract_keywords ( doc , keyphrase_ngram_range = ( 3 , 3 ), stop_words = 'english' ,
use_mmr = True , diversity = 0.2 )
[( 'algorithm generalize training' , 0.7727 ),
( 'supervised learning algorithm' , 0.7502 ),
( 'learning machine learning' , 0.7577 ),
( 'learning algorithm analyzes' , 0.7587 ),
( 'learning algorithm generalize' , 0.7514 )]
KeyBERT prend en charge de nombreux modèles d'intégration qui peuvent être utilisés pour intégrer les documents et les mots :
Cliquez ici pour un aperçu complet de tous les modèles d'intégration pris en charge.
Transformateurs de phrases
Vous pouvez sélectionner n'importe quel modèle parmi sentence-transformers
ici et le transmettre via KeyBERT avec model
:
from keybert import KeyBERT
kw_model = KeyBERT ( model = 'all-MiniLM-L6-v2' )
Ou sélectionnez un modèle SentenceTransformer avec vos propres paramètres :
from keybert import KeyBERT
from sentence_transformers import SentenceTransformer
sentence_model = SentenceTransformer ( "all-MiniLM-L6-v2" )
kw_model = KeyBERT ( model = sentence_model )
Flair
Flair vous permet de choisir presque n'importe quel modèle d'intégration disponible publiquement. Flair peut être utilisé comme suit :
from keybert import KeyBERT
from flair . embeddings import TransformerDocumentEmbeddings
roberta = TransformerDocumentEmbeddings ( 'roberta-base' )
kw_model = KeyBERT ( model = roberta )
Vous pouvez sélectionner n'importe quel ? modèle de transformateurs ici.
Retour à la TdC
Avec KeyLLM
vous pouvez à nouveau effectuer une extraction de mots clés avec des grands modèles linguistiques (LLM). Vous pouvez trouver la documentation complète ici mais il existe deux exemples communs avec cette nouvelle méthode. Assurez-vous d'installer le package OpenAI via pip install openai
avant de commencer.
Tout d’abord, nous pouvons demander directement à OpenAI d’extraire des mots-clés :
import openai
from keybert . llm import OpenAI
from keybert import KeyLLM
# Create your LLM
client = openai . OpenAI ( api_key = MY_API_KEY )
llm = OpenAI ( client )
# Load it in KeyLLM
kw_model = KeyLLM ( llm )
Cela interrogera n'importe quel modèle ChatGPT et lui demandera d'extraire des mots-clés du texte.
Deuxièmement, nous pouvons trouver des documents susceptibles de contenir les mêmes mots-clés et extraire uniquement les mots-clés pour ceux-ci. C'est beaucoup plus efficace que de demander les mots-clés pour chaque document. Il existe probablement des documents contenant exactement les mêmes mots-clés. Pour ce faire, c'est simple :
import openai
from keybert . llm import OpenAI
from keybert import KeyLLM
from sentence_transformers import SentenceTransformer
# Extract embeddings
model = SentenceTransformer ( 'all-MiniLM-L6-v2' )
embeddings = model . encode ( MY_DOCUMENTS , convert_to_tensor = True )
# Create your LLM
client = openai . OpenAI ( api_key = MY_API_KEY )
llm = OpenAI ( client )
# Load it in KeyLLM
kw_model = KeyLLM ( llm )
# Extract keywords
keywords = kw_model . extract_keywords ( MY_DOCUMENTS , embeddings = embeddings , threshold = .75 )
Vous pouvez utiliser le paramètre threshold
pour décider dans quelle mesure les documents doivent être similaires afin de recevoir les mêmes mots-clés.
Pour citer KeyBERT dans votre travail, veuillez utiliser la référence bibtex suivante :
@misc { grootendorst2020keybert ,
author = { Maarten Grootendorst } ,
title = { KeyBERT: Minimal keyword extraction with BERT. } ,
year = 2020 ,
publisher = { Zenodo } ,
version = { v0.3.0 } ,
doi = { 10.5281/zenodo.4461265 } ,
url = { https://doi.org/10.5281/zenodo.4461265 }
}
Ci-dessous, vous pouvez trouver plusieurs ressources qui ont été utilisées pour la création de KeyBERT mais surtout, ce sont des ressources étonnantes pour créer des modèles d'extraction de mots clés impressionnants :
Documents :
Dépôts Github :
MMR : La sélection des mots-clés/phrases-clés a été calquée sur :
REMARQUE : Si vous trouvez un dépôt papier ou github doté d'une implémentation facile à utiliser des intégrations BERT pour l'extraction de mots clés/phrases clés, faites-le moi savoir ! Je veillerai à ajouter une référence à ce dépôt.