Regroupement de requêtes : Similarité tous-à-tous avec traitement par lots

Cet article explique comment nous regroupons les requêtes de recherche en groupes sémantiques en utilisant une comparaison de similarité cosinus tous-à-tous avec un traitement par lots pour l'efficacité mémoire.

Le problème : Regrouper des requêtes similaires

Les utilisateurs recherchent la même chose de nombreuses façons :

  • "mini pc"

  • "petit ordinateur"

  • "ordinateur de bureau compact"

  • "pc miniature"

Ces requêtes devraient mener à la même page. Nous devons regrouper les requêtes sémantiquement similaires afin de pouvoir :

  • Créer une page de requête par groupe

  • Consolider le trafic entre les recherches similaires

  • Éviter le contenu dupliqué

  • Améliorer le SEO en se concentrant sur les groupes à fort trafic

Avec de grands volumes de requêtes, nous avons besoin d'un algorithme de regroupement efficace qui trouve les meilleures correspondances sans épuiser la mémoire.

L'algorithme : Comparaison tous-à-tous par lots

Nous utilisons une comparaison de similarité tous-à-tous où chaque requête est comparée à toutes les autres requêtes pour trouver sa meilleure correspondance. Pour éviter l'épuisement de la mémoire avec un grand nombre de requêtes, nous traitons le processus par lots.

Étape 1 : Chargement des embeddings

Nous chargeons en mémoire des embeddings pré-calculés. Chaque requête est représentée comme un vecteur de dimension fixe provenant d'un modèle de sentence transformer.

Étape 2 : Traitement par lots

Nous traitons les requêtes par lots pour éviter le débordement mémoire. Chaque lot calcule les scores de similarité cosinus entre ses requêtes et toutes les requêtes disponibles. En itérant à travers les lots, chaque requête est comparée à toutes les autres sans charger toutes les similarités en mémoire simultanément.

Étape 3 : Trouver la meilleure correspondance

Pour chaque requête dans le lot, nous identifions sa meilleure correspondance parmi toutes les requêtes. La requête avec le score de similarité le plus élevé devient le centre du groupe. Si la similarité est inférieure au seuil configuré, la requête reste non regroupée pour le moment.

Étape 4 : Groupes singletons

Après la fin de tous les lots, toute requête qui n'a pas été assignée à un groupe devient un groupe singleton (un groupe ne contenant qu'elle-même). Cela garantit que chaque requête appartient à exactement un groupe.

Seuil configurable

Le seuil de similarité détermine la rigueur du regroupement :

  • Seuil plus élevé : Seules les requêtes avec une similarité cosinus au-dessus de cette valeur rejoignent le même groupe ; cela donne plus de groupes avec un regroupement sémantique plus serré.

  • Seuil plus bas : Les requêtes avec des scores de similarité plus faibles sont regroupées ensemble ; cela donne moins de groupes, plus grands, avec une couverture sémantique plus large.

Le seuil est configuré dans le fichier de configuration de l'application et peut être ajusté sans changer le code.

Classement des groupes

Les groupes sont classés par score de trafic total provenant des impressions et clics de Google Search Console. Pour chaque groupe, la somme des scores de trafic de toutes les requêtes membres détermine son classement. Les groupes à fort trafic obtiennent la priorité pour la génération de pages de requête.

Format de sortie

Le regroupement produit un fichier JSON avec des statistiques et des données de groupe :

{
  "stats": {
    "threshold": "configured_value",
# ... (détails d'implémentation omis)

Les groupes sont triés par score total (trafic le plus élevé en premier).

Efficacité mémoire

L'approche par lots maintient une utilisation mémoire gérable en traitant les requêtes par morceaux plutôt qu'en calculant toutes les similarités en une fois. Cela réduit les structures de données intermédiaires nécessaires pendant le calcul.

Au lieu de créer une matrice de similarité complète (num_requêtes × num_requêtes), nous calculons un lot à la fois :

  • Mémoire par lot : Seulement le lot actuel plus le tableau complet des embeddings sont en mémoire

  • Réduction de la mémoire : Le traitement par lots réduit la taille des matrices temporaires en traitant un sous-ensemble plus petit par itération

  • Compromis : Légèrement plus de calcul (lecture des embeddings plusieurs fois) mais une utilisation mémoire de pointe significativement plus faible

La taille des lots est configurable, permettant un ajustement basé sur la mémoire système disponible. Des lots plus grands réduisent le nombre d'itérations mais augmentent l'utilisation mémoire ; des lots plus petits utilisent moins de mémoire mais nécessitent plus d'itérations.

Filtrage par liste noire

Avant le regroupement, nous filtrons les requêtes sur liste noire (noms de marque, concurrents, termes non pertinents). Cela réduit le bruit et améliore la qualité des groupes.

La liste noire est maintenue séparément et vérifiée pendant le chargement des requêtes.

Regroupement incrémental

Lorsque de nouvelles requêtes arrivent, nous ne regroupons pas tout à nouveau :

  1. Charger les groupes existants
  2. Créer les embeddings des nouvelles requêtes
  3. Comparer les nouvelles requêtes aux centres des groupes existants
  4. Assigner au groupe correspondant le mieux ou créer un nouveau groupe
  5. Reclasser les groupes selon les scores mis à jour

Cette approche incrémentale ne traite que les nouvelles données, économisant du temps de calcul.

Intégration avec le pipeline SEO

Le regroupement de requêtes est l'étape 5 du pipeline SEO :

  1. Étape 0 : Embed Source Data - Produits, pièces, articles
  2. Étape 1 : Fetch Queries - GSC, Google Ads, en direct, Algolia
  3. Étape 2 : Combiner les requêtes - Fusionner toutes les sources
  4. Étape 3a : Generate Base Phrase Mappings - Filtres initiaux
  5. Étape 3b : Embed Queries - Convertir en vecteurs
  6. Étape 4 : Expand Phrase Mappings - Trouver des phrases similaires
  7. Étape 5 : Cluster Queries ← Vous êtes ici
  8. Étape 6 : Match Products - Correspondance requête-produit
  9. Étape 7 : Construire les pages de requête - Générer du HTML
  10. Étape 8 : Generate Related Searches - Trouver des requêtes liées
  11. Étape 11 : Migrate to Valkey - Charger dans le service de recherche

Voir SEO Pipeline Overview pour le flux complet.

Pourquoi tous-à-tous au lieu de K-Means ?

Nous utilisions auparavant le regroupement k-means avec des centres de groupes présélectionnés. L'approche tous-à-tous présente des avantages :

  • Meilleures correspondances : Chaque requête trouve sa véritable meilleure correspondance, et non pas seulement la plus proche de quelques centres présélectionnés

  • Pas de biais de présélection : Les centres de groupes émergent naturellement des données

  • Nombre de groupes adaptatif : Le nombre de groupes s'ajuste à la distribution des données

  • Qualité supérieure : Les requêtes se regroupent avec leur correspondance la plus similaire, pas un compromis

Le compromis est un temps de calcul accru, mais l'amélioration de la qualité le justifie.

Caractéristiques de performance

Le processus de regroupement a ces caractéristiques :

  • Temps de traitement : Évolue avec le volume de requêtes et le seuil de similarité ; des lots plus grands réduisent les itérations

  • Utilisation mémoire : Matrice des embeddings + lot actif + espace de travail temporaire ; configurable via la taille des lots

  • E/S disque : Une seule lecture séquentielle du tableau complet des embeddings au début ; E/S minimales pendant le traitement

  • Utilisation CPU : Dominée par les calculs de similarité cosinus à travers toutes les comparaisons lot-à-tout

Le processus est limité par le CPU. L'utilisation de NumPy avec l'accélération BLAS accélère significativement les opérations matricielles.

Références

Concepts techniques

Documentation des modèles

Articles connexes

Résumé

Nous regroupons les requêtes en utilisant une comparaison de similarité cosinus tous-à-tous avec traitement par lots :

  • Calcul par lots : Les similarités sont calculées par lots de taille configurable

  • Sélection de la meilleure correspondance : Chaque requête rejoint le groupe de sa correspondance la plus similaire

  • Seuil configurable : Seuil de similarité ajustable sans changement de code

  • Efficace en mémoire : Le traitement par lots empêche le débordement mémoire pour les grands jeux de données

  • Sortie classée par trafic : Groupes triés par score total d'impressions/clics

  • Gestion des singletons : Les requêtes non regroupées deviennent des groupes à un seul membre

Cette approche produit des groupes de qualité supérieure au k-means en trouvant les véritables meilleures correspondances au lieu des centres présélectionnés les plus proches. Le résultat est de meilleures pages de requêtes avec une consolidation du trafic plus pertinente.


← Retour à l'index de documentation