我一直在使用Double Metaphone和Caverphone2进行字符串比较,他们在名称,地址等方面做得很好(Caverphone2最适合我)。但是,当您获得数字值时,例如电话号码,IP地址,信用卡号等,它们会产生太多的误报。
所以我查看了Luhn和Verhoeff算法,它们基本上描述了我想要的,但并不完全。他们似乎擅长验证,但似乎并不是为模糊匹配而构建的。有什么行为像Luhn和Verhoeff,它可以检测到涉及两个相邻数字的单位错误和换位错误,用于编码和比较目的,类似于模糊字符串算法?
我想对一个数字进行编码,然后将其与100,000个其他数字进行比较,以找到完全相同的匹配。因此像7041234这样的东西会与7041324相匹配,因为它可能是转录错误,但像4213704这样的东西不会。
答案 0 :(得分:3)
Levenshtein and friends可能有助于找到特定字符串或数字之间的距离。但是,如果要构建拼写纠正器,则不希望在每次查询时都运行整个word数据库。
Peter Norvig根据谷歌拼写建议背后的一些技术,在一个简单的“模糊匹配”拼写纠正器上写了a very nice article。
如果您的词典中包含N
个词条,并且平均词的长度为L
,则“蛮力Levenshtein”方法需要时间O(N*L^3)
。相反,Peter Norvig的方法会在输入的某个编辑距离内生成所有单词,并在字典中查找它们。因此它达到O(L^k)
,其中k是考虑的最远编辑距离。