Bonjour,
dans le cadre d'un projet OCR, je dois comparer deux string extraites de pages différentes pour retrouver la même zone de texte.
Or je rencontre quelques problèmes dans l'algo permettant de comparer mes strings.
Pour le moment j'ai trouvé un script sur le net qui met mes deux chaines dans un tableau contenant le caractère et l'indice dans la string.
Puis je classe cette string par ordre alphabétique avant de comparer caractère par caractère d'où j'extrais un nombre a ajouter ou a soustraire que selon la comparaison.
Le code : (Désolé c'est du VB.net)
Le probleme est que cela retourne des résultats pas assez précis :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 longStr = Math.Max(chaine1.Length, chaine2.Length) 'Si une des chaines est vide, on considere qu'il n'y a pas de concordance If (String.IsNullOrEmpty(chaine1) Or String.IsNullOrEmpty(chaine2)) Then Return 0 End If Dim ind As Integer = 0 Dim tailleA As Integer = 0 Dim tailleB As Integer = 0 For indexA = 1 To longStr If chaine1.Length >= indexA Then tailleA += 1 PatternA(ind).tableau = New Byte(1) {} PatternA(ind).tableau(0) = Convert.ToByte(chaine1(indexA - 1)) PatternA(ind).tableau(1) = Convert.ToByte(indexA - 1) End If If chaine2.Length >= indexA Then tailleB += 1 PatternB(ind).tableau = New Byte(1) {} PatternB(ind).tableau(0) = Convert.ToByte(chaine2(indexA - 1)) PatternB(ind).tableau(1) = Convert.ToByte(indexA - 1) End If ind += 1 Next indexA = 0 indexB = 0 While (indexA < (tailleA - 1)) AndAlso (indexB < (tailleB - 1)) If tailleA > indexA Then If PatternA(indexA).tableau(0) < PatternA(indexA + 1).tableau(0) Then tpmPattern.tableau(0) = PatternA(indexA).tableau(0) tpmPattern.tableau(1) = PatternA(indexA).tableau(1) PatternA(indexA).tableau(0) = PatternA(indexA + 1).tableau(0) PatternA(indexA).tableau(1) = PatternA(indexA + 1).tableau(1) PatternA(indexA + 1).tableau(0) = tpmPattern.tableau(0) PatternA(indexA + 1).tableau(1) = tpmPattern.tableau(1) If indexA > 0 Then indexA -= 1 End If Else indexA += 1 End If End If If tailleB > indexB Then If PatternB(indexB).tableau(0) < PatternB(indexB + 1).tableau(0) Then tpmPattern.tableau(0) = PatternB(indexB).tableau(0) tpmPattern.tableau(1) = PatternB(indexB).tableau(1) PatternB(indexB).tableau(0) = PatternB(indexB + 1).tableau(0) PatternB(indexB).tableau(1) = PatternB(indexB + 1).tableau(1) PatternB(indexB + 1).tableau(0) = tpmPattern.tableau(0) PatternB(indexB + 1).tableau(1) = tpmPattern.tableau(1) If indexB > 0 Then indexB -= 1 End If Else indexB += 1 End If End If End While ' Calculating simularity percentage longStr = Math.Min(tailleA, tailleB) For indexA = 0 To (longStr - 1) If PatternA(indexA).tableau(0) = PatternB(indexA).tableau(0) Then Dim tp2 As Byte = Math.Min(PatternA(indexA).tableau(1), PatternB(indexA).tableau(1)) Dim tp1 As Byte = Math.Max(PatternA(indexA).tableau(1), PatternB(indexA).tableau(1)) If (tp1 - tp2) > 0 Then Dim nombre As Decimal = (100 / longStr) / (Math.Max(PatternA(indexA).tableau(1), PatternB(indexA).tableau(1)) - Math.Min(PatternA(indexA).tableau(1), PatternB(indexA).tableau(1))) result = result - (Convert.ToInt32(nombre)) Else If result < 100 Then result += (Convert.ToInt32(100 / longStr)) End If End If Else result = result - (Convert.ToInt32(100 / longStr)) End If Next
exemple :
TEST -- Attendu : EDFPOURLESENTREPRISES -- Trouve : EDFPOURLESEMREPRNSES -- Correspondance : 57%
TEST -- Attendu : EDFPOURLESENTREPRISES -- Trouve : EDFPOURLESEMREPRISES -- Correspondance : 58%
TEST -- Attendu : EDFPOURLESENTREPRISES -- Trouve : EDFPOURLASENTRSPRISES -- Correspondance : 53%
TEST -- Attendu : TOTALFACTURE -- Trouve : TOTALFACTURS -- Correspondance : <80%
J'ai remarqué sur ce dernier exemple que le E va etre dans les premieres cases une fois classée par ordre alphabétique et va donc décaler l'ensemble de la comparaison, d'ou un pourcentage trop faible.
Auriez vous quelques solutions/idées pour améliorer le pourcentage retourné?
Est ce que je devrais supprimer ce tri par ordre alphabétique? Le probleme de cette solution est que l'ajout d'un caractère va decaler toutes mes comparaisons...
Merci de vos suggestions.
Partager