Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/04/2011, 17h58   #1
Invité régulier
 
Inscription : janvier 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 9
Points : 5
Points : 5
Par défaut Nombre de caractères similaires et position correcte dans 2 chaines

Bonjour,

Je voudrais savoir si quelqu'un aurait un début de piste pour une fonction me permettant de générer "un score" à partir de 2 chaines de caractères.

Par exemple, comparer "ma chaine 1" et "ta chaine 2" et me dire que x lettres similaires sont placées au même endroit.

Le but étant de comparer une saisie utilisateur avec une chaine stockée et permettant une erreur "humaine" mais qui se rapproche fortement de la réponse.

Je pense qu'il faut utiliser charAt et indexOf mais je ne vois pas bien comment

Merci pour votre aide
Orangevinz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 20h42   #2
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 756
Points : 4 756
Bonsoir,
tu peux faire le test avec les chaines transformées en tableaux avec la méthode split
exemple
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var chaine_1 = "bonjour vous !";
var chaine_2 = "bonsoir vous";
// recup sous forme de tableau
var t_chaine_1 = chaine_1.split('');
var t_chaine_2 = chaine_2.split('');
// recup le plus court
var nb_1 = t_chaine_1.length;
var nb_2 = t_chaine_2.length;
var nb = nb_1 < nb_2 ? nb_1 : nb_2;
var i, sResult = "";
// parcours les tableaux
for( i = 0; i < nb; i++){
  if( t_chaine_1[i] == t_chaine_2[i]){
    sResult += i + ' -> ' + t_chaine_1[i] + ' identique\n';
  }
}
// affiche le resultat
alert( sResult);
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 22h40   #3
Membre du Club
 
Avatar de Billy KiT
 
Inscription : mars 2011
Messages : 47
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 47
Points : 59
Points : 59
Salut,
ça ressemble à l'utilisation de l’algorithme de Levenshtein,
http://fr.wikipedia.org/wiki/Distance_de_Levenshtein
Un exemple en Javascript :
http://phpjs.org/functions/levenshtein:463
Billy KiT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/04/2011, 22h55   #4
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 756
Points : 4 756
Citation:
Salut,
ça ressemble à l'utilisation de l’algorithme de Levenshtein,
mais bon sang c'est bien sûr (Raymond Souplex)

Je me rend compte, une fois de plus, que ce que je sais n'est rien à coté de ce que j'ignore!
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/04/2011, 07h57   #5
Expert Confirmé
 
Avatar de javatwister
 
Homme
danseur
Inscription : août 2003
Messages : 2 667
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : danseur

Informations forums :
Inscription : août 2003
Messages : 2 667
Points : 3 035
Points : 3 035
et sans conversion:

Code :
1
2
3
4
5
6
7
8
9
10
var ch="une chaîne";
var ch2="six chaînes";
 
for(var i=0,t=0;i<ch.length;i++){
	if(ch.charAt(i)==ch2.charAt(i)){
		t++
	}
}
 
alert(t)
__________________
On ne mord pas, on manifeste seulement notre tristesse face à des exposés de situations qui défient notre entendement binaire.
javatwister est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2011, 11h03   #6
Expert Confirmé
 
Avatar de javatwister
 
Homme
danseur
Inscription : août 2003
Messages : 2 667
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : danseur

Informations forums :
Inscription : août 2003
Messages : 2 667
Points : 3 035
Points : 3 035
on peut aussi s'amuser un peu plus:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<script type="text/javascript">
 
var ch="une chaîne";
var ch2="chaîn euen";
 
if(ch.split("").sort().toString().toLowerCase()==ch2.split("").sort().toString().toLowerCase()){
	alert(ch + "\n\nest un anagramme parfait de\n\n" + ch2)
}
else{
	for(var i=0,t=0,s;i<ch.length;i++){
		if(ch.charAt(i)==ch2.charAt(i)){
			t++
		}
	}
	if(ch==ch2){
		alert("Les deux chaînes sont identiques.")
	}
	else{
		s=t>1?"s":"";
		alert("Il y a " + t + " caractère" + s + " commun" + s + " entre \n\n" + ch + "\n\net\n\n" + ch2)
	}
}
 
</script>
mais faut vraiment avoir du temps perdre;
__________________
On ne mord pas, on manifeste seulement notre tristesse face à des exposés de situations qui défient notre entendement binaire.
javatwister est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2011, 12h38   #7
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 756
Points : 4 756
Citation:
Envoyé par javatwister Voir le message
on peut aussi s'amuser un peu plus:
...
mais faut vraiment avoir du temps perdre;
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2011, 13h05   #8
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 861
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 861
Points : 1 366
Points : 1 366
je pense que les réponses ne correspondent pas à l'attente de notre ami ! et pour cause, je pense que la question est mal énoncée quand il demande "x lettres similaires sont placées au même endroit".

car d'après ce que je comprend "permettant une erreur 'humaine'", si l'utilisateur entre un caractère en plus en début de chaîne, même si le reste de la chaîne est identique, aucune position ne correspondra et on aura 0% de correspondance.

-> @Orangevinz, me trompe-je ?


nb: je n'avais pas vu la réponse de Billy KiT, qui à mon avis correspond mieux à ton attente.
Willpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2011, 13h06   #9
Expert Confirmé
 
Avatar de javatwister
 
Homme
danseur
Inscription : août 2003
Messages : 2 667
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : danseur

Informations forums :
Inscription : août 2003
Messages : 2 667
Points : 3 035
Points : 3 035
oui bon d'accord, j'ai oublié un à
__________________
On ne mord pas, on manifeste seulement notre tristesse face à des exposés de situations qui défient notre entendement binaire.
javatwister est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2011, 13h10   #10
Expert Confirmé
 
Avatar de javatwister
 
Homme
danseur
Inscription : août 2003
Messages : 2 667
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : danseur

Informations forums :
Inscription : août 2003
Messages : 2 667
Points : 3 035
Points : 3 035
bah, le problème des énoncés pas binaires je m'y ferais jamais de toute façon

bref, si ton intuition est bonne, ça revient à comparer 2 chaînes anagrammiques et à calculer l'écart;

__________________
On ne mord pas, on manifeste seulement notre tristesse face à des exposés de situations qui défient notre entendement binaire.
javatwister est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2011, 13h41   #11
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 756
Points : 4 756
Citation:
Envoyé par Orangevinz Voir le message
Je voudrais savoir si quelqu'un aurait un début de piste pour une fonction me permettant de générer "un score" à partir de 2 chaines de caractères.

Par exemple, comparer "ma chaine 1" et "ta chaine 2" et me dire que x lettres similaires sont placées au même endroit.
le cahier des charges est relativement clair et les réponses me semble bien correspondre à cette attente, mais peut être me trompes je!
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2011, 13h47   #12
Expert Confirmé
 
Avatar de javatwister
 
Homme
danseur
Inscription : août 2003
Messages : 2 667
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : danseur

Informations forums :
Inscription : août 2003
Messages : 2 667
Points : 3 035
Points : 3 035
oui chuis assez d'accord...

me manquait juste l'expression "cahier des charges"
__________________
On ne mord pas, on manifeste seulement notre tristesse face à des exposés de situations qui défient notre entendement binaire.
javatwister est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2011, 19h17   #13
Membre du Club
 
Avatar de Billy KiT
 
Inscription : mars 2011
Messages : 47
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 47
Points : 59
Points : 59
Citation:
Envoyé par NoSmoking Voir le message
mais bon sang c'est bien sûr (Raymond Souplex)
Moi je trouve super "pro" de citer ses sources
Billy KiT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 11h27   #14
Invité régulier
 
Inscription : janvier 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 9
Points : 5
Points : 5
D'abord merci à tous pour vos réponses, je n'ai pas eu le temps de revenir avant désolé.
Vous m'avez donné plus que des pistes là!

Je pense que je devrais arriver à faire ce que je veux avec cette fonction http://phpjs.org/functions/levenshtein:463

De mon côté j'avais également trouvé ca : http://phpjs.org/functions/similar_text:902
mais niveau pertinence de résultat, je pense que ca se vaut

Il faut juste qu'ensuite je calcule un % de réussite par rapport à la longueur de la chaine pour savoir si la saisie est entre 95% et 100% (par rapport à la chaine attendue)

@Willpower normalement ce genre de cas ne pourra pas se produire car j'utilise des cases correspondant chacune à une lettre. Le nombre de cases correspondants dès le début à la longueur de la chaine attendue.

Merci encore à tous pour votre aide
Orangevinz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 11h59   #15
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 861
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 861
Points : 1 366
Points : 1 366
Citation:
Envoyé par Orangevinz Voir le message
@Willpower normalement ce genre de cas ne pourra pas se produire car j'utilise des cases correspondant chacune à une lettre. Le nombre de cases correspondants dès le début à la longueur de la chaine attendue.

Merci encore à tous pour votre aide
si tu fais du case par case, tu n'as pas besoin de l’algorithme de levenshtein ! une simple boucle avec compteur suffira.

comme quoi, il est toujours bien de redemander des précisions sur la question quand elle peut avoir plusieurs interprétations.

le code de javatwister semble donc bien mieux correspondre à ton attente. (j'aime l'idée de l'anagrame, mais il faudrait y ajouter une boucle pour un anagrame à n %).
tu peux également transformer ton score obtenu en % de la longueur en divisant ton score par chaine.length.
Willpower est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/04/2011, 18h59   #16
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 756
Points : 4 756
to javatwister :
Citation:
Envoyé par javatwister Voir le message
oui bon d'accord, j'ai oublié un à
je n'avais pas fait attention à ton message, ne te méprends pas, pour être honnête je n'avais même pas vu qu'il manqué à, c'est juste que j'ai éclaté de rire en le lisant, je devais être dans d'excellente disposition!

to Billy KiT :
décidément je ne devais pas être moi, je corriges donc, ce n'est pas mais bon sang c'est bien sûr, mais bel est bien
Bon Dieu ! Mais c'est bien sûr ! ( Raymond Souplex)

to Orangevinz :
cela fait combien en levenshteinnien
bon dieu mais c'est bien sûr VS mais bon sang c'est bien sûr ?
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 19h33   #17
Membre du Club
 
Avatar de Billy KiT
 
Inscription : mars 2011
Messages : 47
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 47
Points : 59
Points : 59
11

http://www.functions-online.com/levenshtein.html
Billy KiT est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h33.


 
 
 
 
Partenaires

Hébergement Web