-
Notifications
You must be signed in to change notification settings - Fork 0
/
JaroWinklerDistance.act
99 lines (91 loc) · 2.37 KB
/
JaroWinklerDistance.act
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
88
89
90
91
92
93
94
95
96
97
98
99
DEFINE STRING="CHAR ARRAY" ; sys.act
DEFINE ASCII_SpaceBar="32"
INT FUNC JaroWinklerDistance(STRING str1, str2)
STRING Z(15)
INT S1, S2, J, M, N, L, I, K, skip, Max, Min
INT Result
Result=0
S1=str1(0)
S2=str2(0)
IF S1>S2 THEN
SCopy(Z,str1)
SCopy(str1,str2)
SCopy(str2,Z)
M=S1
S1=S2
S2=M
FI
J=1 M=0 N=0 L=S2/2 SCopy(Z,str2)
FOR I=1 TO S1 DO
skip=0
IF str1(I)=str2(J) THEN
M==+1
str2(J)=ASCII_SpaceBar
skip=1
FI
IF skip=0 THEN
Max=1
IF Max<(I-L) THEN Max=I-L FI
Min=S2
IF Min>(I+L-1) THEN Min=I+L-1 FI
FOR K=Max TO Min DO
IF str1(I)=str2(K) THEN
N==+1
M==+1
str2(K)=ASCII_SpaceBar
IF K>J THEN J=K FI
FI
OD
FI
IF J<S2 THEN J==+1 FI
OD
IF M=0 THEN
Result=0 ; jaro distance
ELSE
N=N/2
Result=((M*100)/S1+(M*100)/S2+(((M-N)*100)/M))/3 ; REM jaro distance
FI
Min=S1 IF Min>S2 THEN Min=S2 FI
M=Min IF M>3 THEN M=3 FI
M==+1 L=0 SCopy(str2,Z)
IF M>Min THEN M=Min FI
FOR I=1 TO M DO
IF str1(I)=str2(I) THEN
L==+1
ELSE
EXIT
FI
OD
Result=Result*100 + (((L*100)/10)*(100 - Result)) ; Winkler
Result=(Result+49)/100
RETURN(Result)
PROC MAIN()
INT result
STRING Word_1(15), Word_2(15)
PUT(125)
PUTE()
SCopy(Word_1,"MARTHA") SCopy(Word_2,"MARHTA")
PrintF("%S - %S%E",Word_1,Word_2)
result=JaroWinklerDistance(Word_1,Word_2)
PrintF("Jaro Winkler Distance=%U%E%E",result)
SCopy(Word_1,"DIXON") SCopy(Word_2,"DICKSONX")
PrintF("%S - %S%E",Word_1,Word_2)
result=JaroWinklerDistance(Word_1,Word_2)
PrintF("Jaro Winkler Distance=%U%E%E",result)
SCopy(Word_1,"JELLYFISH") SCopy(Word_2,"SMELLYFISH")
PrintF("%S - %S%E",Word_1,Word_2)
result=JaroWinklerDistance(Word_1,Word_2)
PrintF("Jaro Winkler Distance=%U%E%E",result)
SCopy(Word_1,"KITTEN") SCopy(Word_2,"SITTING")
PrintF("%S - %S%E",Word_1,Word_2)
result=JaroWinklerDistance(Word_1,Word_2)
PrintF("Jaro Winkler Distance=%U%E%E",result)
SCopy(Word_1,"ROSETTACODE") SCopy(Word_2,"RAISETHYSWORD")
PrintF("%S - %S%E",Word_1,Word_2)
result=JaroWinklerDistance(Word_1,Word_2)
PrintF("Jaro Winkler Distance=%U%E%E",result)
SCopy(Word_1,"QWERTY") SCopy(Word_2,"QWERYT")
PrintF("%S - %S%E",Word_1,Word_2)
result=JaroWinklerDistance(Word_1,Word_2)
PrintF("Jaro Winkler Distance=%U%E%E",result)
RETURN