[RESOLU] script de comparaison de chaine

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] script de comparaison de chaine

Re: script de comparaison de chaine

par sirakawa » 22 févr. 2014, 14:49

Bjr,
Tu pourrais faire une recherche sur le plagiat (il y a eu des trucs entre autres à polytechnique).
Mais il y a en php plusieurs fonctions qui font ça dont levenshtein, metaphone, similar_texte. soundex qui serait très bien si on pouvait la forcer à prendre en compte le français, ce que ne fait pas php, mais que permet:
http://algor.chez.com/soundex/soundex.htm
Je m'en étais servi pour identifier des noms de personnes après des frappes plus ou moins fausses.
<?PHP
function soundex_fr($mot)
{
mb_internal_encoding ("utf-8");
$consonnes = array (
	"b",
	"p" ,
	"c",
	"k",
	"q",
	"d",
	"t",
	"l",
	"m",
	"n",
	"r",
	"g",
	"j",
	"x",
	"z",
	"s",
	"f",
	"v",
	"a",
	"â",
	"à",
	"ä",
	"e",
	"é",
	"è",
	"ë",
	"ë",
	"i",
	"î",
	"i",
	"o",
	"ô",
	"ö",
	"u",
	"û",
	"ü",
	"y",
);
$nombres = array (
1,
1,
2,
2,
2,
3,
3,
4,
5,
5,
6,
7,
7,
8,
8,
8,
9,
9,
);

$mot = mb_strtolower(trim($mot));

print "$mot<br>";
$sound = str_replace ($consonnes, $nombres, $mot);
return $sound;
}
echo (soundex_fr("câäauitécui"));

?>

script de comparaison de chaine

par damien_55 » 22 févr. 2014, 14:03

Bonjour a tous,

J'ai un script qui me permet de corréler des données similaires par comparaison de chaines (pour un comparateur):
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 = 'Le Donjon Agde'; // test de recherche dans une chaîne
$chaine2 = 'HÔTEL LE DONJON AGDE'; // 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/>";
Au vu du nombre de données à comparer (plusieurs centaines de milliers), pensez vous que si je considére un pourcentage de ressemblance à 80% comme etant le meme éléments, c'est pertinant ?

A noter que les recupere des tables, le nom de l'élément, ville de l'elément (par exemple $chaine1 = 'Le Donjon Agde'; $chaine2 = 'HÔTEL LE DONJON AGDE';).

Merci de votre aide.