Corpus 1 · le marché
Ce qu'on a fait pour constituer le corpus, et ce qu'on a obtenu. Périmètre : États-Unis, Google Play + Apple App Store.
Datasheet · 2026-07-08 21:56Appendice › Le marché
01_discover.py. Côté Google Play : recherche HTML par lexique santé maison
(fitness, sleep, glucose, therapy…), puis expansion en boule de neige par le graphe « apps similaires »
de chaque fiche — on suit les recommandations du store jusqu'à épuisement. Côté Apple : API de
recherche iTunes sur les mêmes mots-clés + flux RSS des classements par genre (Health & Fitness,
Medical). Chaque app garde sa méthode de découverte en base (colonne method) :
04_scrape_appmeta.py. Pour chaque app : fiche complète (description, résumé, éditeur,
genre, prix, classification d'âge, dates de sortie/MAJ, notes de version), permissions déclarées
(Google Play, permissions_json) et étiquettes de confidentialité (Apple,
privacy_json : données collectées, liées à l'identité, servant au pistage). Les métriques
volatiles (note, nombre d'avis, installs) sont instantanéisées à chaque passage
(table app_metrics) plutôt qu'écrasées.02_classify_mhealth.py + 03_resolve_scope.py. Le genre déclaré du store est
faillible (des jeux se rangent en « Health & Fitness ») : on classe donc par similarité sémantique
contrastive — la description de chaque app est comparée à des textes-concepts « santé mobile » vs
« non-santé », et le différentiel décide. Le seuil est figé dans in_scope (réversible, rien
n'est supprimé). Puis audit manuel complet de la frontière (07/08_curate_scope*.py) :
109 faux positifs retirés (jeux, réveils, prépa d'examens, vétérinaire…), 33 faux négatifs repêchés
(grossesse, santé mentale, nutrition), chaque décision tracée avec sa raison
(apps.scope_reason).link_stores.py + 05_resolve_links.py. Cascade du plus sûr au plus flou :
1) domaine inversé du site éditeur (déterministe — même domaine des deux côtés = même produit) ;
2) éditeur + nom normalisés ; 3) similarité de nom ; 4) similarité de description
par embeddings pour départager les ambigus. Les liens incertains passent par une UI de validation
manuelle (validate_links.py). Bilan : 561 liens évalués, 338
confirmés, 182 produits présents sur les deux stores — ce qui permet les comparaisons
Play/Apple à produit constant.06_scrape_reviews.py. Les bibliothèques publiques étant cassées, la collecte repose sur
une bibliothèque Google Play patchée (le search() upstream ne fonctionnait plus) et un
client Apple amp-api maison (jeton public du site web App Store). Le scraper est reprenable
(curseur de pagination persisté), résilient aux erreurs réseau (backoff), et protégé par un verrou
mono-instance. Ordre de passage : apps jamais scrapées d'abord, puis rafraîchissement des plus
anciennes. ⚠ Apple a changé l'acquisition du jeton mi-2026 : les 196 086 avis App Store
déjà collectés sont conservés, la collecte Apple est en pause.db.py, calqué sur les recommandations de Boegershausen et al. (2022) :
74 732 réponses d'API brutes conservées verbatim (compressées zlib) pour pouvoir
re-parser et trianguler ; 74 735 requêtes journalisées (URL, horodatage, statut HTTP —
repérage des 429/échecs) ; 16 runs avec snapshot de config et versions d'outils ;
déduplication non destructive des avis (first_seen/last_seen/
times_seen) pour détecter éditions et suppressions entre extractions. Chaque ligne parsée
porte sa provenance (run, URL, méthode, rang).09_embed_reviews.py. Déduplication exacte des textes (casse/espaces neutralisés) :
6 395 507 textes distincts (68 % des avis — le reste
est dupliqué, typiquement des avis courts identiques). Encodage par 4 modèles de familles
indépendantes (architectures et équipes différentes) pour la réplication croisée :
Qwen/Qwen3-Embedding-4B — Qwen3 (decoder-LLM) · dim 1024 · 13.2 GoBAAI/bge-m3 — BGE (BAAI) · dim 1024 · 13.2 Gointfloat/e5-large — E5 (XLM-R) · dim 1024 · 13.2 Gosentence-transformers/all-MPNet-base-v2 — MPNet / SBERT · dim 768 · 9.9 Go
float16 mémap. QC : vecteurs unitaires, aucune corruption,
voisinages sémantiques cohérents sur sondes manuelles.Le filtrage mHealth est automatique (classification sémantique) — traçable et réversible, pas de tri manuel arbitraire.
Détail par store — Google Play : 2 356 → 1 067 · Apple : 822 → 734.
| Google Play — recherche par mots-clés + boule-de-neige (apps similaires) | 2 356 |
| App Store — classements par genre (flux RSS) | 520 |
| App Store — recherche iTunes (mots-clés) | 302 |
Cliquez pour déplier chaque volet.
| Champ | Couverture |
|---|---|
| Nom | |
| Éditeur | |
| Description | |
| Genre / catégorie | |
| Version courante | |
| Classification d'âge | |
| Prix | |
| Date de sortie | |
| Dernière MAJ | |
| Note moyenne | |
| Nb d'avis (compteur store) |
Permissions = Google Play ; confidentialité = Apple. Couverture rapportée par rapport au store concerné.
| Champ | Store | Couverture |
|---|---|---|
| Permissions déclarées | Google Play | |
| Résumé court (summary) | Google Play | |
| Nb d'installations réel | Google Play | |
| Étiquettes de confidentialité | Apple App Store | |
| Notes de version (si publiées) | les deux stores |
Liaison inter-stores : 1 801/1 801 apps rattachées à un identifiant produit ; 182 produits sur les deux stores.
| 1–9 avis | |
| 10–49 avis | |
| 50–199 avis | |
| 200–999 avis | |
| 1 000–9 999 avis | |
| 10 000+ avis | |
| Total ≥ 1 avis | 1 678 |
Médiane 385 · moyenne 5 568 · max 663 184 (MyFitnessPal).
| Couverture temporelle | 2008-07-31 → 2026-07-06 |
| Textes distincts (dédup) | 6 395 507 (68 %) |
| Apps sans aucun avis | 123 / 1 801 |
| Percentiles (p25/p75/p90) | 49 / 723 / 7 021 |
Asymétrie assumée : Apple plafonne les avis (~500/app/pays) → volume Apple faible (2.1 % du total). L'analyse de texte portera surtout sur Google Play.
| Élément conservé | Volume |
|---|---|
| Réponses d'API brutes conservées (compressées) | 74 732 |
| Requêtes journalisées (URL, horodatage, statut) | 74 735 |
| Runs de collecte (config + versions d'outils) | 16 |
| Instantanés de métriques d'apps | 3 910 |
| Liens inter-stores évalués (dont 338 confirmés) | 561 |
Chaque donnée exploitée remonte à sa réponse d'API d'origine (compressée, horodatée). Base : 11.1 Go. Aucune donnée brute écrasée.
Familles indépendantes (architectures/équipes différentes) pour une réplication croisée. QC validé (vecteurs unitaires, voisinages cohérents).
| Modèle | Famille | Dim. | Taille |
|---|---|---|---|
Qwen/Qwen3-Embedding-4B | Qwen3 (decoder-LLM) | 1024 | 13.2 Go |
BAAI/bge-m3 | BGE (BAAI) | 1024 | 13.2 Go |
intfloat/e5-large | E5 (XLM-R) | 1024 | 13.2 Go |
sentence-transformers/all-MPNet-base-v2 | MPNet / SBERT | 768 | 9.9 Go |
apps.scope_reason).