begin process at 2008 08 22 00:52:42
1 229 731 membres
3 nouveaux aujourd'hui
14 267 membres club

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 !

FONCTION RENVOYANT LE POURCENTAGE DE SIMILITUDE ENTRE 2 CHAINES


Information sur la source

Catégorie :Texte Classé sous : comparaison, similitude, ressemblance Niveau : Débutant Date de création : 18/08/2006 Date de mise à jour : 18/08/2006 13:49:19 Vu : 3 992

Note :
Aucune note

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

Description

On peut être amener a effectuer une recherche de chaine sans être sûr de l'orthographe de la chaine recherchée. Cette fonction retourne un pourcentage de ressemblance entre 2 chaines, et ainsi vous pouvez fournir des résultats plus ou moins proche de la chaine recherchée. J'ai utilisé ce code dans un petit utilitaire de recherche de chaines dans des fichiers.

Source

  • // ----------------------------------------------------------------------------------------
  • Function ComparerChaines(s1,s2:String):Integer;
  • { Fonction comparaison chaînes de texte:
  • Entrée:
  • S1 = première chaîne a comparer, taille limitée a 2048 caractères
  • S2 = deuxième chaîne a comparer, taille limitée a 2048 caractères
  • Sortie:
  • INTEGER, de 0 a 100, % de ressemblance entre les 2 chaînes }
  • Var identiques, // Nombre de caractères identiques
  • p1,p2, // Indicateurs de position
  • l1,l2, // Longueurs des chaînes
  • pt, // Compteur de boucle
  • diff : Integer; // Facteur d égalisation
  • hstr : String; // Variable temporaire d échange des chaînes
  • test : Array [1..2048] Of Boolean; // Tableau d indicateur pour suivre les positions déjà testées
  • Begin
  • // Tester les longueurs et échanger si S1 est plus courte, on teste toujours par rapport a la chaîne la plus longue
  • If Length(s1)<Length(s2) Then Begin
  • hstr := s2;
  • s2 := s1;
  • s1 := hstr;
  • End;
  • // Stocker les longueurs des chaînes
  • l1 := Length(s1);
  • l2 := Length(s2);
  • // Une chaîne a vide ? alors la comparaison est de 0%
  • If (l1=0) Or (l2=0) Then
  • Result := 0
  • Else Begin
  • p1 := 1;
  • p2 := 1;
  • identiques := 0;
  • // Calculer le facteur d égalisation dépendant de la longueur de la chaîne, en général c est 1/3 de la longueur maximale
  • diff := Max(l1,l2) Div 3 + Abs(l1-l2);
  • // Initialiser le tableau de suivi
  • For pt := 1 To l1 Do
  • test[pt] := False;
  • // Parcours de la chaîne
  • Repeat
  • // Position testée ?
  • If Not test[p1] Then Begin
  • // Caractère identique ?
  • If (s1[p1]=s2[p2]) And (Abs(p1-p2)<=diff) Then Begin
  • test[p1] := True;
  • // Augmenter le compteur de caractères identiques
  • Inc(identiques);
  • // Positions suivantes
  • Inc(p1);
  • Inc(p2);
  • // Boucler
  • If p1>l1 Then p1:=1;
  • End Else Begin
  • Test[p1] := False;
  • Inc(p1);
  • // Boucler a la prochaine position de test si on arrive a la fin de la chaîne
  • If p1>l1 Then Begin
  • While (p1>1) And Not (test[p1]) Do
  • Dec(p1);
  • Inc(p2)
  • End;
  • End;
  • End Else Begin
  • Inc(p1);
  • // Boucler a la prochaine position de test si on arrive a la fin de la chaîne
  • If p1>l1 Then Begin
  • Repeat
  • Dec(p1);
  • Until (p1=1) Or test[p1];
  • Inc(p2);
  • End;
  • End;
  • Until p2>Length(s2);
  • // Calculer la valeur en pourcentage
  • Result := 100 * identiques Div l1;
  • End;
  • End;
// ----------------------------------------------------------------------------------------
Function ComparerChaines(s1,s2:String):Integer;
{ Fonction comparaison chaînes de texte:
  Entrée:
    S1 = première chaîne a comparer, taille limitée a 2048 caractères
    S2 = deuxième chaîne a comparer, taille limitée a 2048 caractères
  Sortie:
    INTEGER, de 0 a 100, % de ressemblance entre les 2 chaînes }
Var identiques,                        // Nombre de caractères identiques
    p1,p2,                             // Indicateurs de position
    l1,l2,                             // Longueurs des chaînes
    pt,                                // Compteur de boucle
    diff : Integer;                    // Facteur d égalisation
    hstr : String;                     // Variable temporaire d échange des chaînes
    test : Array [1..2048] Of Boolean; // Tableau d indicateur pour suivre les positions déjà testées
Begin
  // Tester les longueurs et échanger si S1 est plus courte, on teste toujours par rapport a la chaîne la plus longue
  If Length(s1)<Length(s2) Then Begin
    hstr := s2;
    s2   := s1;
    s1   := hstr;
  End;
  // Stocker les longueurs des chaînes
  l1 := Length(s1);
  l2 := Length(s2);
  // Une chaîne a vide ? alors la comparaison est de 0%
  If (l1=0) Or (l2=0) Then
    Result := 0
  Else Begin
    p1         := 1;
    p2         := 1;
    identiques := 0;
    // Calculer le facteur d égalisation dépendant de la longueur de la chaîne, en général c est 1/3 de la longueur maximale
    diff       := Max(l1,l2) Div 3 + Abs(l1-l2);
    // Initialiser le tableau de suivi
    For pt := 1 To l1 Do
      test[pt] := False;
    // Parcours de la chaîne
    Repeat
      // Position testée ?
      If Not test[p1] Then Begin
        // Caractère identique ?
        If (s1[p1]=s2[p2]) And (Abs(p1-p2)<=diff) Then Begin
          test[p1] := True;
          // Augmenter le compteur de caractères identiques
          Inc(identiques);
          // Positions suivantes
          Inc(p1);
          Inc(p2);
          // Boucler
          If p1>l1 Then p1:=1;
        End Else Begin
          Test[p1] := False;
          Inc(p1);
          // Boucler a la prochaine position de test si on arrive a la fin de la chaîne
          If p1>l1 Then Begin
            While (p1>1) And Not (test[p1]) Do
              Dec(p1);
            Inc(p2)
          End;
        End;
      End Else Begin
        Inc(p1);
        // Boucler a la prochaine position de test si on arrive a la fin de la chaîne
        If p1>l1 Then Begin
          Repeat
            Dec(p1);
          Until (p1=1) Or test[p1];
          Inc(p2);
        End;
      End;
    Until p2>Length(s2);
    // Calculer la valeur en pourcentage
    Result := 100 * identiques Div l1;
  End;
End;
18 août 2006 13:49:20 :
Bogue de la colorisation syntaxique, si un simple quote (') est présent dans une ligne de simple commentaire (//)
  • signaler à un administrateur
    Commentaire de flo160fr le 19/08/2006 12:11:10

    Ton code a l'air intéressant, je le regarderai plus en détaille en rentrant de vaccance...
    Il va surment m'être utile pour la recherche dans les fichiers d'aide

    Bonne continuation ;)

  • signaler à un administrateur
    Commentaire de f0xi le 21/08/2006 02:28:20 administrateur CS

    pour eviter les bugs de colorisation il faut mettre les commentaires entre {} et non //

  • signaler à un administrateur
    Commentaire de gbourgeois0019 le 11/11/2007 20:01:30

    Le code marche super bien si les deux chaines diffèrent a leurs extrémité droite. Par contre si on change seulement la premiere lettre, on a automatiquement un resultat de 0 %.

Ajouter un commentaire

Pub



Appels d'offres

Snippets en rapport

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS