Traitement du langage naturel avec Transformers

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.