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 !

LEVENSHTEIN (DISTANCE DE), ALGORITHME


Information sur la source

Catégorie :Maths & Algorithmes Source .NET ( DotNet ) Classé sous : levenshtein, distance, algorithme, chaîne, ressemblance Niveau : Débutant Date de création : 28/08/2006 Date de mise à jour : 06/09/2006 11:41:56 Vu / téléchargé: 11 247 / 467

Note :
9,67 / 10 - par 6 personnes
9,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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


Description

Cliquez pour voir la capture en taille normale
Distance de Levenshtein C# / Levenshtein Distance C#

La distance de Levenshtein (LD) mesure la similarité entre deux chaînes de caractères. Elle est égale au nombre minimal de caractères qu'il faut supprimer, insérer, ou remplacer pour passer d’une chaîne à l’autre. Son nom provient de Vladimir Levenshtein qui l'a définie en 1965. Elle est aussi connue sous le nom de distance d'édition ou encore de déformation dynamique temporelle, notamment en reconnaissance de la parole.

Cette distance est d'autant plus grande que le nombre de différences entre les deux chaînes est grand. La distance de Levenshtein peut être considérée comme une généralisation de la distance de Hamming.

Le code est très simple, j'ai en plus pris le temps de le commenter.
 

Source

  • public int LevenshteinValue()
  • {
  • if (this._n == 0) return this._m;
  • else if (this._m == 0) return this._n;
  • else
  • {
  • List<int> lastColumn = new List<int>(this._m);
  • for (int i = 1; i <= this._m; i++) lastColumn.Add(i);
  • int lastValue = 0;
  • int forLastValue = 0;
  • // Get the minimum value
  • for (int j = 1; j <= this._n; j++)
  • {
  • for (int i = 0; i < this._m; i++)
  • {
  • int x = (i == 0 ? j : lastValue) + 1;
  • int y = lastColumn[i] + 1;
  • int z = (i == 0 ? j - 1 : lastColumn[i - 1]) + (this._word1[j - 1] == this._word2[i] ? 0 : 1);
  • forLastValue = lastValue;
  • lastValue = this.Min(x, y, z);
  • if (i > 0) lastColumn[i - 1] = forLastValue;
  • if (i == this._m - 1) lastColumn[i] = lastValue;
  • }
  • }
  • this._levenshtein = lastValue;
  • return this._levenshtein;
  • }
  • }
public int LevenshteinValue()
{
  if (this._n == 0) return this._m;
  else if (this._m == 0) return this._n;
  else
  {
    List<int> lastColumn = new List<int>(this._m);
    for (int i = 1; i <= this._m; i++) lastColumn.Add(i);
    int lastValue = 0;
    int forLastValue = 0;

    // Get the minimum value
    for (int j = 1; j <= this._n; j++)
    {
      for (int i = 0; i < this._m; i++)
      {
        int x = (i == 0 ? j : lastValue) + 1;
        int y = lastColumn[i] + 1;
        int z = (i == 0 ? j - 1 : lastColumn[i - 1]) + (this._word1[j - 1] == this._word2[i] ? 0 : 1);

        forLastValue = lastValue;
        lastValue = this.Min(x, y, z);

        if (i > 0) lastColumn[i - 1] = forLastValue;
        if (i == this._m - 1) lastColumn[i] = lastValue;
      }
    }
    this._levenshtein = lastValue;
    return this._levenshtein;
  }
}

Conclusion

Couplé avec un algorithme soundex (http://www.csharpfr.com/codes/ALGORITHME-SOUNDEX_39423.aspx) on arrive à faire des recherches assez pertinentes. Les utilisations sont multiples !
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

28 août 2006 11:03:28 :
Algo un peu plus rapide. Mise en page.
28 août 2006 11:10:54 :
Re mise en page
28 août 2006 19:43:15 :
Petite amélioration (cf. remarque dans les commentaires)
30 août 2006 12:35:41 :
Modification de l'algorithme (~3x plus rapide d'après mes tests) : On ne calcul plus toute la matrice mais uniquement le dernier vecteur.
04 septembre 2006 16:33:26 :
Ajout de l'annotation finale
06 septembre 2006 11:41:56 :
Après quelques utilisations de cette classe, je me suis rendu compte qu'une méthode static s'imposait (souvent, on appelle que la méthode qui calcule la valeur)

Commentaires et avis

signaler à un administrateur
Commentaire de Warny le 28/08/2006 17:22:21

ligne 18, tu devrais pouvoir utiliser cette syntaxe :

this._word1[j - 1] == this._word2[i - 1]

ça devrait optimiser

signaler à un administrateur
Commentaire de iow4 le 28/08/2006 18:39:15

Dans exemple concret on pourait l'utiliser ?
Merci

signaler à un administrateur
Commentaire de Bidou le 28/08/2006 18:53:28 administrateur CS

Warny> hum, je ne comprends pas ce que tu dis, ta ligne retourne un booleen alors qu'il me faut un int !
Iow4> Y'a plusieurs principe qu'on peux mettre en oeuvre grâce à ce modèle (après évidemment, il faut éven. l'évoluer). Un qui me vient directement à l'esprit serait un bot pour un chat : Si l'utilisateur rentre Salut, salut, salu, salü voire même sallu ou autre, on peut l'interpréter comme étant la même chaîne en évaluant son taux de ressemblance.

signaler à un administrateur
Commentaire de iow4 le 28/08/2006 18:55:12

a oui on fixe un taux minimum pour l'interpreter.
Tout devient clair dans mon esprit merci

signaler à un administrateur
Commentaire de iow4 le 28/08/2006 18:56:35

Parcontre comment l'integrer dans un programme ou sont les variables a definir pour comparer deux chaines ?

signaler à un administrateur
Commentaire de Bidou le 28/08/2006 18:57:41 administrateur CS

Ben suffit d'ajouter la classe Levenshtein.cs dans le projet

signaler à un administrateur
Commentaire de Warny le 28/08/2006 19:32:45

re,
j'avais juste remis la parie test, tu auras compris qu'en complétant la ligne tu récupère un entier

(this._word1[j - 1] == this._word2[i - 1]) ? 0 : 1

signaler à un administrateur
Commentaire de Bidou le 28/08/2006 19:42:03 administrateur CS

Yep, sorry j'avais un peu la tête en l'air...
C'est effectivement un peu plus rapide, je vais donc changer. Merci.

signaler à un administrateur
Commentaire de sebmafate le 29/08/2006 11:59:57 administrateur CS

sympa comme source...
c'est en partie l'un des principes utilisé dans les correcteurs d'orthographe. non ?

signaler à un administrateur
Commentaire de badrbadr le 29/08/2006 21:07:22

Interessant, ça doit être comme ça que Google me corrige tout le temps !
Bravo Bidou.
Pour la reconnaissance vocale, c'est à dire déterminer si une voix apartient à tel ou tel, c'est le même principe ou encore faut-il utiliser une technique dérivée?

signaler à un administrateur
Commentaire de Bidou le 29/08/2006 22:52:18 administrateur CS

Sebmafate> Y'a de fortes chances que ça soit le cas oui! J'ai pas réussi à trouver la confirmation dans des articles.

Badrbadr> Pour la reconnaissance vocale, je m'imagine bien que y'a encore d'autres aspects qui rentrent en ligne de compte et que ça complique tout de suite bien plus les choses ! L'idée de base est la même, mais l'implémentation doit être quelque peu plus complexe.

signaler à un administrateur
Commentaire de Warny le 30/08/2006 08:41:29

Il y a d'autres algorithme de comparaison de chaînes : par exemple le SOUNDEX utilisé par les pages jaunes. Word utilise entre autre la distance de Levenshtein.

Pour la reconnaissance de voix, il y aussi d'autres algos, le Levenshtein est visiblement assez gourmand en mémoire surtout sur des longues chaînes. Comparer deux sons peut donc devenir assez fastidueux avec cette méthode : il faudrait 8000x8000 o soit ~64Mo pour comparer 1 seconde de son à 8bits 8kHz.

signaler à un administrateur
Commentaire de Bidou le 05/09/2006 12:58:23 administrateur CS

Oui, je me suis amusé à faire un petit soundex (et soundex2) pour la langue Française (chaque langue a une implémentation différente) : http://www.csharpfr.com/codes/ALGORITHME-SOUNDEX_39423.aspx

signaler à un administrateur
Commentaire de gdkenny le 03/09/2007 15:20:41

Merci pour cette classe utile

signaler à un administrateur
Commentaire de helene0618 le 10/03/2008 19:31:05

je voudrais savoir comment vous alculer le pourcentage ?

signaler à un administrateur
Commentaire de Bidou le 10/03/2008 23:21:33 administrateur CS

Bonsoir,
C'est le rapport entre la distance de Levenshtein et la taille du plus grand string.
Voir la property ErrorPercent dans le code.

signaler à un administrateur
Commentaire de helene0618 le 12/03/2008 13:59:53

merci beaucoup

signaler à un administrateur
Commentaire de DroleDeCerfeuil le 25/09/2008 14:12:21 9/10

Super source! Bravo.
Je l'ai un peu adaptée pour qu'elle ne soit pas case sensitive, ignore les accents etc.
Par contre, dans le moteur de recherche que j'implémente, il reste deux points sur lesquels je butte un peu :
Comment faire efficacement pour qu'il ne tienne pas compte de l'ordre des mots (Jean Pierre et Pierre Jean retourne la même distance de Levenshtein) et comment faire si on recherche qu'un seul mot (Jean et Jean Pierre).
Si quelqu'un a une idée... merci

signaler à un administrateur
Commentaire de Warny le 25/09/2008 14:17:05

Salut DroleDeCerfeuil,
Il faut que tu splites ta chaîne et que tu classes les mots dans l'ordre alphabétique. Ensuite, tu reconstitues ta chaîne.

signaler à un administrateur
Commentaire de DroleDeCerfeuil le 30/09/2008 09:43:15

Salut Warny et merci pour la réponse.
Mais je pense que ce n'est pas assez précis... Si par exemple la différence se situe su la première lettre du deuxième mot, rien ne vas plus...
J'ai trouvé une source qui associe la distance de levenshtein et un calcul via "l'algo hongrois", qui donne de bon résultats... (http://www.codeproject.com/KB/recipes/improvestringsimilarity.aspx?fid=203320&fr=1&df=90&mpp=25&noise=3&sort=Position&view=Quick#xx0xx)

Il me reste à voir comment gérer le cas où l'on peut omettre un mot dans la recherche...

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Les Fonctions de traitement de chaîne [ par DrChal ] DrChalBonjour,Vous allez dire que je suis très null, normal je débutte en c #.Qui peux me donner les correspondances entre VB et C# sur les différents Recherche de Caractère dans une chaîne [ par DrChal ] DrChalSalut ,Je cherche le moyen de rechercher un mot dans une chaîne de caractère.En VB, on avait la fonction InStr, existe t-elle en C#?Pouvez vous Je comprends pas cette algorithme [ par kaiwoo ] private bool AUneVirgule (double nb){long tmp = (long)nb;if (tmp == nb)return false;elsereturn true;}Pour info, il a été fait par un super membre du f Besoin d'aide : Bureau a distance [ par dczh ] Bonjour a tous, je suis tout nouveau sur le forum, exusez d'avance les us et coutumes non respectées.Voila, je cherche a creer un prog qui fait : "bur installation à distance [ par flogalea ] bonjour,je voudrais savoir s'il y a un moyen d'installer un programme sur une machine B à partir d'une machine A ? Et cela sans avoir au prealable ins Algorithme de placement [ par oberown ] Je cherche des noms d'algorithmes ou des idées, pour résoudre ce genre de problème.On a trois jours, et chaque jours 2 personnes peut se présenter. On Algorithme Mot Caché [ par nuns ] Salut tout le monde,Je voudrais savoir si il y a quelqu ' un qui aurait un générateur de mot Caché, le jeux, avec les grille ou il faut chercher les m algorithme génétique programmé en c# [ par johelle ] slt,je veux savoir si'il ya quelqu'un dans ce forum qui a un programme d'un algorithme g&#233;n&#233;tique en c#et merci. Focus... [ par vxr888 ] Salut &#224; tous,J'ai commenc&#233; &#224; cr&#233;er un application permettant d'entrer une&nbsp;cha&#238;ne de caract&#232;res pr&#233;d&#233;finie utilisation a distance de internet explorer [ par rvmartin ] SalutJe debute en C#.Je voudrais savoir comment&nbsp;recuperer les composants (boutons, zone de texte)&nbsp;d'une page HTML. La page se trouve dans&nb


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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 : 2,527 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é.