An open API service indexing awesome lists of open source software.

https://github.com/antoinebendafischulmann/scrap_reviews_trend_poc


https://github.com/antoinebendafischulmann/scrap_reviews_trend_poc

faiss french nlp-machine-learning python rag retrieval-augmented-generation sentiment-analysis trend-analysis

Last synced: 16 days ago
JSON representation

Awesome Lists containing this project

README

          

# 📊 Analyse de Sentiment en Français et Synthùse des Tendances (hors ligne et sans aucun service externe)

Ce projet permet de **classer automatiquement des avis** en français (POSITIVE, NEGATIVE ou NEUTRAL) et de **générer des synthÚses rédigées** décrivant les tendances les plus fréquentes pour chaque sentiment, **sans dépendre de services externes** (tout se passe en local).

---

## Contexte

- **POSITIVE** 🟱 : avis globalement positif
- **NEGATIVE** 🔮 : avis globalement nĂ©gatif
- **NEUTRAL** 🟡 : avis plutĂŽt mitigĂ©/neutre

L’idĂ©e est de crĂ©er un *Proof of Concept* (poc) pour analyser des avis en français. On se base sur des avis Trustpilot, mais la mĂ©thode peut s’appliquer Ă  d’autres domaines.

### ModÚles & méthodes

- **CamemBERT** : un modÚle *transformers* spécialisé en français, qui comprend mieux la langue et les nuances.
- **Llama** : un grand modÚle de langage (LLM) qui rédige un paragraphe de synthÚse pour les avis positifs, négatifs et neutres.
- **KeyBERT & YAKE** : identifient les mots-clés récurrents (tendances) pour chaque catégorie (POSITIVE, NEGATIVE, NEUTRE).

---

## Prérequis

Avant de commencer, assurez vous d'avoir installé :
- **Python 3.12+**
- **Un environnement virtuel (`venv`)**

## Installation et Exécution

1ïžâƒŁ Cloner le projet

```bash
git clone https://github.com/AntoineBendafiSchulmann/scrap_reviews_trend_poc

```

2ïžâƒŁ CrĂ©er et activer l’environnement virtuel

```bash
# Sous Linux / Mac
source venv/bin/activate
# Sous Windows
venv\Scripts\activate
```

3ïžâƒŁ Installer les dĂ©pendances

```bash
pip install -r requirements.txt
```

4ïžâƒŁ ExĂ©cuter les scripts

- Récupérer les avis depuis Trustpilot pour un domaine particulier:

la commande doit entrée doit correspondre à ce format :

```bash
python scrape_trustpilot.py
```
exemple avec **cofidis.fr**

```bash
python -m src.scrape_trustpilot cofidis.fr
```
Le script va automatiquement parcourir les pages d’avis sur Trustpilot pour ce domaine et enregistrer chaque commentaire dans ```trustpilot_reviews.txt```, il suffit donc de passer le nom de domaine comme argument, le code continue donc la collecte tant qu’il trouve du contenu Ă  extraire pour le domaine indiquĂ© et s’arrĂȘte de lui-mĂȘme dĂšs qu’il n’y a plus aucun avis chargĂ© sur la page suivante.

- Pour classifier les avis :

```bash
python -m src.sentiment_camembert
```
(Assurez vous que le fichier d'avis brut ```trustpilot_reviews.txt``` est bien rempli de n'importe quelle maniĂšre avant de lancer le script.)

- Pour analyser les tendances et générer la synthÚse :

```bash
python -m src.sentiment_trend_analysis
```
Ce script utilise ```trustpilot_reviews_with_sentiment_camembert.txt```

## Organisation du projet
```bash
📩 scrap_reviews_trend_poc
┣ 📂 config
│ ┣ 📜 blacklist.json # Mots & expressions à ignorer ou filtrer
│ ┣ 📜 replace_map.json # Remplacements de certaines chaĂźnes de caractĂšres mal formulĂ©es
│ ┗ 📜 synonyms_map.json # Listes de synonymes pour unifier la forme de certaines tendances
┣ 📂 src
┣ 📜 scrape_trustpilot.py # RĂ©cupĂšre les avis en ligne (ex: cofidis.fr)
┣ 📜 sentiment_camembert.py # Classe chaque avis (POSITIVE, NEGATIVE, NEUTRAL) via CamemBERT
┣ 📜 sentiment_trend_analysis.py # Identifie les tendances & gĂ©nĂšre la synthĂšse (via KeyBERT, YAKE, Llama)
┣ 📜 trustpilot_reviews.txt # Avis bruts
┣ 📜 trustpilot_reviews_with_sentiment_camembert.txt # Avis classĂ©s par sentiment
┣ 📜 trustpilot_sentiment_trends.txt # Fichier final (rĂ©partition, tendances, synthĂšses)
┣ 📜 requirements.txt
┗ 📜 README.md
```
## Format des fichiers

- ```trustpilot_reviews.txt``` : Avis bruts, un avis par ligne généré par le fichier ```scrape_trustpilot.py```

Exemple :

```bash
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 !
```

- ```trustpilot_reviews_with_sentiment_camembert.txt``` : Ajoute une colonne supplémentaire avec la catégorie de sentiment détecté : POSITIVE, NEGATIVE ou NEUTRAL.

Exemple :

```bash
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
```

## Comment ça marche ?

1. Scraper les avis

- ```Le script scrape_trustpilot.py``` peut aller sur Trustpilot (par ex. ```cofidis.fr```) et récupérer automatiquement les avis.
- Les avis sont enregistrés dans ```trustpilot_reviews.txt```

2. Classer les avis avec ``` CamemBERT```

- Le script ``` sentiment_camembert.py``` lit le fichier brut (``` trustpilot_reviews.txt``` ) et applique ``` CamemBERT``` pour dire si chaque avis est POSITIVE, NEGATIVE ou NEUTRAL.
- Il créé alors le fichier ```trustpilot_reviews_with_sentiment_camembert.txt``` .

3. Analyser les tendances & générer la synthÚse:

- Le script ```sentiment_trend_analysis.py``` :

- Détecte les tendances (mots-clés) avec ```KeyBERT``` et ```YAKE```.
- extraient des mots-clés de chacun des avis.
- on cumule tous ces mots-clés dans un ```Counter```, pour chaque sentiment.
- on ne garde que ceux qui apparaissent ≄3 fois, et qui ne sont pas dans la blacklist.

- Filtre (blacklist) pour supprimer les termes trop génériques

- RAG (Retrieval-Augmented Generation) via FAISS pour récupérer quelques extraits vraiment pertinents

- GĂ©nĂšre un paragraphe de synthĂšse avec ```Llama```, qui s’appuie sur ces extraits rĂ©els, au lieu d’inventer

- Le résultat se trouve dans ```trustpilot_sentiment_trends.txt```, avec :
- la répartition des avis (POSITIVE, NEGATIVE, NEUTRAL),
- les tendances trouvées,
- la synthÚse rédigée pour chaque sentiment.

## RAG (Retrieval-Augmented Generation) : Pourquoi et Comment ?

**But** : Permet d'amĂ©liorer la prĂ©cision des rĂ©ponses d'un modĂšle de langage en le forçant Ă  ne pas se baser uniquement sur sa donnĂ©e d'entraĂźnement et ainsi Ă©viter que le modĂšle “invente” des informations. Nous voulons qu’il s’appuie sur **des extraits rĂ©els** dans les avis.

Comme dans cet autre projet : https://github.com/AntoineBendafiSchulmann/deaplearning_exploration oĂč grĂące Ă  ce processus, les rĂ©ponses sont plus prĂ©cises, actualisĂ©es et adaptĂ©es aux documents fournis spĂ©cifiquement sur la tarte aux pommes.

1. **Découper les avis en segments (chunks)**
- Par exemple, si vous avez un avis :
> "J’ai demandĂ© un prĂȘt chez Cofidis. Le service a Ă©tĂ© trĂšs rapide. L’argent a Ă©tĂ© dĂ©bloquĂ© en 2 jours."
- On peut le couper en 2 segments :
1. "J’ai demandĂ© un prĂȘt chez Cofidis"
2. "Le service a Ă©tĂ© trĂšs rapide. L’argent a Ă©tĂ© dĂ©bloquĂ© en 2 jours"

2. **Encoder ces segments en vecteurs (embeddings)**
- Un modÚle comme `sentence-transformers/all-mpnet-base-v2` va transformer chaque phrase/segment en une représentation mathématique (un **vecteur**).
- Exemple : le segment `"Le service a Ă©tĂ© trĂšs rapide. L’argent a Ă©tĂ© dĂ©bloquĂ© en 2 jours"` sera converti en un tableau de nombres, par ex. `[0.12, -0.45, 0.88, 
]`.

3. **Indexation dans FAISS**
- On stocke tous ces vecteurs (de tous les avis) dans un **index FAISS**.
- FAISS sait **retrouver rapidement** lesquels sont proches ou similaires entre eux.

4. **Recherche des extraits pertinents (Retrieval)**
- Quand on veut synthétiser la tendance `"prise en charge"`, on encode `"prise en charge"` en vecteur, par ex. `[0.03, -0.22, 0.54, 
]`.
- On demande à FAISS : “Quels segments sont les plus proches de ce vecteur ?”
- FAISS renvoie 2 ou 3 segments d’avis qui parlent clairement de “prise en charge” ou de sujets proches.

5. **Génération de texte (Augmented Generation)**
- On prend ces segments trouvĂ©s et on les assemble sous forme d’un “contexte”.
- On donne ce contexte + un prompt (instructions) au modĂšle Llama.
- Llama produit alors un **paragraphe** qui décrit la tendance `"prise en charge"` **en se basant** sur le contenu réel des avis retournés par FAISS.

**GrĂące Ă  ce systĂšme**, le modĂšle :
- Ne part pas de zéro.
- Ne se base pas uniquement sur sa “mĂ©moire interne”.
- Il lit des extraits concrets trouvés via ```FAISS```.

C’est ce qu’on appelle **Retrieval-Augmented Generation (RAG)** :
1. **Retrieval** (récupérer des extraits utiles dans ```FAISS```),
2. **Augmented Generation** (le modĂšle ```Llama``` s’appuie sur ces extraits pour rĂ©diger une synthĂšse rĂ©aliste).

Résultat : une **synthÚse** plus réaliste, **ancrée dans les vrais avis**.

## ParamÚtres de génération

on peut par ailleurs utiliser des paramÚtres de génération servant à "canaliser la créativité" de ```Llama```

- ```temperature```: rend le texte moins aléatoire, plus concis
- ```top_p```: filtre les mots trop rares et empĂȘche le modĂšle de partir dans des phrases extravagantes
- ```repetition_penalty```: pénalise la répétition de tokens, pour éviter de se répéter, de radoter

## Exemple de Résultat

```bash
Répartition des sentiments :
Positifs : 19950 avis (92.30%)
Négatifs : 1247 avis (5.77%)
Neutres : 417 avis (1.93%)

**SynthĂšse des avis positifs :**
La société propose une prise en charge efficace et rapide pour les demandes financiÚres, avec un traitement expeditif des dossiers qui permet le déblocage des fonds rapidement. Les clients apprécient la qualité de service ...

**Tendances extraites (positif) :**
- prise en charge
- traitement du dossier
- déblocage des fonds

**SynthÚse des avis négatifs :**
Les clients ont exprimé leur insatisfaction avec divers aspects de leurs expériences avec Cofidis.De nombreux utilisateurs ont également signalé des problÚmes liés aux versements ...

**Tendances extraites (négatif) :**
- fois sans frais
- déblocage des fonds
- manque de respect

**SynthĂšse des avis neutres :**
Le dossier a été traité avec rapidité, la procédure s est déroulée dans les délais convenus, il y a eu une bonne mise en relation entre le client et le service concerné...

**Tendances extraites (neutre) :**
- traitement du dossier
- accord de principe

```

## Avantages / Limitations

Avantages

- Tout est en local (off-line), pas besoin de services externes.
- CamemBERT gÚre le français et ses nuances.
- ```Llama``` peut écrire un court paragraphe décrivant les points clés (positifs, négatifs, neutres).

Limitations

- Sur CPU, ```Llama``` + ```FAISS``` peut ĂȘtre lent pour un large volume d’avis.
- La blacklist et les rĂ©glages de ```KeyBERT/YAKE``` peuvent demander un ajustement pour filtrer certains mots-clĂ©s “inutiles” ou Ă©tranges.
- Si les avis sont trÚs mal écrits, le modÚle peut se tromper.

## 🔗 Liens

- Hugging Face 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
- ```DistilCamemBERT``` (pré-entraßné sur du texte spécifique à l'analyse de sentiment ): https://huggingface.co/cmarkea/distilcamembert-base-sentiment/tree/main
- ```Llama 3.2 - 3B Instruct``` (pré-entraßné sur du texte général en français): https://huggingface.co/meta-llama/Llama-3.2-3B-Instruct/tree/main
- Trouver automatiquement les mots-clĂ©s d’un texte en s’appuyant sur des modĂšles pour identifier des mots-clĂ©s en fonction de leur contexte et de leur signification, plutĂŽt que de se baser uniquement sur des statistiques simple ```KeyBERT``` https://github.com/MaartenGr/KeyBERT
- RepĂšrer les termes clĂ©s d’un texte en se basant sur la frĂ©quence et la position des mots avec ```YAKE``` https://github.com/LIAAD/yake
- Pour transformer des phrases en vecteurs numérique ```sentence-transformers/all-mpnet-base-v2``` https://huggingface.co/sentence-transformers/all-mpnet-base-v2
- ```FAISS``` stocke des “reprĂ©sentations mathĂ©matiques” (vecteurs) et peut rapidement repĂ©rer lesquels sont les plus proches, pour retrouver les passages les plus semblables dans un grand ensemble de donnĂ©es. https://github.com/facebookresearch/faiss