Как найти значения, которые не дублируются на 100%? - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть список людей, получающих помощь от моей организации.

Некоторые регистрируют свои имена с другим правописанием или в другом порядке.

Вот пример

**Names**                       **ID**
Ahmed mohammed Saleh            3576158946          Personal ID  
Waleed Khalid Ali               5478698645          Personal ID
Fatima Nader Aljalal            4684325986          Personal ID
Hussan Huessien Ahmed           778569              Family ID
*Ahmed Mohamed Salah*           698745              Family ID
*Waleed Ali Khalid*             No ID

Последние два в списке зарегистрированы дважды.

У моих данных 4000 строк, и мне нужно найти частичные дубликаты.

1 Ответ

2 голосов
/ 16 февраля 2020

Один из способов уменьшить сложность задачи состоит в том, чтобы иметь sh имен в виде отсортированной строки строчных букв с удаленными дублирующимися символами, пробелами и гласными. Затем вы можете сравнить хэшированные имена, чтобы определить сходство. В приведенном ниже примере нам повезло, что мы получили точные совпадения, но было бы невозможно написать еще одну функцию, которая проверяла бы, отличаются ли хэшированные имена на один, два или более символов, и фактически, что исходные имена были разумным соответствием.

Option Explicit

Private Type State

    CharArray As Variant

End Type

Private s As State


Public Sub test()

    Initialise
    Debug.Print "Ahmed mohammed Saleh", ConvertNameToHash("Ahmed mohammed Saleh")
    Debug.Print "Ahmed Mohamed Salah", ConvertNameToHash("Ahmed Mohamed Salah")
    Debug.Print "Waleed Khalid Ali", ConvertNameToHash("Waleed Khalid Ali")
    Debug.Print "Waleed Ali Khalid", ConvertNameToHash("Waleed Ali Khalid")
End Sub

Public Sub Initialise()

    s.CharArray = Split("b,c,d,f,g,h,j,k,l,m,n,p,q,r,s,t,v,w,x,y,z", ",")

End Sub

Public Function ConvertNameToHash(ByVal ipName As String) As String

    Dim myChars As String
    Dim myName As String 

    myName = LCase$(ipName)
    Dim myChar As Variant
    For Each myChar In s.CharArray

        If InStr(myName, myChar) > 0 Then

            myChars = myChars & myChar

        End If

    Next

    ConvertNameToHash = myChars

End Function

Выход из вышеприведенного кода был

Ahmed mohammed Saleh        dhlms
Ahmed Mohamed Salah         dhlms
Waleed Khalid Ali           dhklw
Waleed Ali Khalid           dhklw
...