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)