Recherche de ressemblances entre chaines de caractères

Recherche de ressemblances entre chaines de caractères - PHP - Programmation

Marsh Posté le 08-10-2003 à 18:51:30    

Je tiens un liste de film dans une base de donnée MySQL et j'aimerais savoir si il existe des fonction qui permettent de tester la ressemblance d'une chaine de caractère avec une autre, pour éviter les doublons dans ma liste. J'ai regardé dans la doc mais je n'ai pas trouvé de fonction qui me convenaient, il en a mais pour l'anglais et vu que c un script en fr..  
 
Ex. Si dans la base de donnée il y a ( Daredevil ) et que qqun essaie d'ajouter ( Dardevil ), il faudrais que la fonction détecte une ressemblance..
 
Existe t'il un moyen en php ? Sans pour autant tuer le serveur qui héberge le script ?

Reply

Marsh Posté le 08-10-2003 à 18:51:30   

Reply

Marsh Posté le 08-10-2003 à 19:02:30    

il y a toujours moyen de le faire, mais ca sera surement plus lourd que des fonctions faites en assembleur. :p
De manière, théorique, il faut transormer le tesxte saisie en codes phonétique et faire une comparaison sur la version "phonétique" du texte.
 
Bonne chance en tout cas pour le faire sans erreur et sans "time out". ;)

Reply

Marsh Posté le 08-10-2003 à 19:04:39    

C'est aussi ce que je me disait.. Mouais, bah je v demandé de l'aide à 2 3 potes je penses.. sinon ça va pas aller..
 
Sinon pas d'autres solutions ?

Reply

Marsh Posté le 08-10-2003 à 21:15:02    

et strstr()? Tu pourrais détecter si l'utilisateur veut entrer "SUPERMAN II" lorsque dans la base il y a déja "LE SUPERMAN 2" et confirmer s'il veut le rentrer ou non.
 
Tu peux faire un explode() sur la chaine entré pour vérifier mot à mot aussi.
 
J'sais pas si j'suis dans l'coup mais bon... Voila mon grain de sel  :pt1cable:


Message édité par porksoda le 08-10-2003 à 21:15:24
Reply

Marsh Posté le 08-10-2003 à 23:32:31    

C'est pas une trop mauvaise idée.
 
On peut à partir de là faire une vérif des lettres de chaque mot et tilter à partir de 90% de lettres communes pour les mots de plus de 10 lettres par exemple, en plus de ce qui a déjà été dit...
 
Mais bon , de toutes manières, à l'arrivée, il faudra juste mettre un message du genre : vérifier que ce film n'a pas déjà été rentré, parce que un ordinateur pour le moment n'a aucune culture cinématographique hein...

Reply

Marsh Posté le 09-10-2003 à 07:00:13    

y'a bien la fonction mySQL SOUNDEX
et tu as la meme en PHP, mais c'est pas dit que ca fasse ce que tu veux vu que c'est en anglais :/
 
 
une autre solution serait d'utiliser similar_text

Code :
  1. <html><body>
  2. <?
  3. $w1 = "Daredevil";
  4. $w2 = "Dardevil";
  5. $c = similar_text($w1, $w2, &$p);
  6. echo("Lettres communes entre '$w1' et '$w2': $c  ($p%)<br/ >\n" );
  7. $w1 = "Le Superman II";
  8. $w2 = "Superman 2";
  9. $c = similar_text($w1, $w2, &$p);
  10. echo("Lettres communes entre '$w1' et '$w2': $c  ($p%)<br/ >\n" );
  11. $w1 = "Ca n'a rien a voir";
  12. $w2 = "Vraiment queudalle!";
  13. $c = similar_text($w1, $w2, &$p);
  14. echo("Lettres communes entre '$w1' et '$w2': $c  ($p%)<br/ >\n" );
  15. ?>
  16. </body></html>


qui te donnera

Lettres communes entre 'Daredevil' et 'Dardevil': 8 (94.117647058824%)
Lettres communes entre 'Le Superman II' et 'Superman 2': 9 (75%)
Lettres communes entre 'Ca n'a rien a voir' et 'Vraiment queudalle!': 6 (32.432432432432%)


En fixant un pourcentage plus ou moins elevé, tu devrais avoir des resultats convenables...
 
Par contre comme l'a dit hermes, ne fait pas la selection automatique ... mets plutot un message affichant la liste des films "ressemblants" et laisse l'utilisateur faire son choix parmi ceux la (ou d'ajouter une nouvelle fiche, si le film n'existe pas)


Message édité par JWhy le 09-10-2003 à 07:04:41

---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 09-10-2003 à 11:00:47    

JWhy a écrit :

y'a bien la fonction mySQL SOUNDEX
et tu as la meme en PHP, mais c'est pas dit que ca fasse ce que tu veux vu que c'est en anglais :/
 
 
une autre solution serait d'utiliser similar_text

Code :
  1. <html><body>
  2. <?
  3. $w1 = "Daredevil";
  4. $w2 = "Dardevil";
  5. $c = similar_text($w1, $w2, &$p);
  6. echo("Lettres communes entre '$w1' et '$w2': $c  ($p%)<br/ >\n" );
  7. $w1 = "Le Superman II";
  8. $w2 = "Superman 2";
  9. $c = similar_text($w1, $w2, &$p);
  10. echo("Lettres communes entre '$w1' et '$w2': $c  ($p%)<br/ >\n" );
  11. $w1 = "Ca n'a rien a voir";
  12. $w2 = "Vraiment queudalle!";
  13. $c = similar_text($w1, $w2, &$p);
  14. echo("Lettres communes entre '$w1' et '$w2': $c  ($p%)<br/ >\n" );
  15. ?>
  16. </body></html>


qui te donnera

Lettres communes entre 'Daredevil' et 'Dardevil': 8 (94.117647058824%)
Lettres communes entre 'Le Superman II' et 'Superman 2': 9 (75%)
Lettres communes entre 'Ca n'a rien a voir' et 'Vraiment queudalle!': 6 (32.432432432432%)


En fixant un pourcentage plus ou moins elevé, tu devrais avoir des resultats convenables...
 
Par contre comme l'a dit hermes, ne fait pas la selection automatique ... mets plutot un message affichant la liste des films "ressemblants" et laisse l'utilisateur faire son choix parmi ceux la (ou d'ajouter une nouvelle fiche, si le film n'existe pas)


 
je pense que c'(est la meilleure solution :jap:

Reply

Marsh Posté le 09-10-2003 à 12:03:56    

Meillieure solution a première vue, certe.
Mais si tu commences a avoir pleins de film, tu va finir par tuer le serveur ou du moins ton script, tout simplement par ce que là t'es obligé de récupérer toute la liste des film déjà conus et de les tester un par un.
 
Mais bon, pour le début, c'est la meillieure solution ... et ca te laissera le temps de préparer un système où les comparaisons seront faites directement par la base de donnée. ;)

Reply

Marsh Posté le 09-10-2003 à 15:07:56    

directement par la base de donnée ? mhh ça m'intéresse de savoir ce que tu entends par la juste par curiosité..

Reply

Marsh Posté le 09-10-2003 à 15:58:28    

Ce que je veux dire, c'est tout simplement qu'un jour où l'autre tu auras besoin d'un système qui s'exécute plus vite que de faire un similar_text pour chaque film conus. Du coup, tu devras trouver un mouyen pour que les comparaisons soient faites par mysql, oracle, sybase ou autre base de donnée en fonction de celle que t'utilises.
Les bases de données sont capable de faire très vite des comparaisons simple sur des chaines de caractère, mais par contre  je penses pas que la pluspart d'entre elles disposent de fonction telle que similar_text.
En utilisant un système de comparaison des sonorités, il devrait être possible d'obtenir un système de recherche plus rapide que la récupération de la totale + similar_text sur chaque titre conus. ;)
 
Voilà ce que j'entendais par là. ;)

Reply

Marsh Posté le 09-10-2003 à 15:58:28   

Reply

Marsh Posté le 09-10-2003 à 16:44:55    

ha okidoki ! ouais ben je suis pas encore a se niveau de maîtrise.. mais je cracherais pas dessus.. pis niveau rapidité ça ferais du bien que ça soit fait par la bdd c sur.. j'utilise mysql pour le mom ;)

Reply

Marsh Posté le 09-10-2003 à 17:01:35    

Le temps que t'ai besoin de plus rapide que la solution du similar_text, t'auras peut être atteint un niveau sufisant pour ça.
Tel que je le voit moi, un système de sonorité, corespond a une série de substring afin de déterminé la sonorité de chaque sillabe suivit par la création d'un "mot" corespondant a la sonorité su mot de départ. ;) Par contre, j'ai pas vu de code fesant ça pour la langue francaise. (pêut être qu'il y a ce qu'il faut pour le faire dans des bouquins d'études d'ortophoniste. )

Reply

Marsh Posté le 09-10-2003 à 20:09:59    

une procedure stocke alors ;)  
cela s'execute du cote serveur c beaucoup plus rapide que de faire des similar text mais dans ce cas il faut abandonner MySQL


---------------
Battle Alita Angel
Reply

Marsh Posté le 09-10-2003 à 22:05:28    

omega2> il y a du code pour un SOUNDEX en francais mais ca se passe coté client (PHP) donc moyen :/

Reply

Marsh Posté le 09-10-2003 à 23:48:53    

Ben la transformation ce fait en php et ensuite, les comparaisons on peut les faire faire par la base de donnée. Je penses que ca diminue quand même pas mal le temps total d'exécution par rapport a du 100% php. ;)


Message édité par omega2 le 09-10-2003 à 23:49:50
Reply

Marsh Posté le 10-10-2003 à 00:23:58    

Extrait de la doc de SQL Server :
 

Citation :

Examples
This example shows the SOUNDEX function and the related DIFFERENCE function. In the first example, the standard SOUNDEX values are returned for all consonants. Returning the SOUNDEX for Smith and Smythe returns the same SOUNDEX result because all vowels, the letter y, doubled letters, and the letter h, are not included.


 
En gros, essaye de faire une fonction qui vire toutes les voyelles, le y, le h, les doubles lettres, et compare le resultat.
 
Pour ton exemple avec Daredevil :  
 
Daredevil => Drdvl
Dardevil => Drdvl
 
On voit bien que le "soundex" des deux mots est identique, c'est peut etre une piste...


Message édité par zozoll le 10-10-2003 à 00:26:32
Reply

Marsh Posté le 10-10-2003 à 01:15:00    

Il y avait eu il y a qques années un type qui avait publié un algo superieur au soundex dans les Communications de l'ACM.
Faudrait voir de ce coté la, son algo etait assez simple a implementer.
Vas voir aussi du coté de phonix et du double metaphone: http://www.codeproject.com/string/dmetaphone1.asp
A+,


Message édité par gilou le 10-10-2003 à 01:22:38

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-10-2003 à 10:13:02    

C'est un peu lourd pour éviter les doublons dans un BD de film.... et pis comment tu fais avec 2 films différents qui ont un nom similaire (voir le même nom)
 
Du style Rocky 1, 2, 3, 4, ...
La ligne verte / la ligne rouge
blanches fesse et les 7 mains :)


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 10-10-2003 à 10:19:26    

JagStang a écrit :

C'est un peu lourd pour éviter les doublons dans un BD de film.... et pis comment tu fais avec 2 films différents qui ont un nom similaire (voir le même nom)
 
Du style Rocky 1, 2, 3, 4, ...
La ligne verte / la ligne rouge
blanches fesse et les 7 mains :)


 
 [:ddr555]  [:yamusha]

Reply

Marsh Posté le 10-10-2003 à 13:54:30    

bah c'est pour ça que de toute façon avant que le code fasse qqch il demandera l'autorisation à M. le surfeur :) ben merci pour vos idées en tt cas !

Reply

Marsh Posté le 10-10-2003 à 14:30:43    

Si tu veux. Moi j'appelle ça tuer un moustique au lance-flammes


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 10-10-2003 à 20:56:11    

JagStang : Au moins ca évites les "doublons a la con". :p

Reply

Marsh Posté le 10-10-2003 à 22:24:46    

Y a une distance qui a été définie pour calculer ce genre de similarité, ça s'appelle distance de mahalanobis. Implémente l'algo dans une fonction à part, et après tu l'appelles quand tu en as besoin ...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed