Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

COMPARAISON DE 2 CHAINES , ET RETOUR DU POURCENTAGE DE RESSEMBLANCE


Information sur la source

Catégorie :Astuces Classé sous : ressemblance, chaines, mots, compter, pourcentage Niveau : Débutant Date de création : 26/08/2006 Vu : 10 069

Note :
8 / 10 - par 2 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

Description

bonjour

cette fonction tres simple sert a comparer 2 chaines de caracteres, et de connaitre leur ressemblance en pourcentage.
il n'y a que 2 paramattres:
1/ la chaine de motes recherchées
2/ la chaine où s'effectue la recherche
 

Source

  • <?php
  • function ressemblance($chaine_recherchee, $chaine_de_contenu) {
  • //on supprime des caracteres de la chaine recherchée, n'entrant pas en compte dans le calcul de la ressemblance.
  • //trim() sert a supprimer les espaces potentielles en debut et fin de chaine.
  • //et strtolower() renvoie la chaîne en minuscules
  • $cle_chaine_rech = strtolower(trim(str_replace(array("!", "?", ",", ";", "*" ), "", $chaine_recherchee)));
  • //on renvoie aussi la chaîne de contenu en minuscules et on explose les chaines, pour obtenir des tableaux
  • $explode_contenu = explode(" ", strtolower($chaine_de_contenu));
  • $explode_cle = explode(" ", $cle_chaine_rech);
  • //on compte le contenu des tableau
  • $count_tab_cle = count($explode_cle);
  • $count_tab_contenu = count($explode_contenu);
  • //on compare les tableaux
  • for($i = 0; $i != $count_tab_contenu; $i++) $pointage[$i] = (in_array($explode_contenu[$i], $explode_cle))?1:0;
  • // on calcule la somme des valeurs du tableau, et on la retourne sous forme de pourcentage
  • return round(((array_sum($pointage)/$count_tab_contenu)*100), 2) . "%";
  • }
  • // les 2 paramettres representent respectivement la chaine de mots recherchées, et la chaine où l'on effectue la recherche
  • $chaine1 = 'test de recherche dans une chaîne';
  • $chaine2 = 'chaîne de contenu dans laquelle nous effectuons la recherche des mots de la chaîne 1';
  • echo "Chaine 1 = ".$chaine1."<br/>Chaine 2 = ".$chaine2."<br/>";
  • echo "Calcul du pourcentage de ressemblance: ".ressemblance($chaine1, $chaine2)."<br/>";
  • ?>
<?php

function ressemblance($chaine_recherchee, $chaine_de_contenu) {

//on supprime des caracteres de la chaine recherchée, n'entrant pas en compte dans le calcul de la ressemblance.
//trim() sert a supprimer les espaces potentielles en debut et fin de chaine.
//et strtolower() renvoie la chaîne en minuscules
    $cle_chaine_rech = strtolower(trim(str_replace(array("!", "?", ",", ";", "*" ), "", $chaine_recherchee)));

//on renvoie aussi la chaîne de contenu en minuscules et on explose les chaines, pour obtenir des tableaux
    $explode_contenu = explode(" ", strtolower($chaine_de_contenu));
    $explode_cle = explode(" ", $cle_chaine_rech);

//on compte le contenu des tableau    
    $count_tab_cle = count($explode_cle);
    $count_tab_contenu = count($explode_contenu);
    
//on compare les tableaux 	
	for($i = 0; $i != $count_tab_contenu; $i++) $pointage[$i] = (in_array($explode_contenu[$i], $explode_cle))?1:0; 

// on calcule la somme des valeurs du tableau, et on la retourne sous forme de pourcentage
 return round(((array_sum($pointage)/$count_tab_contenu)*100), 2) . "%";
}


// les 2 paramettres representent respectivement la chaine de mots recherchées, et la chaine où l'on effectue la recherche

$chaine1 = 'test de recherche dans une chaîne';
$chaine2 = 'chaîne de contenu dans laquelle nous effectuons la recherche des mots de la chaîne 1';
echo "Chaine 1 = ".$chaine1."<br/>Chaine 2 = ".$chaine2."<br/>";
echo "Calcul du pourcentage de ressemblance: ".ressemblance($chaine1, $chaine2)."<br/>";



?> 

Commentaires et avis

signaler à un administrateur
Commentaire de malalam le 26/08/2006 19:09:34 administrateur CS

hello,

jette un oeil à cette fonction Franco : levenshtein (php.net).
Tu simplifieras largement ta fonction ;-)

signaler à un administrateur
Commentaire de franco_se le 26/08/2006 20:13:48

je la connaissais pas cette fonction, merci. ( en meme tps, il y a pres de 1300 fonctions php, comment toutes les connaitres ?)

enfin, maintenant, faut que je comprenne bien son fonctionnement, et comment l'integrer lol

signaler à un administrateur
Commentaire de malalam le 26/08/2006 20:42:27 administrateur CS

Moi, je les apprends par coeur ;-)
Nan je plaisante...
Levenshtein () utilise l'algo de...Levenshtein ;-) Cet algo calcule la distance entre 2 chaînes (en caractères). La fonction te renvoie donc un entier. (sauf options).
Reste plus qu'à calculer un pourcentage après.

signaler à un administrateur
Commentaire de malalam le 26/08/2006 20:43:59 administrateur CS

Couplé à du soundex, c'est très intéressant. Au passage, je fais de la pub : tu peux jeter un oeil à mes codes soundex2 francisé, et phonex. Tu verras, ça peut apporter de l'eau à ton code (bien que cette expression ne veuille rien dire...)

signaler à un administrateur
Commentaire de coucou747 le 28/08/2006 12:43:25

on peut calculer une "distance" entre deux chaines en prennant un alphabet pour calculer la distance entre deux lettres : sur un clavier par exemple, ce qui permetrait de minimiser l'importance des fautes de frapes : deux lettres proches sur le clavier seraient considérés comme proches...

soundex n'a pas cette fonction, pour soundex, les mots doivent avoir une sonoritée proche...

mais là, je ne vois pas trop ce que ton algo fait, tu pourrais détailler ? selon ce que j'ai vu, ça prend chaque lettre de la première chaine, et ça regarde si c'est dans la seconde chaine... mais donc, on s'en moque de la position dans la seconde chaine... bref, ton algo n'est pas réaliste à mon avis...

for($i = 0; $i != $count_tab_contenu; $i++)
ici un foreach devrait être plus approprié...

signaler à un administrateur
Commentaire de vduffaut le 19/02/2007 18:52:16

JE prends bonne note (?) des critiques mais je trouve l'idée intéressante et je m'en sers pour émettre, ou non) une alerte de mise à jour pour mes abonnés.

En revanche, il y a un erreur car si on compare deus chaînes identiques, on n'obtient pas 100%... En effet, le traitement de base effectué n'est pas identique pour les 2... Je vais regarder cette fonction évoquée par Malalam

$cle_chaine_rech = strtolower(trim(str_replace(array("!", "?", ",", ";", "*" ), "", $chaine_recherchee)));

J'ai donc ajouté :

$cle_chaine_cont = strtolower(trim(str_replace(array("!", "?", ",", ";", "*" ), "", $chaine_de_contenu)));

De plus les accents ne sont pas éliminés avant comparaison...

signaler à un administrateur
Commentaire de vduffaut le 19/02/2007 21:53:33

Et je vais même plus loin en utilisant la fonction similar_text qui calcule directement ce pourcentage...

similar_texte($chaine1,$chaine2,$poucent);

en utilisant :

$chaine1 = sansAccents(stripslashes(strtolower(trim(str_replace(array("!", "?", ",", ";", ".", "-", "(", ")", "[", "]"), "", strip_tags($chaine1))))));

et évidemment le même appel pour $chaine2 !

J'ai aussi remplacé le "*" par un "."
et ajouté "-", "(", ")", "[", "]"

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

compter les clics sur un lien [ par omnikod ] je voudrais savoir combien de fois tel ou tel lien a été cliqué (pour des download par exemple) c possible ? comment ? Compter des fichiers.... [ par FleX ] Alors voila. je voudrais me faire un script php3 qui compte le nombre de fichiers dans un dossier et que le resultat soit mis dans une variable, que j Couleur de mots cles dans une var [ par Arnaud ] Bonjour ke voulais savoir comment on fait pour changer la couleur des mots cles dans un var par ex print je voudrais qu'il soit bleu mais si je met // Compter les chiffre d'une colonne dans MySQL [ par Neozix ] Bonjour,Voila je souhaiterais compter les valeurs que j'ai dans une colonne, c'est une colonne qui contient des nombres de cd. cd -----1367je souhait compter le nombre de dimanche sur un intervalle de date [ par desrimaisd ] salut,je voudrais savoir si kelk'un connaitrait un moyen de savoir combien il y a de dimanche (en fait d'un jour en particulier, c pareil pour les aut menu et chaines de caractères [ par ayor ] bien le bonjour à tous, je voulais juste poser 2 petites questions : - tout d'abord, sous phpmyadmin, est-il possible de créer des champs de text Extraire que les MAJUSCULES d'une chaines de caracteres [ par sxvirus ] Bonsoir,Je cherche à extraire que les MAJUSCULES d'une chaines de caracteres mais je n'y arrive pas.Avez vous une solution , MERCI d'avance. remplacer strok par ereg [ par apz ] salut,j'utilise strok pour recuperer des sous-chaines d'une ligne dans un fichier.mais je voulais remplacer le strok (pour eviter les boucles et ainsi Découpage de chaines [ par stephtbesy ] Bonjour tout le monde,voilà mon prb... il n'y a pas de fonction lastIndexOf en php.Je souhaiterais en effet prendre juste le nom du fichier que j'uplo codes des chaines cryptées [ par fado0 ] bonjour,je cherche un code pour decryptées les chaines numeriques ou un logiciel ou un site ou je peux trouver une réponcemerci de votre aide


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,780 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.