File size: 6,594 Bytes
3d35cce
e7194cd
 
 
 
fddeb71
3d35cce
e7194cd
 
3d35cce
 
e7194cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fddeb71
 
 
 
 
 
e7194cd
fddeb71
 
 
 
e7194cd
fddeb71
e7194cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
---
title: GRAPP
emoji: 🍇
colorFrom: pink
colorTo: purple
sdk: static
pinned: false
license: mit
short_description: Choisir son vin sans se prendre la grappe
---

# 🍇 GRAPP — L'app pour choisir ton vin sans te prendre la grappe

> Même si t'y connais rien, GRAPP t'aide à trouver LE vin que tu kiffes, super facilement.

**Problème.** En 60 ans, la consommation de vin des Français a chuté de 70 %. Les jeunes trouvent le vin élitiste,
compliqué et intimidant (« c'est cher », « je préfère la bière », « au bar je commande une blonde, c'est plus facile »).
Devant une carte des vins de resto, ils ne savent pas quoi choisir. Le vin pèse pourtant 15 % de la production agricole
française en valeur, et 1 exploitation agricole sur 5 a une activité viticole.

**Solution.** GRAPP (concept et direction artistique : projet de fin d'études de Manon Thomas, M2 DA, ECV Paris 2025)
transforme la carte des vins en conseil personnalisé, sans jargon :

| Module | Ce que ça fait | IA utilisée |
|---|---|---|
| 🥂 **Tchin Tchin !** | 1) photo de la carte du resto → GRAPP repère les vins proposés et leurs prix ; 2) quiz en 7 questions ; 3) top 3 avec un **% de match** et le *pourquoi* | OCR Tesseract + correspondance floue ; recommandation hybride (profil + embeddings de phrases Hugging Face) |
| 💖 **Mes p'tits favoris** | Garde tes vins pépites et te propose des vins du même style | Similarité d'embeddings |
| 💡 **Dico Vino** | Pose ta question comme tu veux (« pourquoi ma bouche gratte ? ») → explication cool du mot (ici : tanins) | Recherche sémantique |

### Ce qui va au-delà du cours
- **Pipeline multimodal** : image → texte (OCR) → entités (vins) → recommandation.
- **Correspondance floue** robuste aux erreurs d'OCR (« Cétes du Rhone » → Côtes du Rhône, « ler Cru » → 1er Cru).
- **Recommandation hybride explicable** : score pondéré entre critères du quiz et similarité sémantique d'une phrase libre,
  avec les raisons affichées à l'utilisateur.
- **Modèle Hugging Face multilingue** (`paraphrase-multilingual-MiniLM-L12-v2`) avec **repli automatique** sur TF-IDF
  hors ligne : l'app tourne toujours.

---

## 📘 Guide d'utilisation

### 1. Installer (une seule fois)
Il faut **Python 3.10+**.

```bash
cd GRAPP
python -m venv .venv
source .venv/bin/activate          # Windows : .venv\Scripts\activate
pip install -r requirements.txt
```

Pour lire les photos de cartes, installer aussi le moteur **Tesseract** :
- macOS : `brew install tesseract tesseract-lang`
- Windows : installeur sur https://github.com/UB-Mannheim/tesseract/wiki
- Linux : `sudo apt install tesseract-ocr tesseract-ocr-fra`

> Sans Tesseract, tout marche sauf la lecture de photo : on colle alors le texte de la carte.
> Au premier lancement, le modèle Hugging Face (~470 Mo) se télécharge automatiquement.

### 2. Lancer
```bash
streamlit run app.py
```
L'app s'ouvre dans le navigateur (http://localhost:8501).

### 3. Utiliser
1. **Tchin Tchin !** → choisis *Photo*, *Carte d'exemple (démo)* ou *Coller le texte*, puis **Lire la carte**
   (ou « Pas de carte, on passe au quiz »).
2. Réponds aux **7 questions** (plan du jour, verre ou bouteille, couleur, bulles, sucre, corps, goûts, budget, envie en une phrase).
3. GRAPP affiche ton **top 3** avec le % de match. ❤️ pour garder un vin, 🔁 pour des vins du même style.
4. **Mes p'tits favoris** : tes vins enregistrés (dans `data/favoris.json`).
5. **Dico Vino** : tape un mot ou une question.

Scénario de démo conseillé pour la vidéo : *Carte d'exemple* → Apéro entre potes → bouteille → Rouge → Sans bulles →
Sec → Léger → Fruité, 30 € → « un truc frais avec de la charcuterie » ⇒ Chinon / Beaujolais-Villages en tête.

### 4. Vérifier que tout marche
```bash
python tests/test_grapp.py         # ou : python -m pytest -q
```

### 5. (Optionnel) Ajouter de vraies bouteilles notées — Kaggle
Télécharger `winemag-data-130k-v2.csv` depuis https://www.kaggle.com/datasets/zynicide/wine-reviews dans `data/`, puis :
```bash
python scripts/enrichir_kaggle.py
```
Chaque vin recommandé affiche alors les bouteilles réelles les mieux notées de son appellation.

### 6. Mettre l'app en ligne (lien public, gratuit)
**Hugging Face Space statique + stlite :** `index.html` lance le même `app.py` directement dans le navigateur
du visiteur grâce à [stlite](https://github.com/whitphx/stlite) (Streamlit compilé en WebAssembly via Pyodide). Pas de serveur, donc gratuit.
1. Sur https://huggingface.co → *New Space* → nom `grapp`, SDK **Static**.
2. *Files* → *Upload files* : glisse tout le contenu du dossier GRAPP (dossiers compris) → *Commit*.
3. Lien : `https://huggingface.co/spaces/<ton-pseudo>/grapp`.

Différences avec la version locale : pas de Tesseract dans le navigateur (la carte d'exemple utilise le texte déjà
extrait, `data/carte_exemple.txt` ; pour une autre carte, on colle son texte), et la recherche sémantique utilise le
mode TF-IDF. Pour la version complète en ligne : `Dockerfile` (Hugging Face Docker, payant) ou Streamlit Community Cloud
(gratuit, via GitHub, utilise `packages.txt`).

> En ligne, les favoris sont gardés le temps de la visite.

---

## 🗂️ Contenu du projet
```
app.py                       Interface Streamlit (charte graphique du dossier PFE)
grapp/engine.py              Moteur de recommandation, embeddings, Dico Vino
grapp/carte.py               OCR de la carte + correspondance floue + prix
data/vins.csv                75 profils de vins par appellation (couleur, bulles, sucre, corps, acidité, tanins, arômes, accords, prix)
data/dico.csv                34 définitions du Dico Vino
assets/carte_exemple.png     Carte des vins fictive pour la démo
scripts/build_dataset.py     Régénère data/vins.csv
scripts/generer_carte_exemple.py  Régénère la carte d'exemple
scripts/enrichir_kaggle.py   Enrichissement optionnel avec Wine Reviews (Kaggle)
tests/test_grapp.py          Tests automatiques
SOURCES.md                   Bibliothèques, modèles, données et sources citées
PROMPTS.md                   Où et comment l'IA générative a été utilisée, avec les prompts
```

## Limites
- La base contient des **profils typiques d'appellation** (75), pas chaque domaine : deux vins d'une même appellation peuvent différer.
- Les prix sont **indicatifs** (France, caviste) ; GRAPP utilise le prix de la carte quand il le lit.
- À consommer avec modération. L'abus d'alcool est dangereux pour la santé. App réservée aux 18 ans et plus.