Prima Pagina.
EN

3 juin 2026Le moteur

Maintenir la similarité cosinus sous 0,85 : méthode et outillage

La similarité cosinus sur embeddings TF-IDF mesure le recouvrement lexical entre deux pages. Maintenir ce score sous 0,85 pour toutes les paires de pages du même cluster exige une QA automatique bloquante et des tables de variation suffisamment larges. Le pipeline arrête le build dès qu’une violation est détectée.

Construire les vecteurs TF-IDF à l’échelle de 4 000 pages

Le calcul TF-IDF sur 4 000 pages implique une matrice de 4 000 lignes et plusieurs dizaines de milliers de colonnes (vocabulaire unique après stemming). Nous utilisons une représentation creuse (scipy.sparse) pour réduire l’empreinte mémoire à moins de 800 Mo. Le calcul complet de la matrice prend environ 40 secondes sur un serveur de build à 8 cœurs.

Seuls les 200 premiers tokens du corps de chaque page entrent dans le calcul. L’en-tête, le pied de page et les éléments de navigation sont exclus. Ce choix stabilise les scores : ces zones structurelles partagées hausseraient mécaniquement la similarité sans refléter la réelle proximité de contenu.

Pourquoi 0,85 et pas un autre seuil

Le seuil de 0,85 résulte d’une calibration sur un corpus de 200 pages identifiées manuellement comme « trop similaires » et 200 pages jugées « suffisamment distinctes ». La courbe ROC a montré un F1 maximal à 0,85. Un seuil plus bas (0,80) générait trop de faux positifs et bloquait des pages légitimement proches par leur thématique.

Ce seuil s’applique aux paires de pages appartenant au même cluster et partageant une commune ou un secteur d’activité. Les paires inter-clusters ne sont pas testées : une page ’avocat Paris 8e’ et ’plombier Lyon 3e’ peuvent légitimement partager une structure sans risque de doorway.

Corriger une violation sans relancer tout le pipeline

Quand un couple de slugs dépasse le seuil, le pipeline génère un rapport listant les tokens les plus partagés entre les deux pages. L’ingénieur dispose de trois leviers : élargir la table de variation du bloc incriminé, injecter une donnée locale supplémentaire (distance haversine, population INSEE), ou déplacer l’une des pages dans un sous-cluster distinct.

La correction est validée en régénérant uniquement les deux pages concernées, sans relancer le build complet. Un script dédié accepte une liste de slugs et ne recalcule que les lignes correspondantes de la matrice, ce qui ramène le temps de vérification à moins de cinq secondes.

Questions fréquentes

La similarité cosinus détecte-t-elle le contenu dupliqué exact ?

Elle le détecte en premier lieu, avec un score proche de 1,0. Mais son intérêt principal est de repérer les pages quasi-identiques qui partagent 80 à 90 % du même vocabulaire sans être des copies exactes, ce que la détection de hash ne verrait pas.

Quelle est la fréquence de ce contrôle ?

La matrice est recalculée à chaque build de production, soit environ une fois par semaine. Entre les builds, un contrôle partiel est exécuté sur les seules pages modifiées, comparées à leurs 50 voisines les plus proches dans l’index.