Comparaison entre 2 chaines, retourne un pourcentage de ressemblance (dupont = 66,67% de durand)

Soyez le premier à donner votre avis sur cette source.

Vue 18 024 fois - Téléchargée 811 fois

Description

Bonjour,

Je vous met là à disposition un fonction qui vous renvoie un pourcentage de similitude entre 2 chaînes de caractères passées en argument.

Cette fonction est l'implémentation d'un modèle mathématiques (Ratcliff, Obershelp, Levenshtein), et utilise une sous-routine.

Vous savez tout, vous trouverez dans l'archive jointe un projet de démonstration.

Source / Exemple :


'Code à coller dans un module
'La fonction s'utilise en appelant la seule procédure publique disponible, Comparer

'implémentation de la méthode de Ratcliff, Obershelp, Levenshtein

Private Declare Sub RtlMoveMemory Lib "kernel32" (Destination As Any, Source As Any, ByVal Length As Long)
Private b1() As Byte
Private b2() As Byte

Public Function Comparer(ByVal string1 As String, ByVal string2 As String) As Double
  Dim len1 As Long
  Dim len2 As Long
  string1 = UCase$(string1)
  string2 = UCase$(string2)
  If string1 = string2 Then
    Comparer = 1
  Else
    len1 = Len(string1)
    len2 = Len(string2)
    ReDim b1(1 To len1)
    ReDim b2(1 To len2)
    RtlMoveMemory b1(1), ByVal string1, len1
    RtlMoveMemory b2(1), ByVal string2, len2
    Comparer = SubSim(1, len1, 1, len2) / (len1 + len2) * 2
  End If
End Function

Private Function SubSim(st1 As Long, end1 As Long, st2 As Long, end2 As Long) As Long
  If Not (st1 > end1 Or st2 > end2 Or st1 <= 0 Or st2 <= 0) Then
    Dim c1 As Long
    Dim c2 As Long
    Dim ns1 As Long
    Dim ns2 As Long
    Dim i As Long
    Dim max As Long
    For c1 = st1 To end1
      For c2 = st2 To end2
        i = 0
        Do Until b1(c1 + i) <> b2(c2 + i)
          i = i + 1
          If i > max Then
            ns1 = c1
            ns2 = c2
            max = i
          End If
          If c1 + i > end1 Or c2 + i > end2 Then Exit Do
        Loop
      Next c2
    Next c1
    SubSim = max + SubSim(ns1 + max, end1, ns2 + max, end2) + SubSim(st1, ns1 - 1, st2, ns2 - 1)
  End If
End Function

Conclusion :


Merci de laisser vos commentaires, optimisations s'il y a lieu (ça me semble au top du plus du plus du plus rapide... mais bon, il y a toujours mieux... enfin peut-être !).
Si vous connaissez des fonctions du même genre, présentez les moi, je vous en serais gré !

@+
Celiphane

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
dimanche 21 mars 2010
Statut
Membre
Dernière intervention
1 septembre 2010

Bonjour Celiphane,
je vois que ton post date de très longtemps. Om me propose d'utiliser ta macro dans une recherche de doublons sur un fichier qui doit contenir à terme 33000 lignes qui correspondent à des noms-prénoms-date de naissance et autres. j'ai déja créer la chaine de caractères à comparer.
Comment penses-tu que l'on pourrais adapter ta macro ou est-il réaliste de l'tuliser vu qu'il devrait calculer environ 500 millions de taux et les ressortir.
Merci de pourvoir me répondre si possible.
Merci d'avance
Messages postés
1
Date d'inscription
mardi 19 avril 2005
Statut
Membre
Dernière intervention
19 avril 2005

Salut,

j'aimerais bien implémenter cette fonction en C++ car c'est exactement ce que j'ai besoin. Si tu sais où je pourrais trouver le code déja fait ce serait cool, sinon j'aimerais bien avoir le pseudo code de ta fonction car le VB c'est pas ma branche. Connais-tu la méthode Oliver93, celle utilisée pour la fonction similar_text() de php et qui permet de trouver un pourcentage de similitude entre 2 chaînes de caractères?

Merci
@+
Messages postés
466
Date d'inscription
samedi 16 février 2002
Statut
Membre
Dernière intervention
20 avril 2007

C'est clair que de toute facon ça n'a rien à voir... je vois pas pourquoi d'ailleurs tu est venu sur cette source (la mienne)

;-)

Ici, c'est pour comparer le pourcentage de similitude entre 2 chaines de caractères lol

Enfin, je suis content pour toi que tu ais trouvé ton bonheur...
@+
Celiphane
Messages postés
145
Date d'inscription
mardi 3 septembre 2002
Statut
Membre
Dernière intervention
24 février 2008

j'ai trouver

apres qq modif ça me convient tres bien

ce que g trouver:
http://www.vbfrance.com/code.aspx?ID=5917
Messages postés
466
Date d'inscription
samedi 16 février 2002
Statut
Membre
Dernière intervention
20 avril 2007

mon dieu mon dieu...
nan c'est pas fait pour les images. <-(

Encore que, avec un tout petit peu d'effort, en transformant les images en 256 couleurs, en mettant chaque octets de l'une dans le tableau b1 et pareil pour l'autre dans b2,

on puisse peut-être obtenir un pourcentage de ressemblance entre les 2 images... à essayer... personnellement je le ferais facilement mais j'en ai pas le temps... ni l'envie, ni le besoin d'ailleurs (ce qui concorde peut-être avec le fait que j'ai pas le temps ?)

@+
Celiphane
Afficher les 11 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.