Recherche de ressemblances entre chaines de caractères - PHP - Programmation
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.
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".
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 ?
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
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...
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 :
|
qui te donnera
Lettres communes entre 'Daredevil' et 'Dardevil': 8 (94.117647058824%) |
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)
Marsh Posté le 09-10-2003 à 11:00:47
JWhy a écrit : y'a bien la fonction mySQL SOUNDEX
|
je pense que c'(est la meilleure solution
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.
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é..
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à.
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
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. )
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
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
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.
Marsh Posté le 10-10-2003 à 00:23:58
Extrait de la doc de SQL Server :
Citation : Examples |
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...
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+,
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
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) |
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 !
Marsh Posté le 10-10-2003 à 14:30:43
Si tu veux. Moi j'appelle ça tuer un moustique au lance-flammes
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 ...
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 ?