【问题标题】:How to find values that aren't 100% duplicated?如何找到不是 100% 重复的值?
【发布时间】:2020-05-31 10:34:17
【问题描述】:

我有一份从我的组织获得援助的人员名单。

有些人用不同的拼写或不同的顺序注册他们的名字。

这是一个例子

**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 行,我必须找到部分重复。

【问题讨论】:

  • 没那么容易,你必须定义拼写检查器,你必须定义哪个拼写错误,哪个拼写正确。
  • 您是否尝试过使用 Excel 中内置的“查找重复项”选项?它会突出显示重复项,因此任何未突出显示的内容都不是重复项......但最后,如果它们的拼写不同,那么根据定义它们不是重复项。
  • 有两个问题。一种是像 Waleed Khalid Ali 和 Waleed Ali Khaled 这样的并置。对于这些,您需要建立需要为人类标记的规则。例如,突出显示“如果第一个相同并且第二个和第三个相同”。另一个是拼音。 "Mhmd" 可以使用 Regix 识别 *Mohammed 或 Mohamed 或 mohamad。两个系统需要相互并行应用。
  • 您可以通过将名称视为字符的集合来取得一些进展。

标签: excel vba duplicates


【解决方案1】:

降低任务难度的一种方法是将名称散列为小写字符的排序字符串,删除重复字符、空格和元音。然后,您可以比较散列名称以确定相似性。在下面的示例中,我们很幸运得到了完全匹配,但编写一个进一步的函数来检查散列名称是否相差一个、两个或多个字符,并且实际上原始名称是合理的匹配,这并非不可能。

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

【讨论】:

    猜你喜欢
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2017-06-10
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    相关资源
    最近更新 更多