============================================================================================= -- ************Purpose : AMIN for Devanagari -- ************Developed by : Technical Team Election, Commission of India, New Delhi. --============================================================================================== '*************************************** 'Algorithm for Devanagari Names '*************************************** Function AMIN_Devanagari(ByVal str1 As String, ByVal str2 As String) Dim d(Len(str1), Len(str2)) As Decimal Dim i As Integer Dim j As Integer ReDim Preserve source(str1.Length + 1) ReDim Preserve target(str2.Length + 1) 'Building source array source(0) = "#" For i = 1 To str1.Length source(i) = str1.Substring(i - 1, 1) Next source(str1.Length + 1) = "!" '########################## 'Building Target array target(0) = "#" For i = 1 To str2.Length target(i) = str2.Substring(i - 1, 1) Next target(str2.Length + 1) = "!" '########################## Dim cost As Integer Dim len1 As Integer = str1.Length Dim len2 As Integer = str2.Length Dim SimplificationCost As Decimal For i = 0 To len1 d(i, 0) = i Next For j = 0 To len2 d(0, j) = j Next For i = 1 To len1 For j = 1 To len2 Dim values(2) As Decimal values(0) = d(i - 1, j) + costInsertDelete_Devanagari(source(i), source(i - 1), source(i + 1)) 'cost deletion values(1) = d(i, j - 1) + costInsertDelete_Devanagari(target(j), target(j - 1), target(j + 1)) 'cost insertion values(2) = d(i - 1, j - 1) + costsubstitution_Devanagari(source(i), target(j)) 'cost substitution d(i, j) = Min(values) Next Next Dim intdist As Decimal intdist = d(len1, len2) source.Clear(source, 0, source.Length) target.Clear(target, 0, target.Length) Return intdist End Function Private Function costInsertDelete_Devanagari(ByVal thischar As Char, ByVal prevchar As Char, ByVal nextchar As Char) 'Cost Insertion for the Target Character or deletion of source character If AscW(thischar) < 2305 Or AscW(thischar) > 2416 Then Return 0.0 ElseIf (thischar = prevchar) Then Return 0.25 ElseIf Regex.IsMatch(thischar, "[्]") Then If prevchar = "र" Then Return 0.05 End If Return 0.1 ElseIf Regex.IsMatch(thischar, "[ँं]") Then Return 0.1 End If If IsDependentVowel(thischar) Then Return 0.25 ElseIf IsHindiConsonant(thischar) Then Return 1.0 Else ' MATRA etc. Return 0.75 End If End Function Private Function costsubstitution_Devanagari(ByVal chr1 As Char, ByVal chr2 As Char) As Decimal If chr1 = chr2 Then Return 0.0 End If Select Case chr1 & chr2 Case "ँं", "ंँ" Return 0.05 Case "िी", "ीि", "ूु", "ुू", "ोौ", "ौो", "ेै", "ैे", "लळ", "ळल", "ज" & ChrW(2395), ChrW(2395) & "ज" Return 0.1 Case "सश", "शस", "सष", "षस", "शष", "षश", "ओऔ", "औओ", "अआ", "आअ", "इई", "ईइ", "उऊ", "ऊउ", "एऐ", "ऐए" Return 0.15 Case "नण", "णन", "नं", "ंन", "नँ", "ँन", "ंण", "णं", "ँण", "णँ", "नञ", "ञन", "णञ", "ञण", "ंञ", "ञं", "ँञ", "ञँ" Return 0.15 Case "यइ", "इय" Return 0.25 Case "बव", "वब", "वभ", "भव", "बभ", "भब" Return 0.3 Case "रड", "डर", "पफ", "फप", "शछ", "छश" Return 0.4 Case "जय", "यज", "तट", "टत" Return 0.5 Case Else Return 1.0 End Select End Function Private Function IsDependentVowel(ByVal chr As Char) As Boolean IsDependentVowel = False If AscW(chr) > 2365 And AscW(chr) < 2381 Then Return True End Function Private Function IsIndependentVowel(ByVal chr As Char) As Boolean IsIndependentVowel = False If AscW(chr) > 2308 And AscW(chr) < 2325 Then Return True End Function Private Function IsHindiConsonant(ByVal chr As Char) As Boolean IsHindiConsonant = False If AscW(chr) > 2324 And AscW(chr) < 2362 Then Return True End Function