近似社会安全号码匹配搜索算法

时间:2015-05-28 17:28:14

标签: algorithm match autohotkey

我根据客户的社会安全号码编写了一个链接文件的应用程序,但有时客户端错误地写了1或2位数。我可以部署什么算法来返回近似匹配?

正确地我实现了一个外卡功能,如果手写不好,我可以通过数据库进行搜索。但有时手写很好(他们只是错误地写了)。

; Function to get the new SSN
; Keep in mind the searchCount is reset at the end of this function only.
; =============================================================================
GetSSN() {
    Global searchCount
    UserInput = Blank
    Length := StrLen(UserInput)

    while (Length < 9) 
    {
        InputBox, UserInput, Please Enter the SSN,,, 350, 100
        Length := StrLen(UserInput)
    }

    ; Use the SubStr method to extract the first character of the ssn
    firstCharacterOfInput := SubStr(UserInput, 1, 1)

    if (firstCharacterOfInput = 0) {
        StringTrimLeft, UserInput, UserInput, 1
    }

    ; Replace the wild card key "*" with the implementation required "."
    StringReplace, UserInput, UserInput, *,.

    ; Depend if the key contains a wild card, use normal / wild card search
    IfInString, UserInput, . 
    {
        ; MsgBox, WildCardSearch
        mFileName := WildCardSearch(UserInput)
    } else {
        ; MsgBox, NormalSearch
        mFileName := GetFileName(UserInput)
    }

    DrawFileName(mFileName)
    ; Reset searchCount for next time use
    searchCount = 0
}

; Function for wild card implementation
; Reference: http://www.adarshr.com/papers/wildcard
; The implementation used the RegEXMatch Expression
; =============================================================================
WildCardSearch(key) {
    Global dataCount, searchCount, DataBaseArray

    Loop, %dataCount% {
        currentLine := DataBaseArray%searchCount%_1
        FoundPos := RegExMatch(currentLine, key)

        if (FoundPos != 0) {
            result := DataBaseArray%searchCount%_2
            return result
        }
        searchCount += 1
    }

    notFoundMapName = Unable to find the member %A_Now%.jpg
    return notFoundMapName
}

2 个答案:

答案 0 :(得分:3)

一种方法是建立精确查找的近似匹配。将SSN划分为三个字段。如果只有两个错误,则这些字段中至少有一个必须没有错误。因此,构建三个表,每个表允许您检索在其中一个字段上完全匹配的所有SSN。

给定一个近似的SSN,检索三个表中每个表的所有精确匹配,由您将其打入的三个字段编入索引,并检查检索到的SSN以查看其中是否有任何错误不超过两个字符

答案 1 :(得分:0)

检查两个字符串是否几乎相同的一种简单方法是使用levenshtein距离。 http://en.wikipedia.org/wiki/Levenshtein_distance这会返回一个数字,数字越大,两者的差异越大。

唯一的问题是levenshtein需要两个输入来计算距离,因此您无法快速计算数据库中的所有条目。批量执行时算法很昂贵。

当然你可以将它与Mcdowellas的想法结合起来,然后你将音量降低到至少1/1000。