Démarrez avec le package Transformers de Hugging Face pour l'analyse des sentiments, la traduction, la classification de texte zéro-shot, le résumé, et la reconnaissance d'entités nommées (anglais et français)
Les transformers sont certainement parmi les modèles d'apprentissage profonds les plus populaires du moment.
À l'origine, les transformers ont été présentés comme une nouvelle architecture pour la traduction linguistique [Attention is All you Need, 2017 ]
Et en fait, ils sont encore principalement utilisés pour le traitement du langage naturel.
Voici quelques exemples:
Dans cet article, vous utiliserez des modèles de transformateurs pré-entraînés pour effectuer certaines de ces tâches.
Nous allons utiliser la bibliothèque Hugging Face, qui fournit une interface simple et de haut niveau à TensorFlow ou Pytorch pour les transformateurs.
Hugging Face gère également un hub, ce qui facilite le partage et l'accès aux modèles et aux ensembles de données .
Vous pouvez exécuter ce tutoriel sur Google Colab en cliquant ici .
Il n'est pas nécessaire d'avoir une formation spécifique en programmation ou en apprentissage automatique, vous verrez que Hugging Face permet à quiconque d'utiliser très facilement des modèles de transformateurs pré-entraînés.
Enfin, veuillez noter que ce tutoriel a été traduit automatiquement depuis sa version anglaise !
Le package Transformers n'est pas installé par défaut sur Google Colab. Alors installons-le avec pip :
!pip install transformers[sentencepiece]
Dans cet article, nous utiliserons l'interface de pipeline de haut niveau, ce qui facilite grandement l'utilisation de modèles de transformers pré-entraînés.
Il nous faut juste dire au pipeline ce qu'il doit faire, et éventuellement de lui dire quel modèle utiliser pour cette tâche.
Ici, nous allons faire une analyse des sentiments en anglais.
Nous sélectionnons donc la tâche sentiment-analysis
et gardons le modèle par défaut :
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
Le pipeline est prêt, et nous pouvons maintenant l'utiliser :
classifier(["this is a great tutorial, thank you",
"your content just sucks"])
Nous avons envoyé deux phrases par le pipeline.
La première est considéréé comme positive et la deuxième négative, avec un niveau de confiance très élevé.
Voyons maintenant ce qui se passe si nous envoyons des phrases en français :
classifier(["Ton tuto est vraiment bien",
"il est complètement nul"])
Cette fois, le classement ne fonctionne pas...
En effet, la deuxième phrase, est classée comme positive.
Ce n'est pas une surprise : le modèle par défaut pour la tâche d'analyse des sentiments a été entraîné sur du texte anglais, et il ne comprend donc pas le français.
Alors, que faire si vous souhaitez travailler avec du texte dans une autre langue, disons le français ?
Il vous suffit de rechercher sur le hub un modèle de classification français.
Plusieurs modèles sont disponibles, et j'ai décidé de sélectionner nlptown/bert-base-multilingual-uncased-sentiment.
Nous pouvons spécifier ce modèle lors de la création de notre pipeline sentiment-analysis
:
multilang_classifier = pipeline("sentiment-analysis",
model="nlptown/bert-base-multilingual-uncased-sentiment")
multilang_classifier(["Ton tuto est vraiment bien",
"il est complètement nul"])
Et ça marche ! La deuxième phrase est maintenant correctement classée comme très négative.
Vous vous demandez peut-être pourquoi la confiance pour la première phrase est plus faible. Je suis presque sûr que c'est parce que cette phrase obtient également un score élevé pour « 4 stars ».
Essayons maintenant avec une critique réelle trouvéé sur Google pour un restaurant près de chez moi :
import pprint
sentence="Contente de pouvoir retourner au restaurant... Quelle déception... L accueil peu chaleureux... Un plat du jour plus disponible à 12h45...rien à me proposer à la place... Une pizza pas assez cuite et pour finir une glace pleine de glaçons... Et au gout très fade... Je pensais que les serveuses seraient plus aimable à l idée de retrouver leur clientèle.. Dommage"
pprint.pprint(sentence)
multilang_classifier([sentence])
2 étoiles ! sur Google Review, cet avis a 1 étoile. Ce n'est pas une mauvaise prédiction, et je pense que le score doit être assez élevé pour "1 star" également.
Essayons de faire un peu de traduction, de l'anglais vers le français.
Encore une fois, nous recherchons le hub, et nous nous retrouvons avec ce pipeline :
en_to_fr = pipeline("translation_en_to_fr",
model="Helsinki-NLP/opus-mt-en-fr")
en_to_fr("your tutorial is really good")
Cela fonctionne bien. Traduisons dans l'autre sens. Pour cela, nous devons changer la tâche et le modèle :
fr_to_en = pipeline("translation_fr_to_en",
model="Helsinki-NLP/opus-mt-fr-en")
fr_to_en("ton tutoriel est super")
Parfait!
De nos jours, de très grands modèles d'apprentissage en profondeur sont entraînés sur de vastes ensembles de données collectés sur Internet.
Ces modèles en savent déjà beaucoup, et n'ont donc pas besoin d'en apprendre beaucoup plus.
En règle générale, il est possible d'affiner ces modèles pour un cas d'utilisation spécifique comme la classification de texte avec un très petit jeu de données spécifique supplémentaire. C'est ce qu'on appelle l'apprentissage en quelques coups, ou few-shot learning.
Et parfois, nous pouvons même faire du zero shot learning : des tâches spécifiques peuvent être effectuées sans aucun entraînement spécifique. C'est ce que nous allons faire maintenant.
Nous recherchons dans le hub un modèle de classification zero-shot français, et nous créons le pipeline :
classifier = pipeline("zero-shot-classification",
model="BaptisteDoyen/camembert-base-xlni")
Dans l'exemple ci-dessous, je propose une phrase à classer, et je précise également les catégories.
Il est important de noter que le modèle n'a pas été entraîné avec ces catégories, vous pouvez les modifier à volonté !
sequence = "Colin est en train d'écrire un article au sujet du traitement du langage naturel"
candidate_labels = ["science","politique","education", "news"]
classifier(sequence, candidate_labels)
Les probabilités prédites semblent raisonnables. Cette phrase concerne en effet la science, l'actualité et l'éducation. Et n'a rien à voir avec la politique.
Essayons maintenant ceci :
sequence = "Laurent Wauquiez reconduit à la tête de la région Rhône-Alpes-Auvergne à la suite du deuxième tour des élections."
candidate_labels = ["politique", "musique"]
classifier(sequence, candidate_labels)
Cette fois, c'est bien la catégorie politique
qui sort en premier
N'hésitez pas à essayer d'autres phrases et d'autres catégories. Vous pouvez également changer de modèle si vous souhaitez effectuer une classification zero zhot en anglais ou dans une autre langue.
Résumer du texte est un cas d'usage intéressant des transformers.
Ici, nous utilisons un modèle entraîné sur un jeu de données obtenu en scrapant https://actu.orange.fr/, à nouveau trouvé sur le hub Hugging Face :
summarizer = pipeline("summarization",
model="moussaKam/barthez-orangesum-title")
Reprenons les deux premiers paragraphes d'un article sur le Covid-19 lu dans Le Monde :
import pprint
sentence = "La pandémie ne marque pas le pas. Le variant Delta poursuit son essor planétaire au grand dam de pays impatients de retrouver une vie normale. La pandémie a fait près de quatre millions de morts dans le monde depuis que le bureau de l’Organisation mondiale de la santé (OMS) en Chine a fait état de l’apparition de la maladie fin décembre 2019, selon un bilan établi par l’Agence France-Presse (AFP) à partir de sources officielles, lundi à 12 heures. Les Etats-Unis sont le pays le plus touché tant en nombre de morts (603 967) que de cas. Le Brésil, qui compte 513 474 morts, est suivi par l’Inde (396 730), le Mexique (232 564) et le Pérou (191 899), le pays qui déplore le plus de morts par rapport à sa population. Ces chiffres, qui reposent sur les bilans quotidiens des autorités nationales de santé, sont globalement sous-évalués. L’Organisation mondiale de la santé (OMS) estime que le bilan de la pandémie pourrait être deux à trois fois plus élevé que celui officiellement calculé."
pprint.pprint(sentence)
summarizer(sentence, max_length=80)
Le résumé est assez lapidaire, mais plutôt bon.
La reconnaissance d'entités nommées (NER pour Named Entity Recognition) peut servir de base à de nombreuses applications intéressantes.
Par exemple, on pourrait analyser des rapports financiers à la recherche de dates, de prix, de noms de sociétés.
Voyons comment faire cela.
Ici, nous utilisons un équivalent français de BERT, appelé CamemBERT, affiné pour NER :
ner = pipeline("token-classification", model="Jean-Baptiste/camembert-ner")
nes = ner("Colin est parti à Saint-André acheter de la mozzarella")
pprint.pprint(nes)
Nous devons faire un peu de post-traitement pour agréger les entités nommées du même type.
Voici un algorithme simple pour le faire (il peut certainement être amélioré !)
cur = None
agg = []
for ne in nes:
entity=ne['entity']
if entity != cur:
if cur is None:
cur = entity
if agg:
print(cur, ner.tokenizer.convert_tokens_to_string(agg))
agg = []
cur = entity
agg.append(ne['word'])
print(cur, ner.tokenizer.convert_tokens_to_string(agg))
Nous avons trouvé deux entités nommées :
Dans cet article, vous avez vu comme il est facile d'utiliser un transformateur pré-entraîné, en utilisant le package de transformers de Hugging Face.
Ceci est possible grâce à tous les chercheurs qui ont conçu et entraîné les modèles, et qui les ont partagés sur le hub Hugging Face.
Si vous voulez en savoir plus sur les transformers, je vous encourage à suivre le cours Hugging Face . Cela ne devrait pas vous prendre plus d'une journée, surtout si vous connaissez déjà le deep learning.
Dans le prochain article, nous verrons comment régler un transformer pour une tâche spécifique, grâce au transfer learning.
N'hésitez pas à me donner votre avis dans les commentaires ! Je répondrai à toutes les questions.
Et si vous avez aimé cet article, vous pouvez souscrire à ma newsletter pour être prévenu lorsque j'en sortirai un nouveau. Pas plus d'un mail par semaine, promis!
Rejoignez ma mailing list pour plus de posts et du contenu exclusif: