|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre confirmé
![]() ![]() Inscription : mars 2003 Messages : 1 043 ![]() |
Bonjour à toutes et tous,
Suite à une refonte de 3 BDD en une, je me trouve avec le problème suivant, dans une table "produits". nom voiture 4 roues Voiture quatre roues Qui sont des faux doublons. Que je voudrais pouvoir détecter. J'ai lu le passionnant article sur le sujet : http://sqlpro.developpez.com/cours/doublons/ et tenté de m'en inspirer, sans succès. Les requêtes plantent ou ne retournent rien. Pourtant, je pensais que : Code :
Je voudrais une requête qui ratisse "large" et tant pis si elle me retourne des doublons qui n'en sont pas. Sans doute faudrait-il utiliser des expressions rationnelles, mais je n'y comprends quant à leur utilisation dans mySQL. Pensez-vous que cela soit possible ? |
||
|
|
00
|
|
|
#2 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
L'article m'a l'air très intéressant, j'y jetterai un coup d'oeil à l'occasion.
Une solution (beaucoup) moins propre pour la détection des doublons pourrait être un algorithme 0(n*m) sur l'ensemble des produits (assez lourd donc) qui calculerait (par exemple) la distance Levenshtein et afficherai un rendu trié par distance et donc serait capable de "repérer" les faux doublons. Un tel script de sanitize n'est sûrement pas la solution la plus élégante mais c'est la seule chose que j'ai imaginé compte tenu de ma faible expérience... Par exemple, la distance entre "voiture 4 roues" et "Voiture quatre roues" est de 7 (6 en minuscule): Code :
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||
|
00
|
|
|
#3 |
|
Membre confirmé
![]() ![]() Inscription : mars 2003 Messages : 1 043 ![]() |
Bonjour et merci de ta réponse.
Ma foi...je vais tenter le coup, la table ne comprend que 500 lignes. Et puis ce n'est à faire qu'une fois... Ensuite, je reviens pour donner le résultat. |
|
|
00
|
|
|
#4 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Je viens de voir d'autres fonction qui peuvent t'intéresser:
- similar_text calcule les caractères similaires entre deux chaines - soundex calcule une clé identique pour deux chaines ayant les mêmes phonèmes ("voiture" et "voature" par exemple - ne fonctionne pas avec des chiffres) A voir si ça peut servir.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
00
|
|
|
#5 |
|
Membre confirmé
![]() ![]() Inscription : mars 2003 Messages : 1 043 ![]() |
Oui, je viens de lire la doc à ce propos. Mais il semblerait que ces fonctions soient moins précises que levenshtein.
Par contre, je me trouve comme un âne : comment je fais, au niveau de ma requête, ou de son traitement, pour déterminer qu'il y a suspicion de doublon ? |
|
|
00
|
|
|
#6 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Tu le fais pas, c'est ça le hic. Il faut que tu réccupères toutes tes dénominations produits et que tu fasse tourner l'algo dessus.
Voici un skeleton si ça peut t'aider: Code :
Un mot d'explication, le principe est le suivant: - on récupère toutes les noms produits - pour chaque nom, on le vérifie en regard de tous les autres - si les deux chaines à comparer sont de taille trop différente (défini par le paramètre MAX_STR_DIFF) on ignore et on considère donc qu'il ne s'agit pas d'un doublon - on récupère la distance Levenshtein qu'on place dans l'indice correspondant du tableau de résultats - ensuite on passe sur le tableau de résultat (ordonné par distance de Levenshtein) et pour chaque distance on affiche toutes les chaines droite et gauche correspondantes - pour eviter que le tableau produit ne soit trop long, on spécifie un paramètre IGNORE_FROM_LEV qui permet d'ignorer les entrées dont la distance est supérieure à la valeur du paramètre. A toi de me dire si ça te va. Si tu mets de valeurs trop grandes dans les deux paramètres, tu vas te retrouver avec un tableau de 250000 pour un jeu de 500 produits: prudence avec la pondération.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||
|
00
|
|
|
#7 |
|
Membre confirmé
![]() ![]() Inscription : mars 2003 Messages : 1 043 ![]() |
Merci d'avoir pris le temps de coder cet exemple.
Malheureusement, il ne fonctionne pas. Si je mets les params à 4, tous les produits sont retournés. Si je mets 5, j'ai un "out of memory". Je vais gratter encore du côté de la requête proprement dite. Si quelqu'un a une autre idée, je suis toujours preneur... |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com