Comparaison de 2 chaines , et retour du pourcentage de ressemblance

Soyez le premier à donner votre avis sur cette source.

Snippet vu 19 026 fois - Téléchargée 24 fois

Contenu du snippet

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 / Exemple :


<?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/>";

?>

A voir également

Ajouter un commentaire

Commentaires

malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
hello,

jette un oeil à cette fonction Franco : levenshtein (php.net).
Tu simplifieras largement ta fonction ;-)
franco_se
Messages postés
151
Date d'inscription
samedi 1 novembre 2003
Statut
Membre
Dernière intervention
30 juillet 2018
-
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
malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
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.
malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
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...)
coucou747
Messages postés
12336
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
30 -
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é...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.