Ce projet offre la possibilité de classer des commentaires de clients francophones en trois catégories :
- POSITIVE 🟢 : Un avis globalement positif
- NEGATIVE 🔴 : Un avis globalement négatif
- NEUTRAL 🟡 : Un avis mitigé/neutre
L’objectif est de créer un proof of concept (poc) pour l'analyse d'avis automatique en français. Dans cet exemple, j'ai choisi des critiques de restaurants/d'entreprises et leur attribuer automatiquement une catégorie de sentiment.
Ce projet s'appuie sur les modèles suivants :
- TextBlob-fr, une bibliothèque NLP basé sur des mots-clés et un dictionnaire.
- CamemBERT modèle transformers , est plus apte à traiter les phrases nuancées.
Avant de commencer, assurez vous d'avoir installé :
- Python 3.12+
- Un environnement virtuel (
venv
)
1️⃣ Cloner le projet
git clone https://github.com/AntoineBendafiSchulmann/scrap_reviews_trend_poc
2️⃣ Créer et activer l’environnement virtuel
source venv/bin/activate
venv\Scripts\activate
3️⃣ Installer les dépendances
pip install -r requirements.txt
4️⃣ Lancer l’analyse des avis
python -m src.sentiment...
(Assurez vous que reviews_output.txt
est bien rempli de n'importe quelle manière avant de lancer le script.)
📦 scrap_reviews_trend_poc
┣ 📂 src
┃ ┣ 📜 sentiment[nom du model].py # Script d'analyse de sentiment avec un modèle choisi (TextBlob-fr, CamemBERT)
┃ ┗ 📜 utils.py # Fonctions auxiliaires
┣ 📜 reviews_output.txt # Fichier contenant les avis à analyser ici rempli avec de l'API Yelp mais on peut le remplir avec n'importe quoi
┣ 📜 reviews_with_sentiment.txt # Résultats de l'analyse
┣ 📜 requirements.txt # Liste des dépendances
┗ 📜 README.md
🔹 Fichier d’entrée (reviews_output.txt
) (je pense que son format va bouger)
Chaque ligne représente un avis et contient 7 colonnes séparées par des tabulations (\t
) :
ID_RESTAURANT ALIAS NOM NOTE_RESTO ID_REVIEW NOTE_REVIEW TEXTE_AVIS
Exemple :
A1b2C3d4E5f6 chez-mamie-louise-lille Chez Mamie Louise 4.2 00000000-0000-0000-0000-000000000032 0 Gros plus : le coin bibliothèque où on peut feuilleter de vieux magazines en attendant nos plats, c’est sympa !
🔹 Fichier de sortie (reviews_with_sentiment.txt)
Ajoute une colonne supplémentaire avec la catégorie de sentiment détecté :
A1b2C3d4E5f6 chez-mamie-louise-lille Chez Mamie Louise 4.2 00000000-0000-0000-0000-000000000032 0 Gros plus : le coin bibliothèque où on peut feuilleter de vieux magazines en attendant nos plats, c’est sympa ! POSITIVE
Après avoir exécuté la prédiction de sentiment par exemple avec le modèle textblob_fr
avec la commande suivante :
python -m src.sentiment_textblob_fr
Sortie attendue :
DEBUG: 124 lignes lues dans reviews_output.txt
DEBUG: Avis → "Ce restaurant est un petit bijou ! La vue sur la mer est à couper le souffle..." | Sentiment détecté → POSITIVE
DEBUG: Avis → "J’espérais mieux après avoir lu les avis. Le serveur était peu souriant..." | Sentiment détecté → NEGATIVE
✅ Succès: 124 avis analysés et écrits dans `reviews_with_sentiment.txt`.
-
Les avis très positifs sont bien détectés → (POSITIVE)
- "Les produits frais dans l’assiette." → POSITIVE ✅
- "Les portions sont généreuses, parfaites pour les gros appétits !" → POSITIVE ✅
- "Le serveur a su nous raconter l’histoire des lieux, rendant l’expérience encore plus authentique." → POSITIVE ✅
-
Les avis clairement négatifs sont bien classés → (NEGATIVE)
- "Le dessert au citron avait un goût chimique, j’ai été franchement déçue. Dommage car le reste était bon." → NEGATIVE ❌
- "Je ne comprends pas l’engouement. Les plats étaient tièdes et le vin rouge pas assez aéré." → NEGATIVE ❌
- "Très déçue par le manque de propreté : la table collait et le sol n’avait pas l’air très net." → NEGATIVE ❌
-
Les avis mitigés sont en NEUTRAL, ce qui peut être encore amélioré :
- "L’ambiance est cosy, la déco soignée." → NEUTRAL
(ça pourrait être POSITIVE mais le modèle a un peu du mal avec ce genre de phrases descriptives qui ne sont pas très précises sur le sentiment)
- "C’est un lieu agréable, mais pas inoubliable." → NEUTRAL ✅
- "On a attendu un peu, mais le repas était bon." → NEUTRAL ✅ (OK compréhensible l'avis présente une nuance positif/négatif)
- Des nuances et contradictions : "Le repas était bon, mais le service trop lent."
- Des expressions complexes : "Je m'attendais à mieux..." → Ce n'est pas 100% négatif.
- Des mots ambigus : "Service correct" peut être neutre ou négatif, selon le ton.
👉 Un modèle transformers
comme CamemBERT
comprend ces subtilités, alors que TextBlob-fr
se base uniquement sur un dictionnaire de mots-clés.
Cas 1 : phrase avec une nuance entre positif et négatif
📌 Phrase : "Le plat était délicieux, mais le service trop lent."
TextBlob-fr
: POSITIVE (à cause de "délicieux") ❌CamemBERT
: NEUTRAL ✅
Cas 2 : phrase idiomatique (expressions imagées) difficile à détecter
📌 Phrase : "Franchement, ce n'est pas fameux."
TextBlob-fr
: NEUTRAL ( surrement parce qu'il ne comprend pas "pas fameux" comme négatif) ❌CamemBERT
: NEGATIVE ✅
Cas 3 : phrase présentant une ambiguïté entre les sentiments positifs et négatifs
📌 Phrase : "Mon plat de pâtes aux fruits de mer était savoureux. Quelques détails à peaufiner, mais c’est prometteur."
TextBlob-fr
: NEGATIVE (sans doute à cause du "mais") ❌CamemBERT
: POSITIVE ✅
Pour les cas, où les avis clients sont nuancés, longs, et complexes un modèle transformers
plus avancé comme CamemBERT
pourrait mieux gérer ça.
- Globalement, les résultats sont plus cohérents ✅
- Les cas évidents (bon/mauvais) sont bien classés ✅
- Mais les avis un peu nuancés sont parfois mal détectés ⚠
TextBlob-fr
reste un modèle basique basé sur des mots-clés et un lexique.
📌 Afin de chercher plus de précision, il a fallu essayer un modèle de NLP plus avancé, comme CamemBERT
parmis les transformers
.
Un modèle Transformer comme CamemBERT
comprend les subtilités le modèle s’appuie sur la probabilité des mots dans un contexte, alors que TextBlob-fr
se base uniquement sur un dictionnaire de mots-clés.
Le modèle a du mal avec certaines structures de phrases. Par exemple, la phrase :
"j'avais besoin rapide d'argent cela m'a dépannée très facilement"
a été classée NEGATIVE, alors qu'en réalité, elle exprime un sentiment positif.
Le modèle montre ses limites sur des phrases mal formulées ou ambiguës :
-
Syntaxe imparfaite → Mauvaise compréhension
- Les modèles
transformers
sont robustes mais parfois sensibles à des structures de phrase mal construites. - La phrase est ici est surrement moyenne grammaticalement parlant ("besoin rapide d'argent" au lieu de par exemple "j'avais rapidement besoin d'argent").
- Les modèles
-
Présence du mot "argent" et "besoin" → Possiblement mal influencé
- Dans beaucoup d’avis négatifs, "argent", "besoin", "problème financier" sont souventassociés à des expériences difficiles.
- Si le modèle a vu beaucoup de phrases du type "J'avais besoin d'argent, impossible d'obtenir un prêt, honteux !" au cours de son entraînement, il risque de mal interpréter cette phrase.
-
Pas de mot-clé explicitement positif dans l'avis
- Le modèle s’appuie sur la probabilité des mots dans un contexte.
- "Rapide" et "facilement" sont des mots généralement positifs.
- Cependant, "besoin rapide d'argent" est perçu par le modèle comme synonyme d' urgence ou de détresse, donc associé à un contexte négatif.
-
Contexte et ironie:
- Le modèle comprend pas bien le second degré ou l'ironie
lien de la bibliothèque TextBlob-fr
: https://github.com/sloria/textblob-fr
lien des modèles de transformers
: https://github.com/huggingface/transformers
lien du modèle CamemBERT
( pré-entraîné sur du texte général en français, mais pas spécifique à l'analyse de sentiment): https://huggingface.co/almanach/camembert-base/tree/main
lien du modèle DistilCamemBERT
(pré-entraîné sur du texte spécifique à l'analyse de sentiment ): https://huggingface.co/cmarkea/distilcamembert-base-sentiment/tree/main