Comparaison de 2 chaines , et retour du pourcentage de ressemblance

Soyez le premier à donner votre avis sur cette source.

Snippet vu 19 424 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

Messages postés
31
Date d'inscription
mardi 13 avril 2004
Statut
Membre
Dernière intervention
3 mars 2008

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é "-", "(", ")", "[", "]"
Messages postés
31
Date d'inscription
mardi 13 avril 2004
Statut
Membre
Dernière intervention
3 mars 2008

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...
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
36
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é...
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
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...)
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
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.
Afficher les 7 commentaires

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.