1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| '-------------------------------------------------------------------------------------------------------------------------------
' Ressemblance de chaines
Public Function Ressemblance(ByVal Chaine1 As String, ByVal Chaine2 As String) As Single
'Cette fonction renvoi un pourcentage de ressemblance entre deux chaines.
'
'Tests effectués :
' Tests à 3 et 2 lettres
' On compare le Chaine1 avec le Chaine2 puis inversement en prenant que des groupes de lettres
' Tests à 1 lettres
' On compare les mots lettre par lettre pour les deux possibilites de comparaison
' ainsi, si on trouve "tard" dans "tardivement", l'inverse n'est pas vrai
'
'Ex : si "picole" et "police" donne un tres bon resultat sur les tests à 1 lettre
' le resultat est plus mauvais pour les tests à 2 et 3 lettres
'
'Attention :
'La somme des coef donne 100% (ou 1) : 0.10 + 0.10 + 0.15 + 0.15 + 0.25 + 0.25 = 1
'-------------------------------------------------------------------------------------
Chaine1 = LCase(Trim(Chaine1))
Chaine2 = LCase(Trim(Chaine2))
'Tests avec 3 lettres 20%
Ressemblance = Ressemblance + (CalcTaux(Chaine1, Chaine2, 3) * 0.1)
Ressemblance = Ressemblance + (CalcTaux(Chaine2, Chaine1, 3) * 0.1)
'Tests avec 2 lettres 30%
Ressemblance = Ressemblance + (CalcTaux(Chaine1, Chaine2, 2) * 0.15)
Ressemblance = Ressemblance + (CalcTaux(Chaine2, Chaine1, 2) * 0.15)
'Tests avec 1 lettre 50%
Ressemblance = Ressemblance + (CalcTaux(Chaine1, Chaine2, 1) * 0.25)
Ressemblance = Ressemblance + (CalcTaux(Chaine2, Chaine1, 1) * 0.25)
Ressemblance = Round(Ressemblance, 2)
End Function
Private Function CalcTaux(ByVal Chaine1 As String, ByVal Chaine2 As String, ByVal Precision As Integer) As Single
' Chaine1 et Chaine2 : les chaines a comparer
' Precision : nombre de caracteres pour les comparaisons
Dim Cpt As Integer
Dim NbOk As Integer
Dim NbTests As Integer
Dim Test As String
NbOk = 0
NbTests = 0
For Cpt = 1 To Len(Chaine2)
'Test si le morceau de Chaine2 est dans Chaine1
Test = Mid(Chaine2, Cpt, Precision)
If Len(Test) = Precision Then
NbTests = NbTests + 1
If InStr(Chaine1, Test) <> 0 Then NbOk = NbOk + 1
End If
Next
If NbTests = 0 Then
CalcTaux = 0
Else
CalcTaux = (NbOk / NbTests) * 100
End If
End Function |
Partager