Chargement du modèle pré-entraîné¶
In [1]:
#version de Python
import sys
sys.version
Out[1]:
'3.10.15 | packaged by conda-forge | (main, Oct 16 2024, 01:15:49) [MSC v.1941 64 bit (AMD64)]'
In [2]:
#version
import transformers
transformers.__version__
Out[2]:
'4.46.3'
In [3]:
# charger le modèle pré-entraîné, attention, temps long la première fois
# le fichier est mis en cache en suite cf. sur le disque dur /user/.cache
from transformers import pipeline
# c'est le modèle par défaut si on ne spécifie rien dans "model"
# https://huggingface.co/distilbert/distilbert-base-uncased-finetuned-sst-2-english
# le choix du modèle pré-entraîné pèse forcément sur les performances
# environnement avec PyTorch backend ici
sentiment = pipeline("sentiment-analysis",
model='distilbert-base-uncased-finetuned-sst-2-english')
Quelques essais avec sentiment¶
In [4]:
# phrase plutôt négative
sequence_to_classify = "You are so bad, I hate you"
sentiment(sequence_to_classify)
Out[4]:
[{'label': 'NEGATIVE', 'score': 0.9997342228889465}]
In [5]:
# phrase plutôt positive
sentiment("You are beautiful, I like to see you.")
Out[5]:
[{'label': 'POSITIVE', 'score': 0.9998706579208374}]
In [6]:
# tout dépend d'un terme
sentiment("You are as calm as Borg.")
Out[6]:
[{'label': 'NEGATIVE', 'score': 0.9441853165626526}]
In [7]:
# tout dépend d'un terme - j'hallucine un peu quand-même
sentiment("You are as calm as McEnroe.")
Out[7]:
[{'label': 'POSITIVE', 'score': 0.9836896061897278}]
Comportement sur IMDB Reviews¶
Chargement et inspection de la base¶
In [8]:
# changement de dossier
import os
os.chdir("C:/Users/ricco/Desktop/demo")
# chargement et infos
import pandas
df = pandas.read_excel("imbd_reviews_100.xlsx")
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 100 entries, 0 to 99 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 avis 100 non-null object 1 commentaires 100 non-null object dtypes: object(2) memory usage: 1.7+ KB
In [9]:
# premières lignes
# on va traiter du texte brut, sans pré-traitement (nettoyage, harmonisation casse, etc.)
df.head()
Out[9]:
avis | commentaires | |
---|---|---|
0 | like | Panic in the Streets is a fairly unknown littl... |
1 | like | I'm writing this 9 years after the final episo... |
2 | like | I find this movie the best movie I have ever s... |
3 | dislike | While Bondarchuk was by no means a young man w... |
4 | dislike | Oh, man! This thing scared the heck out of me ... |
In [10]:
# distribution des classes
df.avis.value_counts(normalize = True)
Out[10]:
avis like 0.51 dislike 0.49 Name: proportion, dtype: float64
In [11]:
# essai sur le premier document
sentiment(df.commentaires.iloc[0])
Out[11]:
[{'label': 'POSITIVE', 'score': 0.9980514049530029}]
Analyse des commentaires¶
In [12]:
# pas besoin de train/test ici puisque pas d'apprentissage
# passer en revue les documents et obtenir le classement
# attention, pas très rapide
predictions = []
for doc in df.commentaires:
# /!\ attention, si le document est trop long, erreur
texte = doc
if (len(texte) > 512):
#prendre seulement les 512 premiers caractères
texte = texte[:512]
# appliquer le modèle
pred = sentiment(texte)
# rendre sentiment compatible avec notre étiquette
if (pred[0]['label'] == 'POSITIVE'):
predictions.append('like')
else:
predictions.append('dislike')
#transformer en vecteur numpy
import numpy
predictions = numpy.asarray(predictions)
#affichages de premières prédiction
predictions[:10]
Out[12]:
array(['like', 'dislike', 'like', 'dislike', 'dislike', 'like', 'like', 'like', 'dislike', 'dislike'], dtype='<U7')
In [13]:
# matrice de confusion
pandas.crosstab(df.avis,predictions)
Out[13]:
col_0 | dislike | like |
---|---|---|
avis | ||
dislike | 39 | 10 |
like | 11 | 40 |
In [14]:
# soit en accuracy
numpy.mean(df.avis.values == predictions)
Out[14]:
np.float64(0.79)