Traitement du langage naturel avec Transformers#
Dans ce notebook, on utilise la bibliothÚque Transformers de Hugging Face pour le traitement du langage naturel (NLP). Les modÚles de langage les plus performants (GPT, Llama, etc.) sont trÚs gourmands en mémoire et souvent inutilisables sur un ordinateur portable. On se limite donc à des modÚles plus petits, mais moins performants.
ChatBot#
Lâutilisation la plus courante des modĂšles de langage (LLM) aujourdâhui est le ChatBot, un assistant virtuel qui rĂ©pond Ă nos questions. Avec Hugging Face, tu peux crĂ©er ton propre ChatBot en local comme suit.
On utilise une version allégée de BlenderBot de Meta (facebook/blenderbot-400M-distill).
Implémentation#
from transformers import pipeline
/home/aquilae/anaconda3/envs/dev/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
from .autonotebook import tqdm as notebook_tqdm
chatbot = pipeline(task="conversational",model="facebook/blenderbot-400M-distill")
Ce ChatBot ne comprend que lâanglais, donc pose-lui des questions en anglais.
from transformers import Conversation
user_message = """What is the best french deep learning course?"""
conversation = Conversation(user_message)
conversation = chatbot(conversation)
print(conversation)
No chat template is set for this tokenizer, falling back to a default class-level template. This is very error-prone, because models are often trained with templates different from the class default! Default chat templates are a legacy feature and will be removed in Transformers v4.43, at which point any code depending on them will stop working. We recommend setting a valid chat template before then to ensure that this model continues working without issues.
Conversation id: 44c34bd3-ea1b-44b6-bd54-9127133cc941
user: What is the best french deep learning course?
assistant: I'm not sure, but I do know that French is one of the most widely spoken languages in the world.
Comme tu peux le voir, le modÚle est mal entraßné et ne sait pas que le meilleur cours de Deep Learning est celui-ci.
Si tu veux poser une autre question, la commande suivante te donne la réponse en une seule ligne de code.
conversation=Conversation("What is the most tasty fruit?")
print(chatbot(conversation))
Conversation id: d258da22-78e4-4621-a0e1-90776454a595
user: What is the most tasty fruit?
assistant: I would have to say watermelon. It is so juicy and juicy.
Si tu veux continuer la conversation, utilise cette fonction.
# Il faut spécifier le rÎle (user) et ajouter votre message dans la conversation déjà existante
conversation.add_message({"role": "user","content": """What else do you recommend?"""})
print(chatbot(conversation))
Conversation id: c3e1a64c-5b40-4808-8632-38d9df14ed9d
user: What is the most tasty fruit?
assistant: I would have to say watermelon. It is so juicy and juicy.
user: What else do you recommend?
assistant: I would say mangos are pretty good too. They are sweet and tangy.
Tu sais maintenant comment utiliser un ChatBot avec la bibliothĂšque Transformers de Hugging Face.
Traduction#
On va maintenant voir comment implĂ©menter un traducteur. On utilise le modĂšle No Language Left Behind de Facebook (facebook/nllb-200-distilled-600M), qui permet de traduire Ă partir de nâimporte quelle langue. Par souci de mĂ©moire, on utilise une version allĂ©gĂ©e du modĂšle.
Implémentation#
traducteur = pipeline(task="translation",model="facebook/nllb-200-distilled-600M")
text = """Le meilleur cours de d'apprentissage profond est celui-ci."""
text_translated = traducteur(text,src_lang="fra_Latn",tgt_lang="eng_Latn")
print("Le texte en anglais : ", text_translated[0]["translation_text"])
text_translated = traducteur(text,src_lang="fra_Latn",tgt_lang="jpn_Jpan")
print("Le texte en japonais : ",text_translated[0]["translation_text"])
Le texte en anglais : The best course of deep learning is this one.
Le texte en japonais : æ·±ăćŠçżăźæé«ăźăłăŒăčăŻăăă§ă
La traduction est trĂšs bonne (pour lâanglais en tout cas, je nâai pas lâexpertise pour le japonais !). Tu peux aussi tester dâautres combinaisons de langues en spĂ©cifiant le bon code, que tu trouves sur cette page.
Résumé de texte#
Une autre tĂąche utile en NLP est le rĂ©sumĂ© de texte. Le modĂšle doit ĂȘtre capable dâextraire les informations les plus importantes dâun texte. On utilise pour cela le modĂšle BART de Facebook (facebook/bart-large-cnn).
resumeur=pipeline(task="summarization",model="facebook/bart-large-cnn")
text= "Troyes is a beautiful city. Troyes is a commune and the capital of the department of Aube in the Grand Est region of north-central France. It is located on the Seine river about 140 km (87 mi) south-east of Paris. Troyes is situated within the Champagne wine region and is near to the Orient Forest Regional Natural Park.Troyes had a population of 61,996 inhabitants in 2018. It is the center of the Communauté d'agglomération Troyes Champagne Métropole, which was home to 170,145 inhabitants."
summary = resumeur(text,min_length=10,max_length=100)
print("Le résumé du texte : ",summary[0]["summary_text"]) #["summary_text"]
Le résumé du texte : Troyes is a commune and the capital of the department of Aube in the Grand Est region of north-central France. It is located on the Seine river about 140 km (87 mi) south-east of Paris. Troyes had a population of 61,996 inhabitants in 2018.
Le rĂ©sumĂ© nâest pas parfait, car il sâagit dâun petit modĂšle, mais il a tout de mĂȘme rĂ©ussi Ă extraire les informations clĂ©s et Ă supprimer les Ă©lĂ©ments âmoins importantsâ.
Embedding de phrase#
Un aspect important du NLP quâon a vu dans le cours est lâembedding. Rappel : cela consiste Ă projeter nos tokens (mots ou caractĂšres, par exemple) dans un espace latent. Cela permet de rapprocher des mots semblables. Des mots proches comme âchiensâ et âchatsâ seront proches dans lâespace latent, tandis que âchienâ et âestâ seront Ă©loignĂ©s. On peut utiliser ces embeddings pour calculer la similaritĂ© entre deux phrases. Pour cela, on utilise la bibliothĂšque sentence_transformers, qui permet dâextraire lâembedding Ă partir dâun modĂšle prĂ©-entraĂźnĂ©.
On utilise le modĂšle all-MiniLM-L6-v2.
from sentence_transformers import SentenceTransformer
from sentence_transformers import util
model = SentenceTransformer("all-MiniLM-L6-v2")
On va regarder la similarité entre différentes phrases.
sentences1 = ['The cat is chasing the mouse','A man is watching the television','The latest movie is awesome']
sentences2 = ['The dog sleeps in the kitchen','A boy watches TV','The new movie is so great']
embeddings1 = model.encode(sentences1, convert_to_tensor=True)
embeddings2 = model.encode(sentences2,convert_to_tensor=True)
cosine_scores = util.cos_sim(embeddings1,embeddings2)
for i in range(len(sentences1)):
print("{} \t\t {} \t\t Score: {:.4f}".format(sentences1[i],
sentences2[i],
cosine_scores[i][i]))
The cat is chasing the mouse The dog sleep in the kitchen Score: 0.0601
A man is watching the television A boy watches TV Score: 0.7207
The latest movie is awesome The new movie is so great Score: 0.7786
Comme tu peux le voir, les phrases proches en sens ont des embeddings assez similaires. Ce modĂšle est donc intĂ©ressant pour extraire des embeddings. Avoir un bon modĂšle extracteur dâembeddings est souvent une premiĂšre Ă©tape dans un projet de NLP.