我根据客户的社会安全号码编写了一个链接文件的应用程序,但有时客户端错误地写了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
}
答案 0 :(得分:3)
一种方法是建立精确查找的近似匹配。将SSN划分为三个字段。如果只有两个错误,则这些字段中至少有一个必须没有错误。因此,构建三个表,每个表允许您检索在其中一个字段上完全匹配的所有SSN。
给定一个近似的SSN,检索三个表中每个表的所有精确匹配,由您将其打入的三个字段编入索引,并检查检索到的SSN以查看其中是否有任何错误不超过两个字符
答案 1 :(得分:0)
检查两个字符串是否几乎相同的一种简单方法是使用levenshtein距离。 http://en.wikipedia.org/wiki/Levenshtein_distance这会返回一个数字,数字越大,两者的差异越大。
唯一的问题是levenshtein需要两个输入来计算距离,因此您无法快速计算数据库中的所有条目。批量执行时算法很昂贵。
当然你可以将它与Mcdowellas的想法结合起来,然后你将音量降低到至少1/1000。